Maskinoversettelse · Engelsk original
Påvisning av aktiveringsord / nøkkelord
Den SpeechWakeWord modulen kjører en søkeordspotter på enhet: du registrerer en liste over fraser, trykker lydbiter i og mottar deteksjoner. Basert på isfallets streaming av Zipformer-transducer (3.49M params, Apache-2.0), kompilert til CoreML med INT8 palettisering.
Den fraktede sjekkpunktet er gigaspeech KWS fin-tune. Ikke-engelske søkeord trenger en separat isfall fin-tun og re-eksport.
Arkitektur
| Stage | Detaljer |
|---|---|
| fbank | caldi-kompatibel (25 ms / 10 ms, Povey-vindu, 80 mel-biner, high_freq=-400, ingen CMVN) |
| Koder | 6-trinns årsak Zipformer2 (128-dim), 45 mel rammer i → 8 rammer ut (40 ms / ramme) — 3.3 MB INT8 |
| Dehydrering | Tilstandsløs transducer, BPE-500 vokab, kontekststørrelse 2 — 525 KB FP16 |
| Joiner | Linear + tanh utgangsprojeksjon — 160 KB INT8 |
| Decode | Endret strålesøk (beam=4) over en Aho-Corasick ContextGraph av brukernavn |
Kompilert størrelse på disken: ~ 4 MB total (encoder.mlmodelc + decoder.mlmodelc +joiner.mlmodelc). Runetidsminne: ~ 6 MB inkludert kodertilstandsbuffere.
Ytelse
| Metrisk | Verdi | Noter |
|---|---|---|
| RTF (CPU + Neural Engine) | 0.04 | 26× sanntid på M-serien |
| Husk (12 nøkkelord) | 88% | Libri Speech Test-clean, 158 positive uttalelser |
| Falske positive / uttalelse | 0.27 | 60 negative uttalelser |
| CoreML INT8 vs PyTorch FP32 | 99% | Utslippsavtale |
Tunert standard: acThreshold=0.15, contextScore=0.5, numTrailingBlanks=1. Per-keyword overstyrer støttet.
CLI bruk
Plain-frase form (greedy BPE - fungerer bra for vanlige ord):
speech wake recording.wav --keywords "hey soniqo"
speech wake recording.wav --keywords "hey soniqo:0.15:0.5" "cancel"
Forhåndstokenisert form (sherpa-onnx-stilen — anbefalt når du vet nøyaktig dekomponering modellen ble trent på):
# 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
Eller en nøkkelordfil, én oppføring per linje (# for kommentarer):
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)
NøkkelordSpec
| Felt | Betydning |
|---|---|
phrase | Vis frase, for eksempel "hey soniqo". Også brukt som kilde for grådig BPE-koding når tokens er nil. |
acThreshold | Gjennomsnittlig akustisk sannsynlighet som kreves over det matchede spennet. 0 → bruk tuned standard (0,15). |
boost | Per-token kontekst boost. Positive verdier gjør frasen enklere å utløse. 0 → bruk tuned standard (0,5). |
tokens | Valgfri eksplisitt BPE-stykkeliste. Når detektoren ikke-nil ser hvert stykke opp i modellens tokens.txt og omgår den grådige BPE-koderen. |
tokensIsfall KWS vokabulær er uppercase BPE. Grydig tokenisering av et uttrykk kan velge en annen BPE dekomponering fra den modellen som ble trent til å utsende - "LIGHT UP" griske-koder til ▁LI GHT ▁UP men treningsdekomponeringen er ▁ L IGHT ▁UP. Når deteksjonen på TTS-syntese eller ren lese tale mangler åpenbare kamper, prøv sherpa-onnx-stil pretokenisert form.
Modellnedlastninger
| Modell | Params | Størrelse | HuggingFace |
|---|---|---|---|
| KWS-Zipformer-3M | 3.49M | ~ 4 MB | aufklarer/KWS-Zipformer-3M-CoreML-INT8 |
Integrasjon av pipeline
Modulen avslører en WakeWordProvider protokoll som speiler StreamingVADProvider, slik at en stemmerørledning kan gateaktivere på VAD, wake-word, eller begge. WakeWordStreamingAdapter
let adapter = try WakeWordStreamingAdapter(detector: detector)
// pipeline.configure(wakeWord: adapter)
Kilde
- Kjelder/ServiceWakeWord — Swift modul
- docs/models/kws-zipformer.md — arkitekturnotater
- docs/inferens/wake-word.md - inferensrørledning
- Oppstrøm: k2-fsa/isfall KWS oppskrift / pkufool/keyword-spotting-models