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.

Solo inglese

Il checkpoint spedito è il gigaspeech KWS fine-tune. Le parole chiave non inglese hanno bisogno di una scanalatura separata fine-tuna e riesportazione.

Architettura

FaseDettagli
FFcompatibile (25 ms / 10 ms, finestra Povey, 80 mel bins, high_freq=-400, no CMVN)
Encoder6 stadi causali Zipformer2 (128-dim), 45 mel frames in → 8 frame out (40 ms / frame) — 3.3 MB INT8
DecoderTrasduttore senza Stato, BPE-500 vocab, dimensione del contesto 2 — 525 KB FP16
FalegnameriaProiezione di uscita lineare + tanh — 160 KB INT8
DenominazioneRicerca 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

MetricoValoreOsservazioni
RTF (CPU + Neural Engine)0.0426× in tempo reale su serie M
Richiamo (12 parole chiave)88%LibriSpeech test-clean, 158 pronunce positive
Falsi positivi / pronuncia0.2760 pronunce negative
CoreML INT8 vs PyTorch FP3299%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 applicazioneSignificato
phraseIndicare la frase, ad esempio "hey soniqo". Utilizzato anche come fonte per la codifica BPE avida quando tokens è nil.
acThresholdUna probabilità acustica media richiesta durante l'arco abbinato. 0 → utilizzare default sintonizzato (0.15).
boostI valori positivi rendono la frase più facile da attivare. 0 → utilizzare default sintonizzato (0.5).
tokensOpzionale elenco pezzo esplicito BPE. Quando non-nil, il rivelatore guarda ogni pezzo in su nel modello 's tokens.txt
Quando si utilizza tokens

Il 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

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