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.

Pouze anglicky

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ázePodrobnosti
fbankkaldikompatibilní (25 ms / 10 ms, Povey window, 80 mel bins, high_freq=-400, no CMVN)
Enkodér6- kauzální fáze Zipformer2 (128- dim), 45 mel rámy v → 8 rámy ven (40 ms / frame) - 3.3 MB INT8
DekodérBezstatný snímač, BPE-500 vocab, kontextová velikost 2 - 525 KB FP16
JoinerLineární + tanh výstupní projekce - 160 KB INT8
DecodeModifikované 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éHodnotaPoznámky
RTF (CPU + Neural Engine)0.0426 × reálný čas na M-series
Recall (12 klíčových slov)88%Test LibriSpeech - čistý, 158 pozitivních slov
Falešná pozitiva / výrok0.2760 negativních projevů
CoreML INT8 vs PyTorch FP3299%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

PoleVýznam
phraseZobrazit frázi, např. "hey soniqo". Také používán jako zdroj pro chamtivé kódování BPE, když tokens je nula.
acThresholdStřední akustická pravděpodobnost požadovaná v porovnání s rozsahem. 0 → použijte laděný výchozí (0.15).
boostPer- token kontextové zvýšení. Pozitivní hodnoty usnadňují spouštění fráze. 0 → použijte laděný výchozí (0.5).
tokensVolitelný 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.
Kdy použít pre- tokenizované tokens

Slovní 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

VzorParamsVelikostHuggingFace
KWS-Zipformer-3M3.49M~ 4 MBaufklarer / 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