Akış Diktesi
Parakeet-EOU-120M, açık bir konuşma-sonu (EOU) başlığına sahip küçük bir RNN-T akış ASR modelidir; Apple Silicon'un Neural Engine'inde gerçek zamanlı dikte için tasarlanmıştır. Bu kılavuz ayrıca, akış modelini eller serbest, her yere yapıştırılabilir dikte için Silero VAD ile bir araya getiren macOS menü çubuğu referans uygulaması DictateDemo'yu da kapsar.
Nedir
- Canlı kısmi sonuçlar — siz konuşurken metin güncellenir, her parçadan ~340 ms sonra
- Açık EOU — model bir konuşmanın ne zaman bittiğine karar verir, manuel butona gerek yok
- VAD güdümlü zorla sonlandırma — Silero güvencesi, EOU arka plan gürültüsünde takıldığında bile konuşmaları commit eder
- 120 MB INT8 CoreML — Neural Engine'de çalışır, GPU'yu diğer modeller için serbest bırakır
- 25 Avrupa dili — yukarı akış NeMo Parakeet TDT ile aynı vocabulary ailesi
Mimari
Her ses parçası için pipeline halinde çalışan üç CoreML modeli:
| Bileşen | Açıklama |
|---|---|
| Kodlayıcı | Cache-aware Conformer. 64 çerçeveli bir mel parçası (640 ms) ile altı durum tensörü alır — attention KV cache, depthwise conv cache ve son geçmiş sesi öne ekleyen bir pre_cache mel loopback'i; böylece FFT, parça sınırları boyunca sürekli sinyal görür. |
| Kod çözücü | Tek adımlı LSTM tahmin ağı. Önceki non-blank token'ı alır, bir embedding ile güncellenmiş (h, c) durumunu üretir. |
| Joint + EOU başlığı | Kodlayıcı ve kod çözücü çıktılarını vocab + blank + EOU üzerinde logit'lere kaynaştırır. EOU sınıfı, bir konuşmanın bittiğine dair modelin sert sinyalidir. |
Neden ayrı bir EOU token'ı
Düz RNNT, sessizlik sırasında blank üretir; kod çözücü bunları "konuşma bitti" sinyali vermeden mutlu mesut emer. Özel bir EOU başlığı, modelin kısmi sonucu nihai sonuca commit etmek, noktalama/büyük harf durumunu sıfırlamak ve uygulamaya yapıştır gibi alt süreçleri tetiklemek için sert bir kesim yapmasını sağlar.
Klavye tıklamaları, fare hareketi ve "sessiz" bir duraklamadaki oda tonu, joint'in arada bir non-blank token üretmesine, EOU debounce sayacının sıfırlanmasına ve commit'in takılmasına yol açabilir. Üretim pipeline'ları, joint EOU'yu harici bir VAD güdümlü forceEndOfUtterance() güvencesiyle birleştirir — aşağıdaki DictateDemo'ya bakın.
Model
| Model | Boyut | HuggingFace |
|---|---|---|
| Parakeet-EOU-120M (CoreML INT8) | ~120 MB | aufklarer/Parakeet-EOU-120M-CoreML-INT8 |
Performans
| Metrik | Değer |
|---|---|
| Ağırlık belleği | ~120 MB (INT8) |
| Zirve çıkarım belleği | ~200 MB |
| Parça gecikmesi (M serisi) | ~30 ms hesaplama / 640 ms ses (RTF ~0.056) |
| Uçtan uca kısmi gecikme | ~340 ms (bir parça) |
| Commit gecikmesi (VAD yolu) | Konuşma bittikten sonra ~1 s |
| Hesaplama hedefi | Neural Engine (CoreML) |
Hızlı başlangıç — toplu yazıya dökme
Akış modeli ayrıca SpeechRecognitionModel protokolüne de uyar, böylece genel bir STT modeli alan herhangi bir kodda doğrudan yerine geçer:
import ParakeetStreamingASR
let model = try await ParakeetStreamingASRModel.fromPretrained()
let text = try model.transcribeAudio(audioSamples, sampleRate: 16000)
Hızlı başlangıç — asenkron akış
for await partial in model.transcribeStream(audio: samples, sampleRate: 16000) {
if partial.isFinal { print("FINAL: \(partial.text)") }
else { print("... \(partial.text)") }
}
Her PartialTranscript; text, isFinal, confidence, eouDetected (joint mi yoksa zorla sonlandırma mı tetikledi) ve monotonik bir segmentIndex taşır.
Uzun ömürlü session API'si (mikrofon girişi)
Canlı dikte için bir kez session oluşturun ve mikrofondan geldikçe parçaları ona besleyin. Session dahili olarak tamponlar ve yeterli örnek biriktiğinde kodlayıcıyı çalıştırır; böylece istediğiniz boyutta parçalar gönderebilirsiniz:
let session = try model.createSession()
// her mikrofon parçası:
let partials = try session.pushAudio(float32Chunk16kHz)
for p in partials {
if p.isFinal { commit(p.text) }
else { showPartial(p.text) }
}
// akış sona erdiğinde:
let trailing = try session.finalize()
VAD zorla sonlandırma deseni
Pipeline'ınızda zaten bir Silero VAD çalışıyorsa, arka plan gürültüsünün EOU debounce sayacını takmasını engellemek için onu yedek commit'i tetiklemek üzere kullanın:
if hasPendingUtterance && !vadSpeechActive && vadSilentChunks >= 30 {
// Silero'ya göre ~960 ms sürekli sessizlik
if let forced = session.forceEndOfUtterance() {
commit(forced.text)
}
hasPendingUtterance = false
}
// güvenlik önlemi: joint zaten EOU tetiklediyse iki kez commit etme
if partials.contains(where: { $0.isFinal }) {
hasPendingUtterance = false
}
DictateDemo — macOS menü çubuğu referans uygulaması
DictateDemo, akış session'ı üzerinde inşa edilmiş eksiksiz bir macOS menü çubuğu ajanıdır. Arka plan uygulaması olarak çalışır, mikrofondan canlı kısmi sonuçlarla yazıya döker, EOU veya VAD sessizliği üzerine konuşmaları otomatik commit eder ve sonuçları öndeki uygulamaya yapıştırır.
- Global
Cmd+Shift+Dkısayolu olan menü çubuğu uygulaması - Yüzen HUD ve ses seviyesi göstergesi ile canlı kısmi sonuçlar
- VAD korumalı zorla sonlandırma (yukarıdaki üretim deseni)
Cmd+Shift+Vile öndeki uygulamaya yapıştırma- İlk başlatmada modeli otomatik indirir (~120 MB)
cd Examples/DictateDemo
swift build
.build/debug/DictateDemo
Tam uygulama Examples/DictateDemo/DictateDemo/DictateViewModel.swift içindedir: main olmayan bir ses sink'i, lock korumalı bir buffer, onu boşaltan 300 ms'lik bir timer tick'i, taşan örnek aktarımıyla Silero VAD ve korumalı bir zorla sonlandırma. Eşleşen regresyon testleri Examples/DictateDemo/Tests/DictateDemoTests.swift içinde çoklu konuşma, takılı-EOU ve gürültülü-sessizlik senaryolarını kapsar.
Akış ve toplu Parakeet karşılaştırması
| Parakeet-EOU-120M (akış) | Parakeet TDT 0.6B (toplu) | |
|---|---|---|
| Kullanım durumu | Canlı dikte, gerçek zamanlı altyazı | Dosya yazıya dökme, çevrimdışı işler |
| Kod çözücü | RNN-T + EOU başlığı | Token-and-Duration Transducer |
| Parça boyutu | 640 ms akış | Tüm dosya toplu |
| Ağırlık belleği | ~120 MB | 500 MB |
| Verim | ~18x gerçek zamanlı | ~32x gerçek zamanlı |
| Gecikme | ~340 ms kısmi sonuçlar | Yalnızca dosya sonu |
…kullanıcı konuşmayı bitirmeden kısmi sonuçlara ihtiyacınız varsa. Ses dosyalarının toplu yazıya dökülmesi için daha büyük Parakeet TDT 0.6B uçtan uca daha hızlı ve daha doğrudur. İki model aynı SentencePiece vocabulary'sini paylaşır, böylece tokenization'ı değiştirmeden aralarında geçiş yapabilirsiniz.