Terjemahan mesin · Versi asli bahasa Inggris
Deteksi kata pemicu / kata kunci
The SpeechWakeWord modul menjalankan spotter kata kunci on-device: anda mendaftarkan daftar frasa, tekan potongan audio, dan terima deteksi. Berdasarkan transducer Zipformer streaming (3.49M params, Apache-2.0), dikompile ke CoreML dengan INT8 Paletisasi.
Pos pemeriksaan dikirim adalah gigaspeech KWS fine- tune. Non-bahasa Inggris kata kunci membutuhkan terpisah icefall fine- lagu dan ekspor.
Arsitektur
| Tahap | Rincian |
|---|---|
| fbank | kaldi- kompatibel (25 ms / 10 m, Povey window, 80 mel bins, high_freq=-400, tidak ada CMVN) |
| Enkoder | 6-stage causal Zipformer2 (128-dim), 45 mel frame in Aby 8 frame out (40 ms / frame) - 3.3 MB INT8 |
| Decoder | Statelek transducer, BPE-500 vocab, ukuran konteks 2 — 525 KB FP16 |
| Joiner | Liniar + tanh output projection - 160 KB INT8 |
| Decode | Pencarian berkas yang diubah (beam = 4) melalui Aho- Corasick ContextGraph dari kata kunci pengguna |
Ukuran yang dikompilasi pada disk: ~ 4 MB total (encoder.mlmodelc + decoder.mlmodelc + joiner.mlmodelc). memori runtime: ~ 6 MB termasuk enkoder negara cache.
Penampilan
| Metrik | Nilai | Catatan |
|---|---|---|
| RTF (CPU + Neural Engine) | 0.04 | 26 × real-time on M- series |
| Ingat (12 kata kunci) | 88% | Test librispek - bersih, 158 pernyataan positif |
| Bilangan / ucapan positif salah | 0.27 | 60 pernyataan negatif |
| CoreML INT8 vs PyTorch FP32 | 99% | Perjanjian emisi |
Baku tuned: acThreshold=0.15, contextScore=0.5, numTrailingBlanks=1Per- kata kunci overrides didukung.
Penggunaan CLI
Formulir frase-plain- (BPE serakah - bekerja dengan baik untuk kata-kata umum):
speech wake recording.wav --keywords "hey soniqo"
speech wake recording.wav --keywords "hey soniqo:0.15:0.5" "cancel"
Bentuk pre- tokenized (sherpa-onnx style - disarankan ketika anda tahu dekomposisi yang tepat model dilatih):
# Format: "phrase|piece1 piece2 ...:threshold:boost"
speech wake recording.wav \
--keywords "LIGHT UP|▁ L IGHT ▁UP:0.25:2.0"
# Multiple keywords + JSON output
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
Atau berkas kata kunci, satu entri per baris (# untuk komentar):
speech wake recording.wav --keywords-file keywords.txt
Swift API
import SpeechWakeWord
// Load the model with your keyword list.
let detector = try await WakeWordDetector.fromPretrained(
keywords: [
KeywordSpec(phrase: "hey soniqo", acThreshold: 0.15, boost: 0.5),
KeywordSpec(phrase: "cancel")
]
)
// Streaming: push chunks, consume detections as they fire.
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: single shot over a full buffer.
let detections = try detector.detect(audio: samples, sampleRate: 16000)
Kata Kunci Spec
| Ruas | Artinya |
|---|---|
phrase | Tampilkan frasa, mis. "hey soniqo"Juga digunakan sebagai sumber pengkodean BPE serakah ketika tokens adalah nihil. |
acThreshold | Probabilitas akustik yang berarti diperlukan selama rentang yang cocok. 0 Gunakan arus baku (0.15). |
boost | Per- token peningkatan konteks. Nilai positif membuat frasa lebih mudah untuk memicu. 0 Gunakan arus baku (0.5). |
tokens | Daftar potongan eksplisit opsional BPE. Ketika non- nol, detektor terlihat setiap bagian dalam model tokens.txt dan melewati enkoder BPE yang serakah. |
tokensKosakata KWS es adalah BPE huruf besarGreedy tokenisasi dari frase dapat memilih yang berbeda dekomposisi BPE dari salah satu model dilatih untuk memancarkan - "LIGHT UP" greedy- encodes to ▁LI GHT ▁UP tapi dekomposisi pelatihan adalah ▁ L IGHT ▁UPKetika deteksi pada pidato pembacaan TTS-disintesis atau tidak dipakai, coba bentuk sherpa- onnx-style sebelum -tokenized.
Unduhan Model
| Model | Params | Ukuran | HuggingFace |
|---|---|---|---|
| KWS-Zipformer-3M | 3.49M | ~ 4 MB | aufklarer / KWS-Zipformer-3M-CoreML-INT8 |
Integrasi garis pipa
Modul mengekspos WakeWordProvider protokol yang cermin StreamingVADProvider, sehingga sebuah pipa suara dapat mengaktifkan gerbang pada VAD, bangun-kata, atau keduanya. WakeWordStreamingAdapter membungkus detektor dimuat + sebuah sesi ke dalam sebuah objek penyedia yang dapat digunakan ulang.
let adapter = try WakeWordStreamingAdapter(detector: detector)
// pipeline.configure(wakeWord: adapter)
Sumber
- Sumber / SpeechWakeWord - Modul Swift
- docs / model / kws-zipformer.md - catatan arsitektur
- docs / inferensi / wake-word.md - pipa inferensi
- Upstream: k2-fsa / icefall KWS resep / pkufool / keyword-spotting-model