תרגום מכונה · המקור באנגלית
זיהוי מילות הפעלה / מילות מפתח
The The The SpeechWakeWord מודול מפעיל מילת מפתח On-device: אתה רושם רשימה של ביטויים, דוחף קטעי אודיו פנימה, ומקבל גילויים. בהתבסס על זרם הסטרימינג של ה- Zipformer של הקרחונים (3.49M params, Apache-2.0), התאספו ל CoreML עם INT8 שיתוק.
המחסום שנשלח הוא הג'יגה-שאט KWS ללא-אנגלית, מילות מפתח לא-אנגלית זקוקות לזינוק נפרד וספורט מחדש.
ארכיטקטורה
| שלב השלב | פרטים |
|---|---|
| Fבנק | תואם kaldi (25 ms / 10 ms, חלון Povey, 80 mel bins, high_freq=-400 |
| Encoder | 6המונחים: Zipformer2 (128- עידנים) 45 המונחים: 8 המונחים:40 ms / מסגרת) - 3.3 MB INT8 |
| Decoder | טרנסדור ללא מדינה, BPE-500 vocab, גודל ההקשר 2 - 525 KB FP16 |
| Joiner | Linear + tanh פלט Projection - 160 KB INT8 |
| Decode | חיפוש באם משתנה (beam=4) על Aho-Corasick ContextGraph |
גודל מתואם על דיסק: - 4 MB הכולל (encoder.mlmodelc + decoder.mlmodelc + joiner.mlmodelc) Runtime Memory: - 6 כולל מצב קודר.
ביצועי ביצועים
| מסובך | ערך | הערות הערות |
|---|---|---|
| RTF (CPU + Neural Engine) | 0.04 | 26× בזמן אמת על M-Series |
| Recall (12 מילות מפתח) | 88% | LibriSpeech Test-clean, 158 הצהרות חיוביות |
| חיובי כוזב / ביטוי | 0.27 | 60 ביטויים שליליים |
| CoreML INT8 לעומת PyTorch FP32 | 99% | הסכם הרשאות |
ברירת מחדל: acThreshold=0.15, contextScore=0.5, numTrailingBlanks=1. Per-keyword Overrides נתמך.
CLI Usage
ביטויים פשוטים (greedy BPE - עובד טוב עבור מילים נפוצות):
speech wake recording.wav --keywords "hey soniqo"
speech wake recording.wav --keywords "hey soniqo:0.15:0.5" "cancel"
צורה מוקדמת (סגנון הרפה-און-נגס) המומלצת כאשר אתה יודע את הפירוק המדויק שהמודל הוכשר עליו):
# 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
או קובץ מילות מפתח, כניסה אחת לכל שורה (# עבור הערות):
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)
מילות מפתח
| שדה שדה | משמעות משמעות משמעות |
|---|---|
phrase | ביטוי תצוגה, למשל "hey soniqo", משמש גם כמקור עבור BPE אנתרופולוגיה חמדנית כאשר tokens הוא nil. |
acThreshold | הסתברות אקוסטית הנדרשת לאורך זמן התואם 0 השתמש ברירת מחדל מכוונת (0.15). |
boost | שיפור הקשר Per-token. ערכים חיוביים מקל על הביטוי 0 שימוש ברירת מחדל מכוונן (0.5). |
tokens | רשימת פריטים מפורשים BPE.When non-nil, הגלאי מסתכל כל חתיכה ב tokens.txt ומעביר את הקוד ה- BPE החמוד. |
tokensאוצר המילים של KWS הוא מזוודה BPE.התקדשות של ביטוי יכולה לבחור פיזור BPE שונה מזו שהמודל הוכשר לפלט - - - - "LIGHT UP" קודים חמדניים ▁LI GHT ▁UP אבל מגמת האימון היא ▁ L IGHT ▁UPכאשר גילוי על דיבור קורא TTS-S-synthesised או נקי מפספס משחקים ברורים, נסה את הצורה pre-onnx בסגנון pre-tokenized.
דגם Downloads
| מודל מודל | Params | גודל | HuggingFace |
|---|---|---|---|
| KWS-Zipformer-3M | 3.49M | 4 MB | aufklarer/KWS-Zipformer-3M-CoreML-INT8 |
שילוב Pipeline
המודול חושף פרוטוקול WakeWordProvider המראה StreamingVADProvider, כך צינור קול יכול להפעיל שער על VAD, RE-word, או שניהם WakeWordStreamingAdapter
let adapter = try WakeWordStreamingAdapter(detector: detector)
// pipeline.configure(wakeWord: adapter)
מקור Source
- Sources/SpeechWakeWord - Swiftמודול
- docs/מודלים/kws-zipformer.md - אדריכלות מציינת
- docs/inference/wake-word.md - שיבוש צינורות
- Upstream: k2-fsa/icefall מתכון KWS / pkufool /keyword-spotting-מודלים