Maskinöversättning · Engelskt original
Streaming Diktation
Parakeet-EOU-120M är en liten RNN-T streaming ASR modell med en explicit end-of-utterance (EOU) huvud, byggd för realtid diktation på Apple Silicon Neural Engine. Denna guide täcker också DictateDemo, macOS meny-bar referens app som trådar streaming modell tillsammans med Silero VAD för handsfree, paste-anywhere diktation.
Vad det är
- Live partials - textuppdateringar som du talar, ~340 ms efter varje bit
- Explicit EOU - modellen bestämmer när ett yttrande slutar, ingen manuell knapp
- VAD-driven kraftfinalisera -- Silero backstop begår yttranden även när EOU stannar på bakgrundsljud
- 120 MB INT8 CoreML - körs på Neural Engine, lämnar GPU gratis för andra modeller
- 25 europeiska språk - samma ordförrådsfamilj som uppströms NeMo Parakeet TDT
Arkitektur
Tre CoreML modeller pipelined per audio chunk:
| Komponent | Beskrivning |
|---|---|
| Encoder | Cache-aware Conformer. Ta en 64-rams mel chunk (640 ms) plus sex statliga tensorer - uppmärksamhet KV cache, genast konv cache och en pre_cache mel loopback som prepends senaste-förflutet ljud så FFT ser kontinuerlig signal över chunk gränser. |
| Decoder | Single-steg LSTM-prediktionsnätverk. Konsumerar den tidigare icke-blank-token, avger en inbäddning plus uppdaterad (h, c)-status. |
| Joint + EOU huvud | Fuses kodare och avkodare utgångar i logiter över vocab + blank + EOU. EOU-klassen är modellens hårda signal att en yttrande är klar. |
Varför en separat EOU-token
Plain RNNT avger tomma under tystnad, som avkodaren glatt absorberar utan att signalera "utterance färdig." Ett dedikerat EOU-huvud låter modellen göra en hård nedskärning för att begå partiell till en slutlig, återställa punktering / kapitalisering tillstånd och utlösa nedströms åtgärder som pasta-till-app.
Tangentbordsklick, musrörelse och rumston under en "tyst" paus kan göra det gemensamma ibland avger en icke-svart token, återställa EOU-avstängningstimer och stoppa begåvningen. Produktionsledningar parar den gemensamma EOU med en extern VAD-driven forceEndOfUtterance() backstop - se DictateDemo nedan.
Modell
| Modell | Storlek | HuggingFace |
|---|---|---|
| Parakeet-EOU-120M (CoreML INT8) | 120 MB | aufklarer/Parakeet-EOU-120M-CoreML-INT8 |
Prestanda
| Metric | Värde |
|---|---|
| Viktminne | ~120 MB (INT8) |
| Peak inference minne | ~200 MB |
| Chunk latency (M-serie) | ~30 ms compute / 640 ms ljud (RTF ~0.056) |
| Partiell latens end-to-end | ~340 ms (en bit) |
| Begå latens (VAD väg) | ~1 s efter att tal stannar |
| Beräkningsmål | Neural Engine (CoreML) |
Snabbstart - batch transcription
Den streaming modellen överensstämmer också med SpeechRecognitionModel, så det fungerar som en drop-in för alla kod som tar en generisk STT-modell:
import ParakeetStreamingASR
let model = try await ParakeetStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000)
Snabbstart - Async streaming
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000) {
if partial.isFinal { print("FINAL: \(partial.text)") }
else { print("... \(partial.text)") }
}
Var och en PartialTranscript Bilder från text, isFinal, confidence, eouDetected (gemensamt sparkat vs force-finalized), och en monotonic segmentIndex.
Långlivad session API (mikinput)
För levande diktation, skapa en session en gång och mata det bitar när de kommer från mikrofonen. sessionen buffrar internt och kör kodaren när tillräckligt med prover ackumuleras, så att du kan trycka godtyckliga bitar storlekar:
let session = try model.createSession()
// each mic chunk:
let partials = try session.pushAudio(float32Chunk16kHz)
for p in partials {
if p.isFinal { commit(p.text) }
else { showPartial(p.text) }
}
// when the stream ends:
let trailing = try session.finalize()
VAD kraftfinalisera mönster
När en Silero VAD redan körs i din pipeline, använd den för att driva en nedgång begå så bakgrundsljud kan inte stoppa EOU-avstängningstimern:
if hasPendingUtterance && !vadSpeechActive && vadSilentChunks >= 30 {
// ~960 ms of sustained silence per Silero
if let forced = session.forceEndOfUtterance() {
commit(forced.text)
}
hasPendingUtterance = false
}
// guardrail: don't double-commit if joint already fired EOU
if partials.contains(where: { $0.isFinal }) {
hasPendingUtterance = false
}
DictateDemo - macOS meny-bar referens app
DictateDemo är en komplett macOS meny-bar agent byggd ovanpå streamingsessionen. Den körs som en bakgrundsapp, transkriberar från mic med levande partialer, auto-commits yttranden på EOU eller VAD tystnad och pastor resulterar i den främre appen.
- Menu-bar app med global
Cmd+Shift+Dhotkey - Levande partialer med flytande HUD- och ljudnivåindikator
- VAD-bevakad kraftfinalisering (produktionsmönstret ovan)
- Paste-to-front-app med
Cmd+Shift+V - Modell auto-downloads på första lanseringen (~ 120 MB)
cd Examples/DictateDemo
swift build
.build/debug/DictateDemo
Det fullständiga genomförandet lever i Examples/DictateDemo/DictateDemo/DictateViewModel.swift: en off-main ljudsänka med en låsskyddad buffert, en 300 ms timer tick som dränerar den, Silero VAD med överbliven-sampel överföring, och en bevakad kraftfinalisera. De matchande regressionstesterna i Examples/DictateDemo/Tests/DictateDemoTests.swift täcka multi-utterance, fast-EOU och bullriga tystnadsscenarier.
Streaming vs batch Parakeet
| Parakeet-EOU-120M (streaming) | Parakeet TDT 0.6B (batch) | |
|---|---|---|
| Använd fall | Levande diktation, realtidsinlämning | Fil transkription, offline jobb |
| Decoder | RN-T + EOU-huvudet | Token-and-Duration Transducer |
| Chunk storlek | 640 ms streaming | Helfile batch |
| Viktminne | 120 MB | 500 MB |
| Genomströmning | ~18x realtid | ~32x realtid |
| Latency | ~340 ms partiella | End-of-file endast |
...du behöver partiella innan användaren slutar tala. För batch transkription av ljudfiler, den större Parakeet TDT 0.6B är snabbare änden och mer exakt. De två modellerna delar samma SentencePiece ordförråd, så att du kan byta mellan dem utan att ändra tokenization.