Tłumaczenie automatyczne · Oryginał angielski
Dyktowanie strumieniowe
Parakeet-EOU-120M to mały model strumieniowania RNN- T ASR z wyraźną głowicą end- of- utterance (EOU), zbudowany dla real- time dictation na Apple Silicon Neural Engine. Ten przewodnik obejmuje również DictateDemo, aplikacja referencyjna macOS, która podłącza model strumieniowy wraz z Silero VAD dla dyktando wolnego od dłoni, pasty gdziekolwiek.
Co to jest?
- Żywe części - aktualizacje tekstowe, jak mówisz, ~ 340 ms po każdym kawałku
- Explicit EOU - model decyduje, kiedy wypowiedź się kończy, bez przycisku ręcznego
- Napęd VAD- force- finalize - Silero backstop zobowiązuje wypowiedzi nawet gdy EOU zatrzymuje się na szumie tła
- 120 MB INT8 CoreML - działa na Neural Engine, pozostawia GPU za darmo dla innych modeli
- 25 Języki europejskie - ta sama rodzina słowników co NeMo Parakeet TDT
Architektura
Trzy modele CoreML wbudowane na dźwięk:
| Składnik | Opis |
|---|---|
| Enkoder | Konformista Cache- eware. Bierze 64- frame mel chunk (640 ms) plus sześć stresorów stanu - uwaga KV cache, depthwise conv cache, i pre_cache Mel loopback, który prepends revent- pass audio, więc FFT widzi ciągły sygnał przez granice kawałka. |
| Dekoder | Single- step LSTM sieć prognozowania. Spożywa poprzedni nie-pusty token, emituje osadzanie plus zaktualizowane (h, c) Stan. |
| Wspólny + głowa EOU | Bezpiecze wyjścia kodujące i dekodujące do logitów over vocab + blank + EOU. Klasa EOU jest twardym sygnałem modelu, że wypowiedź jest zakończona. |
Dlaczego oddzielny symbol EOU
Plain RNNT emituje ślepaki podczas ciszy, które dekoder z radością absorbuje bez sygnalizowania "wymowy zakończone". Specjalna głowa EOU pozwala modelowi na trudne cięcie do zobowiązania częściowej do końcowego, resetowanie interpunkcji / kapitalizacji stanu, i uruchamianie dalszych działań, takich jak pasta-to- app.
Klawiatura kliknięcia, ruch myszki, i dźwięk pokoju podczas "cichy" pauzy może sprawić, że joint czasami emitować niepusty token, resetting EOU debuunce timer i opóźnianie commit. forceEndOfUtterance() backstop - patrz DictateDemo poniżej.
Wzór
| Wzór | Rozmiar | HuggingFace |
|---|---|---|
| Parakeet-EOU-120M (CoreML INT8) | 120 MB | aufklarer / Parakeet-EOU-120M-CoreML-INT8 |
Wydajność
| Metric | Wartość |
|---|---|
| Pamięć wagowa | - 120 MB (INT8) |
| Pamięć pełnego wywołania | 200 MB |
| Latencja w kawałkach (seria M-) | 30 ms comcute / 640 mas of audio (RTF ~ 0.056) |
| Częściowa przerwa na koniec | - 340 ms (jeden kawałek) |
| Opóźnienie (ścieżka VAD) | ~ 1 s po przerwie mowy |
| Oblicz cel | Neural Engine (CoreML) |
Szybki start - transkrypcja partii
Model strumieniowania jest również zgodny z SpeechRecognitionModel, więc działa jako drop- w dla każdego kodu, który wymaga generycznego modelu STT:
import ParakeetStreamingASR
let model = try await ParakeetStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000)
Szybki start - strumieniowanie async
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000) {
if partial.isFinal { print("FINAL: \(partial.text)") }
else { print("... \(partial.text)") }
}
Każdy PartialTranscript przewożone text, isFinal, confidence, eouDetected (zapalenie stawów vs force- finalized), i monotoniczny segmentIndex.
Sesja długowieczna API (wejście mikrofonu)
Dla dyktando na żywo, stworzyć sesję raz i karmić go kawałki, jak przybywają z mikrofonu. Sesja buforuje wewnętrznie i działa koder, gdy ilość próbek gromadzi się, więc można nacisnąć arbitralne rozmiary kawałka:
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 formuła finalizacji siły
Kiedy Silero VAD jest już uruchomiony w twoim rurociągu, użyj go do napędzenia fallbacka commit, aby hałas tła nie mógł opóźnić zegara EOU debuunce:
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 menu- bar aplikacji referencyjnej
DictateDemo jest kompletnym agentem menu- bar macOS zbudowanym na szczycie sesji strumieniowej. Działa jako aplikacja w tle, transkrypcje z mikrofonu z live partials, autocommits utterances na EOU lub VAD milczenie, i pasty wyniki w pierwszej aplikacji.
- Menu- bar aplikacji z globalnym
Cmd+Shift+Dhotkey - Żywe części z pływającym wskaźnikiem poziomu HUD i audio
- VAD-warty force- finalize (powyższy wzór produkcji)
- Paste- to- front- app z
Cmd+Shift+V - Model auto- downloads przy pierwszym uruchomieniu (~ 120 MB)
cd Examples/DictateDemo
swift build
.build/debug/DictateDemo
Pełne wdrożenie pozostaje w Examples/DictateDemo/DictateDemo/DictateViewModel.swift: off- main umywalka audio z blokadą bufora chronionego, timer 300 ms timer, który go wysysa, Silero VAD z resztkami-próbki carry- over, i strzeżony force- finalize. Examples/DictateDemo/Tests/DictateDemoTests.swift pokrywają scenariusze multi- wymowy, Stuck- EOU i ciszy hałasów.
Streaming vs partia Parakeet
| Parakeet-EOU-120M (streaming) | Parakeet TDT 0.6B (partia) | |
|---|---|---|
| Przypadek użycia | Dyktowanie na żywo, podpisy czasu rzeczywistego | Transkrypcja plików, zadania offline |
| Dekoder | RNN- T + głowa EOU | Przetwornik tokenai czasu trwania |
| Rozmiar kawałka | 640 ms streaming | Partia plików pełnoplikowych |
| Pamięć wagowa | 120 MB | 500 MB |
| Troughput | - 18x real- time | - 32x real- time |
| Opóźnienie | ~ 340 ms partials | Tylko plik end- of- |
... trzeba partyjne przed zakończeniem rozmowy przez użytkownika. Do zapisu partii plików audio, większy Parakeet TDT 0.6B jest szybszy end- to- end i bardziej dokładne. Dwa modele mają ten sam słownik SentencePiece, więc można zamienić się między nimi bez zmiany tokenizacji.