Uyandırma kelimesi / Keyword Spotting
SpeechWakeWord modülü cihaz üzerinde bir keyword spotter çalıştırır: bir cümle listesi kaydedersiniz, ses chunk'larını içeri itersiniz ve algılamaları alırsınız. icefall'ın streaming Zipformer transducer'ına dayanır (3,49M parametre, Apache-2.0); CoreML'e INT8 palettization ile derlenmiştir.
Yayımlanan checkpoint, gigaspeech KWS ince ayarıdır. İngilizce olmayan anahtar kelimeler ayrı bir icefall ince ayarı ve yeniden dışa aktarma gerektirir.
Mimari
| Aşama | Detaylar |
|---|---|
| fbank | kaldi uyumlu (25 ms / 10 ms, Povey pencere, 80 mel bin, high_freq=-400, CMVN yok) |
| Encoder | 6 aşamalı nedensel Zipformer2 (128-dim), 45 mel frame giriş → 8 frame çıkış (40 ms / frame) — 3,3 MB INT8 |
| Decoder | Durumsuz transducer, BPE-500 vocab, context size 2 — 525 KB FP16 |
| Joiner | Linear + tanh çıktı projection — 160 KB INT8 |
| Decode | Kullanıcı anahtar kelimelerinden oluşan Aho-Corasick ContextGraph'ı üzerinde değiştirilmiş beam search (beam=4) |
Disk üzerindeki derlenmiş boyut: toplam ~4 MB (encoder.mlmodelc + decoder.mlmodelc + joiner.mlmodelc). Çalışma zamanı belleği: encoder durum cache'leri dahil ~6 MB.
Performans
| Metrik | Değer | Notlar |
|---|---|---|
| RTF (CPU + Neural Engine) | 0,04 | M serisinde gerçek zamanın 26 katı |
| Geri çağırma (12 anahtar kelime) | %88 | LibriSpeech test-clean, 158 pozitif söyleyiş |
| Söyleyiş başına yanlış pozitif | 0,27 | 60 negatif söyleyiş |
| CoreML INT8 ile PyTorch FP32 | %99 | Yayım uyumu |
Ayarlanmış varsayılanlar: acThreshold=0.15, contextScore=0.5, numTrailingBlanks=1. Anahtar kelime başına geçersiz kılmalar desteklenir.
CLI kullanımı
Düz cümle biçimi (greedy BPE — yaygın kelimeler için iyi çalışır):
speech wake recording.wav --keywords "hey soniqo"
speech wake recording.wav --keywords "hey soniqo:0.15:0.5" "cancel"
Önceden tokenize edilmiş biçim (sherpa-onnx tarzı — modelin hangi ayrışıma göre eğitildiğini bildiğinizde önerilir):
# Biçim: "phrase|piece1 piece2 ...:threshold:boost"
speech wake recording.wav \
--keywords "LIGHT UP|▁ L IGHT ▁UP:0.25:2.0"
# Birden çok anahtar kelime + JSON çıktısı
speech wake recording.wav \
--keywords "LIGHT UP|▁ L IGHT ▁UP:0.25:2.0" \
"LOVELY CHILD|▁LOVE LY ▁CHI L D:0.25:2.0" \
--json
Veya satır başına bir giriş içeren bir anahtar kelime dosyası (# yorumlar için):
speech wake recording.wav --keywords-file keywords.txt
Swift API
import SpeechWakeWord
// Modeli anahtar kelime listenizle yükleyin.
let detector = try await WakeWordDetector.fromPretrained(
keywords: [
KeywordSpec(phrase: "hey soniqo", acThreshold: 0.15, boost: 0.5),
KeywordSpec(phrase: "cancel")
]
)
// Streaming: chunk'ları itin, algılamalar tetiklendikçe tüketin.
let session = try detector.createSession()
for chunk in micAudioChunks { // Float32 @ 16 kHz
for detection in try session.pushAudio(chunk) {
print("[\(detection.time(frameShiftSeconds: 0.04))s] \(detection.phrase)")
}
}
// Batch: tüm buffer üzerinde tek çekim.
let detections = try detector.detect(audio: samples, sampleRate: 16000)
KeywordSpec
| Alan | Anlam |
|---|---|
phrase | Görüntülenecek cümle, örn. "hey soniqo". tokens nil olduğunda greedy BPE kodlaması için kaynak olarak da kullanılır. |
acThreshold | Eşleşen aralık üzerinde gerekli ortalama akustik olasılık. 0 → ayarlanmış varsayılanı kullan (0,15). |
boost | Token başına bağlam boost. Pozitif değerler cümleyi tetiklemeyi kolaylaştırır. 0 → ayarlanmış varsayılanı kullan (0,5). |
tokens | İsteğe bağlı açık BPE piece listesi. Non-nil olduğunda detector her piece'i modelin tokens.txt'sinde arar ve greedy BPE encoder'ı atlar. |
tokens'ı ne zaman kullanmalıicefall KWS vocab'ı BÜYÜK HARF BPE'dir. Bir cümlenin greedy tokenizasyonu, modelin yayımlamak üzere eğitildiğinden farklı bir BPE ayrışımı seçebilir — "LIGHT UP" greedy ile ▁LI GHT ▁UP'a kodlanır ama eğitim ayrışımı ▁ L IGHT ▁UP'tır. TTS ile sentezlenmiş veya temiz okuma konuşmasında algılama açık eşleşmeleri kaçırıyorsa, sherpa-onnx tarzı önceden tokenize edilmiş biçimi deneyin.
Model indirmeleri
| Model | Parametre | Boyut | HuggingFace |
|---|---|---|---|
| KWS-Zipformer-3M | 3,49M | ~4 MB | aufklarer/KWS-Zipformer-3M-CoreML-INT8 |
Pipeline entegrasyonu
Modül, StreamingVADProvider'ı yansıtan bir WakeWordProvider protokolü sunar; böylece bir ses pipeline'ı etkinleştirmeyi VAD, uyandırma kelimesi veya her ikisi üzerinde gate edebilir. WakeWordStreamingAdapter, yüklü bir detector + tek bir session'ı yeniden kullanılabilir bir provider nesnesine sarar.
let adapter = try WakeWordStreamingAdapter(detector: detector)
// pipeline.configure(wakeWord: adapter)
Kaynak
- Sources/SpeechWakeWord — Swift modülü
- docs/models/kws-zipformer.md — mimari notlar
- docs/inference/wake-word.md — çıkarım pipeline'ı
- Üst akış: k2-fsa/icefall KWS recipe / pkufool/keyword-spotting-models