Strojový překlad · Anglický originál
Detekce aktivačních / klíčových slov
V SpeechWakeWord modul běží na zařízení klíčový slovo pozorovatel: registrujete seznam frází, push audio kousky v, a přijímat detekce. na základě streaming zipformer převodník (3.49M params, Apache-2.0), sestavený na CoreML s INT8 palettization.
Odeslané kontrolní stanoviště je gigaspeech KWS fine- tune. Non- English klíčová slova potřebují samostatný lecefall fine- tone a re- export.
Architektura
| Fáze | Podrobnosti |
|---|---|
| fbank | kaldikompatibilní (25 ms / 10 ms, Povey window, 80 mel bins, high_freq=-400, no CMVN) |
| Enkodér | 6- kauzální fáze Zipformer2 (128- dim), 45 mel rámy v → 8 rámy ven (40 ms / frame) - 3.3 MB INT8 |
| Dekodér | Bezstatný snímač, BPE-500 vocab, kontextová velikost 2 - 525 KB FP16 |
| Joiner | Lineární + tanh výstupní projekce - 160 KB INT8 |
| Decode | Modifikované vyhledávání paprsků (paprsek = 4) nad Aho- Corasick ContextGraph uživatelských klíčových slov |
Velikost kompilované na disku: ~ 4 MB celkem (encoder.mlmodelc + decoder.mlmodelc + joiner.mlmodelc). Runtime memory: ~ 6 MB včetně kódovacích stavů cache.
Výkonnost
| Metrické | Hodnota | Poznámky |
|---|---|---|
| RTF (CPU + Neural Engine) | 0.04 | 26 × reálný čas na M-series |
| Recall (12 klíčových slov) | 88% | Test LibriSpeech - čistý, 158 pozitivních slov |
| Falešná pozitiva / výrok | 0.27 | 60 negativních projevů |
| CoreML INT8 vs PyTorch FP32 | 99% | Dohoda o emisích |
Vyladěné vady: acThreshold=0.15, contextScore=0.5, numTrailingBlanks=1. Per- klíčová slova překrývá podporované.
Použití CLI
Prostá fráze (chamtivý BPE - funguje dobře pro společná slova):
speech wake recording.wav --keywords "hey soniqo"
speech wake recording.wav --keywords "hey soniqo:0.15:0.5" "cancel"
Pre- tokenizovaná forma (styl sherpa- onnx - doporučujeme, když víte, že přesné rozkladu model byl vyškolen na):
# 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
Nebo soubor klíčových slov, jeden záznam na řádek (# k připomínkám):
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)
KeywordSpec
| Pole | Význam |
|---|---|
phrase | Zobrazit frázi, např. "hey soniqo". Také používán jako zdroj pro chamtivé kódování BPE, když tokens je nula. |
acThreshold | Střední akustická pravděpodobnost požadovaná v porovnání s rozsahem. 0 → použijte laděný výchozí (0.15). |
boost | Per- token kontextové zvýšení. Pozitivní hodnoty usnadňují spouštění fráze. 0 → použijte laděný výchozí (0.5). |
tokens | Volitelný explicitní seznam BPE kusů. Když non-nula, detektor se dívá každý kus nahoru v modelu tokens.txt a obejde chamtivý BPE kodér. |
tokensSlovní zásoba KWS je Horní kryt BPE. Chamtivá tokenizace fráze může vybrat jiný BPE rozklad od toho, který model byl vycvičen, aby emitoval - "LIGHT UP" greedy- encods to ▁LI GHT ▁UP ale rozklad výcviku je ▁ L IGHT ▁UP. Pokud detekce na TTS- syntetizované nebo čisté čtení řeči chybí zřejmé zápasy, zkuste Sherpa- onnx- styl pre- tokenizované formě.
Stáhnout model
| Vzor | Params | Velikost | HuggingFace |
|---|---|---|---|
| KWS-Zipformer-3M | 3.49M | ~ 4 MB | aufklarer / KWS-Zipformer-3M-CoreML-INT8 |
Integrace potrubí
Modul odhaluje WakeWordProvider protokol, který odráží StreamingVADProvider, takže hlasové potrubí může spustit aktivaci na VAD, Wake- slovo, nebo obojí. WakeWordStreamingAdapter zabalí načtený detektor + jedno sezení do objektu poskytovatele, který je znovu použitelný.
let adapter = try WakeWordStreamingAdapter(detector: detector)
// pipeline.configure(wakeWord: adapter)
Zdroj
- Zdroje / SpeechWakeWord - Swift modul
- docs / models / kws-zipformer.md - poznámky k architektuře
- docs / inference / wake- word.md - odvodňovací potrubí
- Vnější proud: k2-fsa / ledovec Recept KWS / pkufool / klíčová slova-spotting-modely