Uyandırma kelimesi / Keyword Spotting

SpeechWakeWord modülü cihaz üzerinde bir keyword spotter çalıştırır: bir cümle listesi kaydedersiniz, ses chunk'larını içeri itersiniz ve algılamaları alırsınız. icefall'ın streaming Zipformer transducer'ına dayanır (3,49M parametre, Apache-2.0); CoreML'e INT8 palettization ile derlenmiştir.

Yalnızca İngilizce

Yayımlanan checkpoint, gigaspeech KWS ince ayarıdır. İngilizce olmayan anahtar kelimeler ayrı bir icefall ince ayarı ve yeniden dışa aktarma gerektirir.

Mimari

AşamaDetaylar
fbankkaldi uyumlu (25 ms / 10 ms, Povey pencere, 80 mel bin, high_freq=-400, CMVN yok)
Encoder6 aşamalı nedensel Zipformer2 (128-dim), 45 mel frame giriş → 8 frame çıkış (40 ms / frame) — 3,3 MB INT8
DecoderDurumsuz transducer, BPE-500 vocab, context size 2 — 525 KB FP16
JoinerLinear + tanh çıktı projection — 160 KB INT8
DecodeKullanıcı anahtar kelimelerinden oluşan Aho-Corasick ContextGraph'ı üzerinde değiştirilmiş beam search (beam=4)

Disk üzerindeki derlenmiş boyut: toplam ~4 MB (encoder.mlmodelc + decoder.mlmodelc + joiner.mlmodelc). Çalışma zamanı belleği: encoder durum cache'leri dahil ~6 MB.

Performans

MetrikDeğerNotlar
RTF (CPU + Neural Engine)0,04M serisinde gerçek zamanın 26 katı
Geri çağırma (12 anahtar kelime)%88LibriSpeech test-clean, 158 pozitif söyleyiş
Söyleyiş başına yanlış pozitif0,2760 negatif söyleyiş
CoreML INT8 ile PyTorch FP32%99Yayım uyumu

Ayarlanmış varsayılanlar: acThreshold=0.15, contextScore=0.5, numTrailingBlanks=1. Anahtar kelime başına geçersiz kılmalar desteklenir.

CLI kullanımı

Düz cümle biçimi (greedy BPE — yaygın kelimeler için iyi çalışır):

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

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

Önceden tokenize edilmiş biçim (sherpa-onnx tarzı — modelin hangi ayrışıma göre eğitildiğini bildiğinizde önerilir):

# Biçim: "phrase|piece1 piece2 ...:threshold:boost"
speech wake recording.wav \
    --keywords "LIGHT UP|▁ L IGHT ▁UP:0.25:2.0"

# Birden çok anahtar kelime + JSON çıktısı
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

Veya satır başına bir giriş içeren bir anahtar kelime dosyası (# yorumlar için):

speech wake recording.wav --keywords-file keywords.txt

Swift API

import SpeechWakeWord

// Modeli anahtar kelime listenizle yükleyin.
let detector = try await WakeWordDetector.fromPretrained(
    keywords: [
        KeywordSpec(phrase: "hey soniqo", acThreshold: 0.15, boost: 0.5),
        KeywordSpec(phrase: "cancel")
    ]
)

// Streaming: chunk'ları itin, algılamalar tetiklendikçe tüketin.
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: tüm buffer üzerinde tek çekim.
let detections = try detector.detect(audio: samples, sampleRate: 16000)

KeywordSpec

AlanAnlam
phraseGörüntülenecek cümle, örn. "hey soniqo". tokens nil olduğunda greedy BPE kodlaması için kaynak olarak da kullanılır.
acThresholdEşleşen aralık üzerinde gerekli ortalama akustik olasılık. 0 → ayarlanmış varsayılanı kullan (0,15).
boostToken başına bağlam boost. Pozitif değerler cümleyi tetiklemeyi kolaylaştırır. 0 → ayarlanmış varsayılanı kullan (0,5).
tokensİsteğe bağlı açık BPE piece listesi. Non-nil olduğunda detector her piece'i modelin tokens.txt'sinde arar ve greedy BPE encoder'ı atlar.
Önceden tokenize edilmiş tokens'ı ne zaman kullanmalı

icefall KWS vocab'ı BÜYÜK HARF BPE'dir. Bir cümlenin greedy tokenizasyonu, modelin yayımlamak üzere eğitildiğinden farklı bir BPE ayrışımı seçebilir — "LIGHT UP" greedy ile ▁LI GHT ▁UP'a kodlanır ama eğitim ayrışımı ▁ L IGHT ▁UP'tır. TTS ile sentezlenmiş veya temiz okuma konuşmasında algılama açık eşleşmeleri kaçırıyorsa, sherpa-onnx tarzı önceden tokenize edilmiş biçimi deneyin.

Model indirmeleri

ModelParametreBoyutHuggingFace
KWS-Zipformer-3M3,49M~4 MBaufklarer/KWS-Zipformer-3M-CoreML-INT8

Pipeline entegrasyonu

Modül, StreamingVADProvider'ı yansıtan bir WakeWordProvider protokolü sunar; böylece bir ses pipeline'ı etkinleştirmeyi VAD, uyandırma kelimesi veya her ikisi üzerinde gate edebilir. WakeWordStreamingAdapter, yüklü bir detector + tek bir session'ı yeniden kullanılabilir bir provider nesnesine sarar.

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

Kaynak