Traducere automată · Originalul în engleză
Detectarea cuvintelor de activare / cuvintelor-cheie
Modulul SpeechWakeWord ruleaza un spotter cu cuvinte cheie pe dispozitiv: inregistrezi o lista de fraze, impingi bucati audio inauntru, si primesti detectii. Pe baza streamingului Zipformer Traductor (3.49M params, Apache-2.0), compilat la CoreML cu INT8 palettizare.
Punctul de control expediat este gigas speech KWS fin-tune. Cuvinte cheie non-engleze au nevoie de o altă cascadă de gheață fin-tun și reexport.
Arhitectură
| Etape | Detalii |
|---|---|
| fbank | kaldi-compatibil (25 ms / 10 ms, fereastra Povey, 80 mel binuri, high_freq=-400, no CMVN) |
| Codor | 6- cauzal în stadiu Zipformer2 (128- dim), 45 cadre mel în → 8 cadre în afara (40 ms / frame) 3.3 MB INT8 |
| Decodor | Traductor fără stat, BPE-500 vocab, dimensiunea contextului 2 525 KB FP16 |
| Joiner | Proiecţie de ieşire liniară + tanh 160 KB INT8 |
| Decodează | Căutare modificată a grinzilor (bază = 4) pe un Aho-Corasick ContextGraph de cuvinte cheie ale utilizatorului |
Dimensiune compilată pe disc: ~4 MB total (encoder.mlmodelc + decoder.mlmodelc + joiner.mlmodelc). Memorie pe timp de execuție: ~6 MB inclusiv cache-uri de stat encoder.
Performanță
| Metrică | Valoare | Note |
|---|---|---|
| RTF (CPU + Neural Engine) | 0.04 | 26× în timp real pe seria M |
| Reamintire (12 cuvinte-cheie) | 88% | LibriSpeech test-clean, 158 declaraţii pozitive |
| False pozitive / declaraţii | 0.27 | 60 de declaraţii negative |
| CoreML INT8 vs PyTorch FP32 | 99% | Acordul privind emisiile |
Neconcordanțe tunate: acThreshold=0.15, contextScore=0.5, numTrailingBlanks=1Per-cuvinte cheie suprascrie acceptate.
Utilizarea CLI
Formular simplu-fraza (greu BPE
speech wake recording.wav --keywords "hey soniqo"
speech wake recording.wav --keywords "hey soniqo:0.15:0.5" "cancel"
Forma pre-tokenizata (stilul sherpa-onnx recomandata cand stii exact descompunerea modelului a fost antrenata pe):
# 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
Sau un fișier cu cuvinte cheie, o intrare pe linie (# pentru comentarii):
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)
Cuvinte cheieSpec
| Câmp | Semnificație |
|---|---|
phrase | Afișează fraza, de exemplu "hey soniqo". De asemenea, utilizată ca sursă pentru codarea BPE lacomă atunci când tokens este zero. |
acThreshold | Probabilitatea acustică medie necesară pentru intervalul corespunzător. 0 → utilizare reglată implicit (0,15). |
boost | Mărirea contextului per-token. Valorile pozitive fac fraza mai ușor de declanșat. 0 → utilizarea reglată implicit (0,5). |
tokens | Lista de piese BPE explicită opțională. Atunci când nu este zero, detectorul se uită fiecare piesă din modelul tokens.txt și ocolește codorul BPE lacom. |
tokensIcefall KWS vocabular este Uppercase BPE. Tokenizarea lacomă a unei fraze poate alege o descompunere BPE diferită de cea pe care modelul a fost antrenat să o emită "LIGHT UP" coduri lacome la ▁LI GHT ▁UP dar descompunerea de formare este ▁ L IGHT ▁UP. Atunci când detectarea pe TTS-sintezat sau curat de citire discurs ratează meciuri evidente, încercați Sherpa-onnx-stil pre-tokenized formă.
Modele de descărcări
| Model | Paramele | Dimensiune | HuggingFace |
|---|---|---|---|
| KWS-Zipformer-3M | 3.49M | ~4 MO | aufklarer/KWS-Zipformer-3M-CoreML-INT8 |
Integrarea conductelor
Modulul expune un protocol WakeWordProvider care reflectă StreamingVADProvider, astfel încât o conductă vocală poate activa poarta pe VAD, wake-word, sau ambele. WakeWordStreamingAdapter învelește un detector încărcat + o singură sesiune într-un obiect furnizor reutilizabil.
let adapter = try WakeWordStreamingAdapter(detector: detector)
// pipeline.configure(wakeWord: adapter)
Sursă
- Surse/SpeechWakeWord ا Swift modul
- docuri/modele/kws-zipformer.md note arhitecturale
- docs/inference/wake-word.md
- Upstream: k2-fsa/icefall Rețetă KWS / pkufool/key-words spotting-models