Automatische vertaling · Engels origineel
Detectie van activeringswoorden / trefwoorden
De SpeechWakeWord module draait een on-device keyword spotter: u registreert een lijst van zinnen, duwt audio brokken in, en ontvangt detecties. Gebaseerd op ijsval streaming Zipformer transducer (3.49M params, Apache-2.0), gecompileerd naar CoreML met INT8 palettisering.
De verzonden checkpoint is de gigaspeech KWS fine-tune. Niet-Engelse trefwoorden hebben een aparte ijsval fijne-tune en opnieuw exporteren.
Architectuur
| Fase | Gegevens |
|---|---|
| fbank | kaldi-compatible (25 ms / 10 ms, Povey window, 80 mel bins, high_freq=-400, geen CMVN) |
| Encoder | 6-stadium causaal Zipformer2 (128- dim), 45 mel frames in → 8 frames uit (40 ms / frame) 3.3 MB INT8 |
| Decoder | staatloze transducer, BPE-500 vocab, contextgrootte 2 — 525 KB FP16 |
| Joiner | Lineaire + tanh-outputprojectie 160 KB INT8 |
| Decoderen | Modified beam search (beam=4) over een Aho-Corasick ContextGraph van gebruikerstrefwoorden |
Gecompileerde grootte op schijf: 4 MB Totaal (encoder.mlmodelc + decoder.mlmodelc + joiner.mlmodelc). Runtime geheugen: ~6 MB inclusief encoder state caches.
Prestaties
| Metrisch | Waarde | Opmerkingen |
|---|---|---|
| RTF (CPU + Neural Engine) | 0.04 | 26× real-time op M-serie |
| Herinnering (12 trefwoorden) | 88% | LibriSpeech test-clean, 158 positieve uitingen |
| Valse positieven / uitspraak | 0.27 | 60 negatieve uitingen |
| CoreML INT8 vs PyTorch FP32 | 99% | Emissieovereenkomst |
Gestemde standaardwaarden: acThreshold=0.15, contextScore=0.5, numTrailingBlanks=1. Per-sleutelwoord wordt overschreven.
CLI-gebruik
Gewoonte-zinvorm (willige BPE .. werkt goed voor gewone woorden):
speech wake recording.wav --keywords "hey soniqo"
speech wake recording.wav --keywords "hey soniqo:0.15:0.5" "cancel"
Pre-tokenized vorm (sherpa-onnx stijl aanbevolen als u weet dat de exacte ontleding van het model werd getraind op):
# 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
Of een keyword bestand, één regel per regel (# voor commentaar):
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)
TrefwoordSpec
| Veld | Betekenis |
|---|---|
phrase | Toon de zin, bijvoorbeeld "hey soniqo". Wordt ook gebruikt als bron voor hebzuchtige BPE-codering wanneer tokens nul is. |
acThreshold | Gemiddelde akoestische waarschijnlijkheid vereist over de bijbehorende spanwijdte. 0 → gebruik tuned standaard (0.15). |
boost | Per-token context boost. Positieve waarden maken de zin gemakkelijker te activeren. 0 → gebruik tuned default (0.5). |
tokens | Optionele expliciete BPE-stuklijst. Wanneer niet-nil, de detector kijkt elk stuk omhoog in de tokens.txt van het model en omzeilt de hebzuchtige BPE-encoder. |
tokens worden gebruikt?De ijsval KWS woordenschat is hoofdletter BPE. Hebzuchtige tokenization van een zin kan kiezen voor een andere BPE ontbinding van degene die het model werd getraind om uit te zenden . "LIGHT UP" hebzuchtige-encodes om ▁LI GHT ▁UP maar de training ontleding is ▁ L IGHT ▁UP. Wanneer detectie op TTS-gesynthetiseerde of clean read speech duidelijke overeenkomsten mist, probeer dan het sherpa-onnx-stijl pre-tokenized formulier.
Modeldownloads
| Model | Params | Grootte | HuggingFace |
|---|---|---|---|
| KWS-Zipformer-3M | 3.49M | ~4 MB | aufklarer/KWS-Zipformer-3M-CoreML-INT8 |
Integratie van pijpleidingen
De module stelt een WakeWordProvider protocol bloot dat StreamingVADProvider spiegelt, zodat een spraakpijplijn de activering op VAD, wake-word, of beide kan gaten. WakeWordStreamingAdapter wrapt een geladen detector + een enkele sessie in een herbruikbare provider-object.
let adapter = try WakeWordStreamingAdapter(detector: detector)
// pipeline.configure(wakeWord: adapter)
Bron
- Bronnen/SpeechWakeWord andere Swift module
- docs/models/kws-zipformer.md
- docs/invoice/wake-word.mdInvoice pipeline
- Upstream: k2-fsa/icefall KWS recept / pkufool/keyword-spotting-modellen