Traduzione automatica · Originale inglese
Dittatura di streaming
Parakeet-EOU-120M è un piccolo modello RNN-T in streaming ASR con una testa esplicita (EOU), costruita per la dittazione in tempo reale su Apple Silicon Neural Engine. DictateDemo, l'app di riferimento menu-bar macOS che collega il modello di streaming insieme a Silero VAD per la dittazione senza mani, senza pasta.
Che cosa è
- Live parziali — aggiornamenti di testo come si parla, ~340 ms dopo ogni chunk
- EVOLUZIONE — il modello decide quando termina un'enunciazione, nessun pulsante manuale
- La forza trainata da VAD si concluderà — Silero backstop commette pronunce anche quando EOU si blocca sul rumore di fondo
- 120 MB INT8 CoreML — corre sulla Neural Engine, lascia la GPU libera per altri modelli
- 25 Lingue europee — stessa famiglia di vocabolario a monte NeMo Parakeet TDT
Architettura
Tre modelli CoreML conduttivi per gruppo audio:
| Componenti | Designazione |
|---|---|
| Encoder | Conformer Cache-aware. Prende un 64-frame mel chunk (640 ms) più sei tensori di stato — l'attenzione KV cache, la cache di profondità conv, e un pre_cache mel loopback che prepende l'audio di recente-past in modo che il FFT vede il segnale continuo attraverso i confini di chunk. |
| Decoder | Consuma il precedente token non-blank, emette un incorporamento più aggiornato (h, c) stato. |
| Giunzione + Testa EOU | Fusibili encoder e decoder uscite in logits over vocab + blank + EOU |
Perché un token EOU separato
Plain RNNT emette vuoti durante il silenzio, che il decoder assorbe felicemente senza segnalare "l'autterance finita". Una testa EOU dedicata permette al modello di fare un taglio duro per commettere il parziale a uno stato finale, reimpostando la punteggiatura / capitalizzazione e innescando azioni a valle come pasta-app.
Tastiera click, movimento del mouse e tono della stanza durante una pausa "silenziosa" può rendere il giunto occasionalmente emettere un token non-blank, resettando il timer di debounce EOU e bloccando il commit. forceEndOfUtterance() backstop — vedere DictateDemo qui sotto.
Modello
| Modello | Dimensione | HuggingFace |
|---|---|---|
| Parakeet-EOU-120M (CoreML INT8) | ~ 120 MB | aufklarer/Parakeet-EOU-120M-CoreML-INT8 |
Prestazioni
| Metrico | Valore |
|---|---|
| Memoria di peso | ~ 120 MB ( INT8) |
| Memoria di inferenza di picco | ~ 200 MB |
| Latenza del gambo (serie M) | ~30 ms compute / 640 ms di audio (RTF ~0.056) |
| Latenza parziale fine-fine | ~340 ms (un pezzo) |
| Avviare la latenza ( VAD path) | ~1 s dopo il discorso si ferma |
| Obiettivo di completamento | Neural Engine (CoreML) |
Avvio rapido — trascrizione in lotto
Il modello di streaming è conforme anche a SpeechRecognitionModel, quindi funziona come drop-in per qualsiasi codice che prenda un modello STT generico:
import ParakeetStreamingASR
let model = try await ParakeetStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000)
Avvio rapido — lo streaming asinc
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000) {
if partial.isFinal { print("FINAL: \(partial.text)") }
else { print("... \(partial.text)") }
}
Ciascuno PartialTranscript trasporta text, isFinal, confidence, eouDetected (congiunto sparato contro forza-finalizzata), e un monotonico segmentIndex.
Sessione di lunga durata API (input dinamico)
Per la dittazione dal vivo, creare una sessione una volta e alimentarlo chunks come arrivano dal microfono. I buffer di sessione internamente e gestisce l'encoder quando si accumulano campioni sufficienti, in modo da poter spingere arbitrarie dimensioni di pezzi:
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 modello di forza finale
Quando un Silero VAD è già in esecuzione nella vostra pipeline, usarlo per guidare un errore di ricaduta in modo che il rumore di fondo non può frenare il timer di debounce 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 — macOS
DictateDemo è un completo macOS agente barra menu costruito sulla parte superiore della sessione di streaming. Funziona come app di sfondo, trascrive dal microfono con parziali vivi, auto-comandi pronuncia su EOU o VAD
- App Menu-bar con chiave a caldo globale
Cmd+Shift+D - Parziali in tensione con HUD galleggiante e indicatore di livello audio
- Forza-finalizzata VAD (il modello di produzione sopra)
- Paste-to-front-app con
Cmd+Shift+V - Modello auto-download sul primo lancio (~120 MB)
cd Examples/DictateDemo
swift build
.build/debug/DictateDemo
L'attuazione completa vive in Examples/DictateDemo/DictateDemo/DictateViewModel.swift: un lavandino audio off-main con un buffer protetto da serratura, una zecca timer 300 che lo drena, Silero VAD con rientro a sinistra e una forza-finalizzata. Examples/DictateDemo/Tests/DictateDemoTests.swift coprono scenari multi-utterance, bloccato-EOU e rumoroso-silence.
Streaming vs batch Parakeet
| Parakeet-EOU-120M (streaming) | Parakeet TDT 0.6B (batch) | |
|---|---|---|
| Caso di utilizzo | Live dittazione, in tempo reale didascalia | Trascrizione di file, lavori offline |
| Decoder | RNN-T + testa EOU | Trasduttore Token e Duration |
| Dimensione del manubrio | 640 ms di streaming | lotto intero |
| Memoria di peso | ~ 120 MB | 500 MB |
| Portata | ~18x in tempo reale | ~ 32x in tempo reale |
| Lattice | ~340 ms parziali | Solo la fine del file |
Per la trascrizione in batch di file audio, il più grande Parakeet TDT 0.6B è più veloce end-to-end e più accurato. I due modelli condividono lo stesso vocabolario SentencePiece, in modo da poter scambiare tra loro senza cambiare tokenizzazione.