वेक-वर्ड / कीवर्ड स्पॉटिंग

SpeechWakeWord मॉड्यूल ऑन-डिवाइस कीवर्ड स्पॉटर चलाता है: आप वाक्यांशों की सूची पंजीकृत करते हैं, ऑडियो चंक धकेलते हैं और पहचानें प्राप्त करते हैं। icefall के स्ट्रीमिंग Zipformer ट्रांसड्यूसर (3.49M पैरामीटर, Apache-2.0) पर आधारित, INT8 पैलेटीकरण के साथ CoreML में संकलित।

केवल अंग्रेज़ी

भेजा गया checkpoint gigaspeech KWS फ़ाइन-ट्यून है। गैर-अंग्रेज़ी कीवर्ड्स के लिए अलग icefall फ़ाइन-ट्यून और री-एक्सपोर्ट की आवश्यकता है।

आर्किटेक्चर

चरणविवरण
fbankkaldi-संगत (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.04M-सीरीज़ पर 26× रियल-टाइम
Recall (12 कीवर्ड)88%LibriSpeech test-clean, 158 सकारात्मक उच्चारण
झूठे सकारात्मक / उच्चारण0.2760 नकारात्मक उच्चारण
CoreML INT8 बनाम PyTorch FP3299%उत्सर्जन सहमति

ट्यून किए गए डिफ़ॉल्ट: 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-3M3.49M~4 MBaufklarer/KWS-Zipformer-3M-CoreML-INT8

पाइपलाइन एकीकरण

मॉड्यूल एक WakeWordProvider प्रोटोकॉल प्रकट करता है जो StreamingVADProvider को प्रतिबिंबित करता है, ताकि वॉयस पाइपलाइन VAD, वेक-वर्ड, या दोनों पर सक्रियण गेट कर सके। WakeWordStreamingAdapter एक लोडेड डिटेक्टर + एकल सत्र को पुन: उपयोग योग्य provider ऑब्जेक्ट में लपेटता है।

let adapter = try WakeWordStreamingAdapter(detector: detector)
// pipeline.configure(wakeWord: adapter)

स्रोत