Automatische vertaling · Engels origineel
Streaming Dictation
Parakeet-EOU-120M is een kleine RNN-T-streaming ASR-model met een expliciete eind-van-toettering (EOU) hoofd, gebouwd voor real-time dictering op Apple Silicon's Neural Engine. Deze gids omvat ook DictateDemo, de macOS menu-bar referentie-app die het streaming model bedraadt met Silero VAD voor hands-free, plak-anywhere diction.
Wat het is.
- Live partials andere tekst updates op dit moment, ~340 ms na elke brok
- Expliciet EOU
- VAD-gedreven kracht-afronding Silero backstop committ uitingen, zelfs als EOU stilstaat op achtergrondruis
- 120 MB INT8 CoreML 616/2007 draait op de Neural Engine, laat GPU vrij voor andere modellen
- 25 Europese talen .. dezelfde woordenschatfamilie als stroomopwaarts NeMo Parakeet TDT
Architectuur
Drie CoreML modellen die per audioblok worden gepipelined:
| Onderdeel | Omschrijving |
|---|---|
| Encoder | Cache-aware Conformer. Neemt een 64-frame mel chunk (640 ms) plus zes state tensors .. aandacht KV cache, deepwise conv cache, en een pre_cache mel loopback dat prepends recent-verleden audio, zodat de Fiat ziet continue signaal over brok grenzen. |
| Decoder | Een-stap LSTM voorspelling netwerk. Consumeert de vorige niet-blanco token, zendt een inbedding plus bijgewerkt (h, c) status. |
| Gewricht + GOO-hoofd | De encoder en decoder worden gebruikt in logits over vocab + blank + EOU. De EGU klasse is het harde signaal van het model dat een uitdrukking is voltooid. |
Waarom een aparte EOU token
Een speciale EOU-kop laat het model een harde snit maken voor het committen van de gedeeltelijke naar een definitieve, resetting punctuation/capitalization state, en het activeren van downstream acties zoals pasta-to-app.
Toetsenbordklikken, muisbeweging en roomtone tijdens een "stille" pauze kunnen het gewricht af en toe een niet-blank token laten uitstoten, de EOU debounce timer resetten en de commit vertragen. Productiepijpleidingen koppelen de gezamenlijke EOU aan een externe VAD-gedreven forceEndOfUtterance() backstop
Model
| Model | Grootte | HuggingFace |
|---|---|---|
| Parakeet-EOU-120M (CoreML INT8) | 120 MB | aufklarer/Parakeet-EOU-120M-CoreML-INT8 |
Prestaties
| Metrisch | Waarde |
|---|---|
| Gewichtsgeheugen | ~120 MB (INT8) |
| Piek-inferentiegeheugen | 200 MB |
| Chunk latency (M-serie) | ~30 ms compute / 640 ms audio (RTF ~0,056) |
| Gedeeltelijke latentie eind-tot-eind | ~340 ms (één stuk) |
| Commit latency (VAD pad) | ~1 s na het stoppen van de spraak |
| Doel berekenen | Neural Engine (CoreML) |
Snel starten met een batch transcriptie
Het streamingmodel voldoet ook aan SpeechRecognitionModel, dus het werkt als een drop-in voor elke code die een generiek STT-model neemt:
import ParakeetStreamingASR
let model = try await ParakeetStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000)
Snel starten met een async-streaming
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000) {
if partial.isFinal { print("FINAL: \(partial.text)") }
else { print("... \(partial.text)") }
}
Elk PartialTranscript draagt text, isFinal, confidence, eouDetected (gezamenlijk afgevuurd vs. kracht-afgerond), en een monotone segmentIndex.
Langlevende sessie API (mic input)
Voor live diction, maak een sessie eenmaal en voer het brokken als ze komen uit de microfoon. De sessie buffert intern en draait de encoder wanneer genoeg samples zich ophopen, zodat je willekeurige brok maten kunt duwen:
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 krachtafrondingspatroon
Als een Silero VAD al in je pijplijn draait, gebruik het dan om een terugval commit te sturen zodat achtergrondruis de EOU debounce timer niet kan vertragen:
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 menubalkreferentie-app
DictateDemo is een complete macOS menubalk die bovenop de streamingsessie is gebouwd. Het draait als een achtergrondapp, transcribeert vanuit de microfoon met live partials, automatisch committeert uitingen op EGO of VAD stilte, en past de pasta's resulteert in de meest front app.
- Menu-balk-app met globale
Cmd+Shift+Dhotkey - Live gedeeltelijken met zwevende HUD en audioniveau indicator
- VAD-bewaakte kracht-afronding (het productiepatroon hierboven)
- Plakken-naar-front-meest-app met
Cmd+Shift+V - Model auto-downloads bij de eerste lancering (~120 MB)
cd Examples/DictateDemo
swift build
.build/debug/DictateDemo
De volledige implementatie leeft in Examples/DictateDemo/DictateDemo/DictateViewModel.swift: een off-main audio-spoelbak met een afgesloten buffer, een 300 ms timer vink die het afvoert, Silero VAD met restsample carry-over, en een bewaakte kracht-afronding. De bijbehorende regressietests in Examples/DictateDemo/Tests/DictateDemoTests.swift dekken multi-utterance, fixed-EOU, en noisy-silence scenario's.
Streaming vs batch Parakeet
| Parakeet-EOU-120M (streaming) | Parakeet TDT 0,6B (batch) | |
|---|---|---|
| Use case | Live diction, real-time ondertiteling | Bestand transcriptie, offline taken |
| Decoder | RNN-T + EOU-hoofd | Token-and-Duration Transducer |
| Chunk-grootte | 640 ms streaming | Geheel bestandspartij |
| Gewichtsgeheugen | 120 MB | 500 MB |
| Doorvoer | ~18x real-time | ~32x real-time |
| Matigheid | ~340 ms gedeeltelijke | Alleen einde van bestand |
...voordat de gebruiker het woord afsluit. Voor batch transcriptie van audiobestanden is de grotere Parakeet TDT 0.6B sneller end-to-end en nauwkeuriger. De twee modellen delen dezelfde SentencePiece woordenschat, zodat je tussen hen kunt wisselen zonder tokenization te veranderen.