वेक-वर्ड / कीवर्ड स्पॉटिंग
SpeechWakeWord मॉड्यूल ऑन-डिवाइस कीवर्ड स्पॉटर चलाता है: आप वाक्यांशों की सूची पंजीकृत करते हैं, ऑडियो चंक धकेलते हैं और पहचानें प्राप्त करते हैं। icefall के स्ट्रीमिंग Zipformer ट्रांसड्यूसर (3.49M पैरामीटर, Apache-2.0) पर आधारित, INT8 पैलेटीकरण के साथ CoreML में संकलित।
भेजा गया checkpoint gigaspeech KWS फ़ाइन-ट्यून है। गैर-अंग्रेज़ी कीवर्ड्स के लिए अलग icefall फ़ाइन-ट्यून और री-एक्सपोर्ट की आवश्यकता है।
आर्किटेक्चर
| चरण | विवरण |
|---|---|
| fbank | kaldi-संगत (25 ms / 10 ms, Povey विंडो, 80 मेल बिन, high_freq=-400, कोई CMVN नहीं) |
| एनकोडर | 6-चरणीय causal Zipformer2 (128-dim), 45 मेल फ़्रेम इन → 8 फ़्रेम आउट (40 ms / फ़्रेम) — 3.3 MB INT8 |
| डिकोडर | स्टेटलेस ट्रांसड्यूसर, BPE-500 शब्दावली, संदर्भ आकार 2 — 525 KB FP16 |
| Joiner | रैखिक + tanh आउटपुट प्रोजेक्शन — 160 KB INT8 |
| डिकोडिंग | उपयोगकर्ता कीवर्ड्स के Aho-Corasick ContextGraph पर संशोधित बीम सर्च (beam=4) |
डिस्क पर संकलित आकार: कुल ~4 MB (encoder.mlmodelc + decoder.mlmodelc + joiner.mlmodelc)। रनटाइम मेमोरी: एनकोडर स्टेट कैश सहित ~6 MB।
प्रदर्शन
| मेट्रिक | मान | टिप्पणियाँ |
|---|---|---|
| RTF (CPU + Neural Engine) | 0.04 | M-सीरीज़ पर 26× रियल-टाइम |
| Recall (12 कीवर्ड) | 88% | LibriSpeech test-clean, 158 सकारात्मक उच्चारण |
| झूठे सकारात्मक / उच्चारण | 0.27 | 60 नकारात्मक उच्चारण |
| CoreML INT8 बनाम PyTorch FP32 | 99% | उत्सर्जन सहमति |
ट्यून किए गए डिफ़ॉल्ट: acThreshold=0.15, contextScore=0.5, numTrailingBlanks=1। प्रति-कीवर्ड ओवरराइड समर्थित हैं।
CLI उपयोग
सादा वाक्यांश रूप (लोभी BPE — सामान्य शब्दों के लिए अच्छा काम करता है):
audio wake recording.wav --keywords "hey soniqo"
audio wake recording.wav --keywords "hey soniqo:0.15:0.5" "cancel"
पूर्व-टोकनीकृत रूप (sherpa-onnx शैली — अनुशंसित जब आप जानते हों कि मॉडल को किस विशिष्ट विघटन पर प्रशिक्षित किया गया है):
# Format: "phrase|piece1 piece2 ...:threshold:boost"
audio wake recording.wav \
--keywords "LIGHT UP|▁ L IGHT ▁UP:0.25:2.0"
# Multiple keywords + JSON output
audio 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
या एक कीवर्ड फ़ाइल, प्रति पंक्ति एक प्रविष्टि (टिप्पणियों के लिए #):
audio 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)
KeywordSpec
| फ़ील्ड | अर्थ |
|---|---|
phrase | प्रदर्शन वाक्यांश, उदा. "hey soniqo"। जब tokens nil हो तब लोभी BPE एनकोडिंग के लिए स्रोत के रूप में भी उपयोग होता है। |
acThreshold | मिलान किए गए स्पैन पर आवश्यक औसत ध्वनिक संभावना। 0 → ट्यून किया गया डिफ़ॉल्ट (0.15) उपयोग करें। |
boost | प्रति-टोकन संदर्भ बूस्ट। सकारात्मक मान वाक्यांश को ट्रिगर करना आसान बनाते हैं। 0 → ट्यून किया गया डिफ़ॉल्ट (0.5)। |
tokens | वैकल्पिक स्पष्ट BPE टुकड़ा सूची। जब nil नहीं है, डिटेक्टर मॉडल की tokens.txt में प्रत्येक टुकड़े को देखता है और लोभी BPE एनकोडर को बायपास करता है। |
tokens कब उपयोग करेंicefall KWS शब्दावली अपरकेस BPE है। एक वाक्यांश का लोभी टोकनीकरण उस BPE विघटन से भिन्न चुन सकता है जिसे उत्सर्जित करने के लिए मॉडल प्रशिक्षित किया गया था — "LIGHT UP" लोभी रूप से ▁LI GHT ▁UP में कोडित होता है, लेकिन प्रशिक्षण विघटन ▁ L IGHT ▁UP है। जब TTS-संश्लेषित या साफ पठित भाषण पर पहचान स्पष्ट मिलान चूक जाती है, तो sherpa-onnx-शैली पूर्व-टोकनीकृत रूप आज़माएँ।
मॉडल डाउनलोड
| मॉडल | पैरामीटर | आकार | HuggingFace |
|---|---|---|---|
| KWS-Zipformer-3M | 3.49M | ~4 MB | aufklarer/KWS-Zipformer-3M-CoreML-INT8 |
पाइपलाइन एकीकरण
मॉड्यूल एक WakeWordProvider प्रोटोकॉल प्रकट करता है जो StreamingVADProvider को प्रतिबिंबित करता है, ताकि वॉयस पाइपलाइन VAD, वेक-वर्ड, या दोनों पर सक्रियण गेट कर सके। WakeWordStreamingAdapter एक लोडेड डिटेक्टर + एकल सत्र को पुन: उपयोग योग्य provider ऑब्जेक्ट में लपेटता है।
let adapter = try WakeWordStreamingAdapter(detector: detector)
// pipeline.configure(wakeWord: adapter)
स्रोत
- Sources/SpeechWakeWord — Swift मॉड्यूल
- docs/models/kws-zipformer.md — आर्किटेक्चर नोट्स
- docs/inference/wake-word.md — इन्फ़रेंस पाइपलाइन
- अपस्ट्रीम: k2-fsa/icefall KWS रेसिपी / pkufool/keyword-spotting-models