Traducere automată · Originalul în engleză

Detectarea cuvintelor de activare / cuvintelor-cheie

Modulul SpeechWakeWord ruleaza un spotter cu cuvinte cheie pe dispozitiv: inregistrezi o lista de fraze, impingi bucati audio inauntru, si primesti detectii. Pe baza streamingului Zipformer Traductor (3.49M params, Apache-2.0), compilat la CoreML cu INT8 palettizare.

Doar engleză

Punctul de control expediat este gigas speech KWS fin-tune. Cuvinte cheie non-engleze au nevoie de o altă cascadă de gheață fin-tun și reexport.

Arhitectură

Etape Detalii
fbankkaldi-compatibil (25 ms / 10 ms, fereastra Povey, 80 mel binuri, high_freq=-400, no CMVN)
Codor6- cauzal în stadiu Zipformer2 (128- dim), 45 cadre mel în → 8 cadre în afara (40 ms / frame) 3.3 MB INT8
DecodorTraductor fără stat, BPE-500 vocab, dimensiunea contextului 2 525 KB FP16
JoinerProiecţie de ieşire liniară + tanh 160 KB INT8
Decodează Căutare modificată a grinzilor (bază = 4) pe un Aho-Corasick ContextGraph de cuvinte cheie ale utilizatorului

Dimensiune compilată pe disc: ~4 MB total (encoder.mlmodelc + decoder.mlmodelc + joiner.mlmodelc). Memorie pe timp de execuție: ~6 MB inclusiv cache-uri de stat encoder.

Performanță

Metrică ValoareNote
RTF (CPU + Neural Engine)0.0426× în timp real pe seria M
Reamintire (12 cuvinte-cheie)88%LibriSpeech test-clean, 158 declaraţii pozitive
False pozitive / declaraţii0.2760 de declaraţii negative
CoreML INT8 vs PyTorch FP3299% Acordul privind emisiile

Neconcordanțe tunate: acThreshold=0.15, contextScore=0.5, numTrailingBlanks=1Per-cuvinte cheie suprascrie acceptate.

Utilizarea CLI

Formular simplu-fraza (greu BPE

speech wake recording.wav --keywords "hey soniqo"

speech wake recording.wav --keywords "hey soniqo:0.15:0.5" "cancel"

Forma pre-tokenizata (stilul sherpa-onnx recomandata cand stii exact descompunerea modelului a fost antrenata pe):

# 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

Sau un fișier cu cuvinte cheie, o intrare pe linie (# pentru comentarii):

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)

Cuvinte cheieSpec

Câmp Semnificație
phraseAfișează fraza, de exemplu "hey soniqo". De asemenea, utilizată ca sursă pentru codarea BPE lacomă atunci când tokens este zero.
acThreshold Probabilitatea acustică medie necesară pentru intervalul corespunzător. 0 → utilizare reglată implicit (0,15).
boost Mărirea contextului per-token. Valorile pozitive fac fraza mai ușor de declanșat. 0 → utilizarea reglată implicit (0,5).
tokens Lista de piese BPE explicită opțională. Atunci când nu este zero, detectorul se uită fiecare piesă din modelul tokens.txt și ocolește codorul BPE lacom.
Atunci când se utilizează pre-tokenizate tokens

Icefall KWS vocabular este Uppercase BPE. Tokenizarea lacomă a unei fraze poate alege o descompunere BPE diferită de cea pe care modelul a fost antrenat să o emită "LIGHT UP" coduri lacome la ▁LI GHT ▁UP dar descompunerea de formare este ▁ L IGHT ▁UP. Atunci când detectarea pe TTS-sintezat sau curat de citire discurs ratează meciuri evidente, încercați Sherpa-onnx-stil pre-tokenized formă.

Modele de descărcări

ModelParameleDimensiuneHuggingFace
KWS-Zipformer-3M3.49M~4 MOaufklarer/KWS-Zipformer-3M-CoreML-INT8

Integrarea conductelor

Modulul expune un protocol WakeWordProvider care reflectă StreamingVADProvider, astfel încât o conductă vocală poate activa poarta pe VAD, wake-word, sau ambele. WakeWordStreamingAdapter învelește un detector încărcat + o singură sesiune într-un obiect furnizor reutilizabil.

let adapter = try WakeWordStreamingAdapter(detector: detector)
// pipeline.configure(wakeWord: adapter)

Sursă