Maskinoversettelse · Engelsk original
Streaming Dictation
Parakeet-EOU-120M er en liten RNN-T streaming ASR-modell med en eksplisitt slutt-av-utterance (EOU)-hode, bygget for sanntidsdiktering på Apple Silicons Neural Engine. Denne guiden dekker også DiktateDemo, macOS-referenceappen for menybar som ledninger streamingmodellen sammen med Silero VAD for hender-fri, paste- hvor som helst-dektering.
Hva det er
- Live partiells - tekstoppdateringer som du snakker, ~340 ms etter hver del
- Explicit EOU - modell bestemmer når en uttalelse slutter, ingen manuell knapp
- VAD-drevet kraft-finalize — Silero bakstopp forplikter seg til å uttrykke selv når EOU stopper på bakgrunnsstøy
- 120 MB INT8 CoreML - kjører på Neural Engine, etterlater GPU gratis for andre modeller
- 25 Europeiske språk — samme ordforrådsfamilie som oppstrøms NeMo Parakeet TDT
Arkitektur
Tre CoreML modeller rørt per lydbit:
| Komponent | Beskrivelse |
|---|---|
| Koder | Cache-aware Conformer. Tar en 64-rammes melbit (640 ms) pluss seks tilstandstrekkere - oppmerksomhet KV-buffer, dybdevis konv-buffer, og en pre_cache mel løkkeback som tillater nylig past-lyd slik at FFT ser kontinuerlig signal på tvers av bitgrenser. |
| Dehydrering | Enkelttrinns LSTM-prediksjonsnettverk. Inneholder det forrige ikke-blank-token, sender ut en innebygd pluss oppdatert (h, c)-tilstand. |
| Felles + EOU-hode | Fuser koder og dekoder ut i logger over vocab + blank + EOU. EOU klassen er modellens harde signal om at en uttalelse er ferdig. |
Hvorfor et separat EOU-token
Plain RNNT sender ut blanker under stillhet, som dekoderen lykkelig absorberer uten å signalisere -utterance ferdig - Et dedikert EOU-hode lar modellen gjøre et hardt kutt for å forplikte partiell til en endelig, omstilling av tegnsetting/kapitaliseringstilstand, og utløse nedstrømshandlinger som paste-til-app.
Tastaturklikk, musebevegelse og romtone under en \"silent\" pause kan gjøre leddet av og til utsender en ikke-blank token, omsetter EOU debounce timer og stepping av forpliktelsen. Produksjonsrørledninger par den felles EOU med en ekstern VAD-drevet forceEndOfUtterance() backstop - se DictateDemo nedenfor.
Modell
| Modell | Størrelse | HuggingFace |
|---|---|---|
| Parakeet-EOU-120M (CoreML INT8) | ~120 MB | aufklarer/Parakeet-EOU-120M-CoreML-INT8 |
Ytelse
| Metrisk | Verdi |
|---|---|
| Vektminne | ~120 MB (INT8) |
| Peak inferens minne | ~ 200 MB |
| Chunk latency (M-serien) | ~30 ms beregne / 640 ms lyd (RTF ~0.056) |
| Delvis latens end-to-end | ~ 340 ms (en bit) |
| Legg til latens (VAD bane) | ~ 1 s etter tale stopper |
| Beregne målet | Neural Engine (CoreML) |
Rask start - batch trankripsjon
Streamingmodellen er også i samsvar med SpeechRecognitionModel, så den fungerer som en drop-in for hvilken som helst kode som tar en generisk STT-modell:
import ParakeetStreamingASR
let model = try await ParakeetStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000)
Rask start — async streaming
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000) {
if partial.isFinal { print("FINAL: \(partial.text)") }
else { print("... \(partial.text)") }
}
Hver PartialTranscript bære text, isFinal, confidence, eouDetected (Samlaget sparket vs force-finalized) og en monoton segmentIndex.
Langlivet økt API (mic input)
For live dikting, opprette en økt en gang og mate den biter når de kommer fra mikrofonen. Sessionsbuffere internt og kjører koderen når nok prøver akkumuleres, slik at du kan presse vilkårlige bitstørrelser:
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 force-finalize mønster
Når en Silero VAD allerede kjører i rørledningen din, bruk den til å kjøre et reservebeløp, slik at bakgrunnsstøyen ikke kan stoppe EOU-avslå timeren:
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
}
DiktateDemo — macOS menylinjen referanse app
DiktateDemo er en komplett macOS menylinjeagent bygget på toppen av streamingøkten. Det kjører som en bakgrunnsapp, overfører fra mikrofonen med levende partiell, auto-kommiterer uttalelser på EOU eller VAD stillhet, og limer resultater inn i den fremste appen.
- Menybar app med global
Cmd+Shift+Dhotkey - Levepartiler med flytende HUD- og lydnivåindikator
- VAD-beskyttet styrkefinalisering (produksjonsmønsteret ovenfor)
- Lim inn-til-front-app med
Cmd+Shift+V - Modell automatisk nedlastinger ved første lansering (~120 MB)
cd Examples/DictateDemo
swift build
.build/debug/DictateDemo
Den fulle implementeringen lever i Examples/DictateDemo/DictateDemo/DictateViewModel.swift: en off-main lydvask med en låsbeskyttet buffer, en 300 ms timer kryss som drener det, Silero VAD med restprøvebærerover, og en bevoktet kraft-finalisere. De matchende regresjonstester i Examples/DictateDemo/Tests/DictateDemoTests.swift dekke multi-utterance, fast-EOU, og støyende-silensscenarier.
Streaming vs batch Parakeet
| Parakeet-EOU-120M (strømming) | Parakeet TDT 0.6B (batch) | |
|---|---|---|
| Bruk tilfelle | Live dikt, real-time bildeteksting | Filtranskripsjon, offline jobber |
| Dehydrering | RNN-T + EOU hode | Token-og-Duration Transducer |
| Chunk størrelse | 640 ms streaming | Helfil sats |
| Vektminne | ~120 MB | 500 MB |
| Gjennomstrømning | ~18x sanntid | ~32x sanntid |
| Latentens | ~ 340 ms partiells | Kun filslutt |
... du trenger delvis før brukeren avslutter tale. For batchtranskripsjon av lydfiler, er de større Parakeet TT 0.6B raskere end-to-end og mer nøyaktig. De to modellene deler samme SetencePiece-ordforråd, slik at du kan bytte mellom dem uten å endre tokenisering.