Traducere automată · Originalul în engleză
Streaming Dictation
Parakeet-EOU-120M este un mic streaming RNN-T ASR model cu un cap explicit de sfârșit de ture (EOU), construit pentru dictare în timp real pe Apple Silicon's Neural Engine. Acest ghid acoperă, de asemenea, DictateDemo, aplicaţia macOS menu-bar de referinţă care leagă modelul de streaming împreună cu Silero VAD
Ce este?
- Parțiale în viață bază text actualizări în timp ce vorbești, ~340 ms după fiecare bucată
- Explicit EOU
- VAD-condus force-finalized ا Silero backstop comite declaraţii chiar şi atunci când EOU stalks on background sound
- 120 MB INT8 CoreML Ruleaza pe Neural Engine, lasa GPU gratuit pentru alte modele
- 25 Limbi europene bază vocabular aceeaşi familie ca şi NeMo în amonte Parakeet TDT
Arhitectură
Trei modele de tip CoreML prevăzute pe bucată audio:
| Componentă | Descriere |
|---|---|
| Codor | Cache-aware Conformer. Ia o bucată de 64-frame mel (640 ms) plus șase tensori de stat. atenție KV cache, conv cache adâncime, și un pre_cache mel loopback care prepends audio recent trecut astfel încât FFT vede semnal continuu peste limitele bucății. |
| Decodor | Reţeaua de predicţie LSTM cu un singur pas. Consumă jetonul anterior nealbit, emite o înglobare plus starea actualizată (h, c). |
| Capul articulat + EOU | Fuses encoder și decodor iese în logits peste vocab + blank + EOU. Clasa EOU este semnalul dur al modelului că o declarație este terminată. |
De ce un jeton EOU separat
Simpla RNNT emite goluri în timpul tăcerii, pe care decodorul le absoarbe fericit fără a semnala "absolut." Un cap EOU dedicat permite modelului să facă o tăietură grea pentru comiterea parţială a unei stări finale, resetarea punctualităţii/capitalizării, şi declanşarea acţiunilor din aval cum ar fi past-to-ap.
Clicuri tastatură, mișcarea mouse-ului, și ton de cameră în timpul unei pauze "silent" poate face articulația ocazional emite un jeton non-blank, resetarea EOU debounce temporizorul și stagnarea comite. Conductele de producție perechea EOU comun cu un EOU extern VAD-drived forceEndOfUtterance() backstop . vezi DictateDemo mai jos.
Model
| Model | Dimensiune | HuggingFace |
|---|---|---|
| Parakeet-EOU-120M (CoreML INT8) | ~120 MO | aufklater/Parakeet-EOU-120M-CoreML-INT8 |
Performanță
| Metrică | Valoare |
|---|---|
| Memorie greutate | ~120 MB (INT8) |
| Memorie de inferență maximă | ~200 MO |
| Latență în bucăți (M-serie) | ~30 ms calcul / 640 ms de audio (RTF ~0.056) |
| Latență parțială la sfârșit | ~340 ms (o bucată) |
| Comite latența (VAD cale) | ~1 s dupa ce discursul se opreste |
| Calculează ținta | Neural Engine (CoreML) |
Start rapid transcriere lot
Modelul de streaming este, de asemenea, conform cu SpeechRecognitionModel, astfel încât funcționează ca un drop-in pentru orice cod care ia un model STT generic:
import ParakeetStreamingASR
let model = try await ParakeetStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000)
Start rapid
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000) {
if partial.isFinal { print("FINAL: \(partial.text)") }
else { print("... \(partial.text)") }
}
Fiecare PartialTranscript transportă text, isFinal, confidence, eouDetected (joint pounded vs force-finalized) și un monoton segmentIndex.
Sesiune de lungă durată API (mic input)
Pentru dictare live, creați o sesiune o dată și hrăniți-l bucăți în timp ce sosesc de la microfon. Tamponul sesiune intern și ruleaza codorul atunci când se acumulează suficiente probe, astfel încât să puteți împinge dimensiuni arbitrare bucăți:
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 model de finisare a forței
Atunci când un Silero VAD rulează deja în conducta dumneavoastră, utilizați-l pentru a conduce un accident de rezervă astfel încât zgomotul de fond nu poate bloca cronometrul debuunce EOU:
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 bază de referință macOS
DictateDemo este un agent complet macOS menu-bar construit pe partea de sus a sesiunii de streaming. Se execută ca o aplicație de fundal, transcrie de la microfon cu partiale live, declarații auto-commite pe EOU sau VAD tăcere și paste rezultate în aplicația cea mai din față.
- Aplicație de meniu-bar cu tastatură globală
Cmd+Shift+D - Live parţiale cu FUD plutitoare şi indicator de nivel audio
- Finalizarea forței păzite VAD (modelul de producție de mai sus)
- Lipește-la-front-app cu
Cmd+Shift+V - Model auto-descărcare la prima lansare (~120 MB)
cd Examples/DictateDemo
swift build
.build/debug/DictateDemo
Implementarea completă trăieşte în Examples/DictateDemo/DictateDemo/DictateViewModel.swift: o chiuvetă audio off-main cu un tampon protejat de blocare, o căpuşă temporizată de 300 ms care îl drenează, Silero VAD cu o încărcătură de eşantion rămasă şi o forţă de pază-finalizare. Testele de regresie corespunzătoare în Examples/DictateDemo/Tests/DictateDemoTests.swift acoperă multi-uterance, blocat-EOU, şi scenarii de tăcere zgomotoasă.
Streaming vs lot Parakeet
| Parakeet-EOU-120M (streaming) | Parakeet TDT 0,6B (batch) | |
|---|---|---|
| Utilizați cazul | Dictare live, subtitrare în timp real | Transcriere fișiere, locuri de muncă offline |
| Decodor | RNN-T + EOU cap | Transductor de token și de Durație |
| Dimensiunea bucății | 640 ms streaming | Lot întreg |
| Memorie greutate | ~120 MO | 500 MO |
| Throughput | ~18x în timp real | 32x în timp real |
| Latitudine | ~340 ms partiale | Numai sfârșitul fișierului |
... aveți nevoie de partiale înainte de a termina utilizatorul vorbind. Pentru transcrierea pe loturi de fișiere audio, mai mare Parakeet TDT 0.6B este mai rapid de la un capăt la altul și mai precis. Cele două modele împărtășesc același vocabular SentincePiece, astfel încât să puteți schimba între ele fără a schimba tokenizarea.