Traduzione automatica · Originale inglese
Rilevamento di parole di attivazione / parole chiave
Il SpeechWakeWord Il modulo esegue un puntatore di parole chiave on-device: si registra un elenco di frasi, spingere i pezzi audio in, e ricevere le rilevazioni. Basato sul trasduttore di Zipformer di icefall (3.49M params, Apache-2.0), compilato a CoreML con la palettizzazione INT8.
Il checkpoint spedito è il gigaspeech KWS fine-tune. Le parole chiave non inglese hanno bisogno di una scanalatura separata fine-tuna e riesportazione.
Architettura
| Fase | Dettagli |
|---|---|
| FF | compatibile (25 ms / 10 ms, finestra Povey, 80 mel bins, high_freq=-400, no CMVN) |
| Encoder | 6 stadi causali Zipformer2 (128-dim), 45 mel frames in → 8 frame out (40 ms / frame) — 3.3 MB INT8 |
| Decoder | Trasduttore senza Stato, BPE-500 vocab, dimensione del contesto 2 — 525 KB FP16 |
| Falegnameria | Proiezione di uscita lineare + tanh — 160 KB INT8 |
| Denominazione | Ricerca del fascio modificato (beam=4) su un Aho-Corasick ContextGraph delle parole chiave dell'utente |
Dimensione completa su disco: ~ 4 MB totale (encoder.mlmodelc + decoder.mlmodelc + joiner.mlmodelc). Memoria Runtime: ~6 MB, comprese le cache dello stato di encoder.
Prestazioni
| Metrico | Valore | Osservazioni |
|---|---|---|
| RTF (CPU + Neural Engine) | 0.04 | 26× in tempo reale su serie M |
| Richiamo (12 parole chiave) | 88% | LibriSpeech test-clean, 158 pronunce positive |
| Falsi positivi / pronuncia | 0.27 | 60 pronunce negative |
| CoreML INT8 vs PyTorch FP32 | 99% | Accordo di emissione |
Di default sintonizzati: acThreshold=0.15, contextScore=0.5, numTrailingBlanks=1. Per-chiave overrides supportato.
Uso CLI
La forma della plasma-frasi (grande BPE — funziona bene per parole comuni):
speech wake recording.wav --keywords "hey soniqo"
speech wake recording.wav --keywords "hey soniqo:0.15:0.5" "cancel"
Forma pre-tokenizzata (seropa-onnx stile - consigliato quando si conosce la decomposizione esatta il modello è stato addestrato su):
# 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
O un file di parole chiave, una voce per riga (# per i commenti):
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)
Parole chiave
| Campo di applicazione | Significato |
|---|---|
phrase | Indicare la frase, ad esempio "hey soniqo". Utilizzato anche come fonte per la codifica BPE avida quando tokens è nil. |
acThreshold | Una probabilità acustica media richiesta durante l'arco abbinato. 0 → utilizzare default sintonizzato (0.15). |
boost | I valori positivi rendono la frase più facile da attivare. 0 → utilizzare default sintonizzato (0.5). |
tokens | Opzionale elenco pezzo esplicito BPE. Quando non-nil, il rivelatore guarda ogni pezzo in su nel modello 's tokens.txt |
tokensIl vocabolario KWS è maiuscolo BPE. Tokenizzazione avidi di una frase può scegliere una diversa decomposizione BPE da quella che il modello è stato addestrato per emettere — "LIGHT UP" greedy-encodes a ▁LI GHT ▁UP ma la decomposizione di formazione è ▁ L IGHT ▁UP. Quando il rilevamento su TTS-sintetico o pulito discorso di lettura manca ovvie partite, provare la forma pre-tokenizzata sherpa-onnx-style.
Download del modello
| Modello | Params | Dimensione | HuggingFace |
|---|---|---|---|
| KWS-Zipformer-3M | 3.49M | ~ 4 MB | aufklarer/KWS-Zipformer-3M-CoreML-INT8 |
Integrazione del tubo
Il modulo espone un WakeWordProvider protocollo che specchi StreamingVADProvider, quindi un canale vocale può attivare l'attivazione di VAD, la parola sveglia, o entrambi. WakeWordStreamingAdapter avvolge un rilevatore caricato + una singola sessione in un oggetto di provider riutilizzabile.
let adapter = try WakeWordStreamingAdapter(detector: detector)
// pipeline.configure(wakeWord: adapter)
Fonte
- Fonti/SpeechWakeWord — Swift
- docs/models/kws-zipformer.md — Note di architettura
- docs/inference/wake-word.md — pipeline di inferenza
- A monte: k2-fsa/icefall Ricetta KWS / pkufool/modelli di parola chiave-spotting-