Tłumaczenie automatyczne · Oryginał angielski
Wykrywanie słów wybudzających / kluczowych
W SpeechWakeWord Moduł uruchamia urządzenie do wyszukiwania słów kluczowych: rejestruje się listę zwrotów, wciska fragmenty audio i odbiera wykrywanie. Na podstawie strumieniowego przetwornika Zipformer icefall (3.49M params, Apache-2.0), skompilowanego do CoreML z paletyzacją INT8.
Przesyłany punkt kontrolny jest gigaspeech KWS fine- tune. Non-English słowa kluczowe potrzebują oddzielnego icefall fine- melodie i re- eksport.
Architektura
| Etap | Szczegóły |
|---|---|
| fbank | kaldi- kompatybilne (25 ms / 10 MS, Okno Povey, 80 mel bins, high_freq=-400, no CMVN) |
| Enkoder | 6- stopień przyczynowości Zipformer2 (128- Dim), 45 Male ramki w → 8 Ramki (40 ms / frame) - 3.3 MB INT8 |
| Dekoder | Przetwornik bezpaństwowy, słownik BPE-500, rozmiar kontekstowy 2 - 525 KB FP16 |
| Joiner | Linear + tanh projection output - 160 KB INT8 |
| Dekodowanie | Zmodyfikowane wyszukiwanie wiązki (belka = 4) nad Aho- Corasick ContextGraph słów kluczowych użytkownika |
Skopiowany rozmiar na dysku: - 4 MB ogółem (encoder.mlmodelc + decoder.mlmodelc + joiner.mlmodelc). Pamięć Runtime: ~ 6 MB w tym pamięci kodowej.
Wydajność
| Metric | Wartość | Uwagi |
|---|---|---|
| RTF (CPU + Neural Engine) | 0.04 | 26 × real- time na serii M- |
| Przypomnij (12 słów kluczowych) | 88% | LibriSpeech test-clean, 158 pozytywnych wypowiedzi |
| Fałszywe pozytywne / wymowne | 0.27 | 60 negatywnych wypowiedzi |
| CoreML INT8 vs PyTorch FP32 | 99% | Umowa w sprawie emisji |
Domyślne ustawienia domyślne: acThreshold=0.15, contextScore=0.5, numTrailingBlanks=1. Per- słowo kluczowe nadrzędne obsługiwane.
Zastosowanie CLI
Prosta forma frazy (zachłanny BPE - działa dobrze na słowa wspólne):
speech wake recording.wav --keywords "hey soniqo"
speech wake recording.wav --keywords "hey soniqo:0.15:0.5" "cancel"
Forma wstępnie zokenizowana (styl sherpa- onnx - zaleca się, gdy znasz dokładny rozkład modelu został wyszkolony):
# 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
Albo plik słów kluczowych, jeden wpis na linię (# w odniesieniu do uwag):
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 | Znaczenie |
|---|---|
phrase | Wyświetl wyrażenie, np. "hey soniqo"Używane również jako źródło chciwego kodowania BPE, gdy tokens jest zero. |
acThreshold | Średnie prawdopodobieństwo akustyczne wymagane przez dopasowany zakres. 0 → użyj domyślnych dostrojeń (0.15). |
boost | Optymalne wzmocnienie kontekstu. Pozytywne wartości ułatwiają uruchamianie wyrażenia. 0 → użyj domyślnych dostrojeń (0.5). |
tokens | Opcjonalnie wyraźna lista elementów BPE. Kiedy nie-zero, detektor sprawdza każdy element w modelu tokens.txt i omija chciwego kodera BPE. |
tokensSłownictwo icefall KWS jest górny BPE. Chciwy tokenizacja frazy może wybrać inny rozkład BPE od tego model został wyszkolony do emitowania - "LIGHT UP" kody greedy- encodes do ▁LI GHT ▁UP ale rozkład treningu jest ▁ L IGHT ▁UPKiedy wykrycie na TTS- syntetyzowanej lub czystej mowy odczytu nie jest oczywiste mecze, spróbuj sherpa- onnx- style pre- tokenizowanej formie.
Pobieranie modeli
| Wzór | Params | Rozmiar | HuggingFace |
|---|---|---|---|
| KWS-Zipformer-3M | 3.49M | ~ 4 MB | aufklarer / KWS-Zipformer-3M-CoreML-INT8 |
Integracja rurociągów
Moduł ujawnia WakeWordProvider protokół lustrzany StreamingVADProvider, więc rurociąg głosowy może aktywować bramkę na VAD, słowo wake- lub oba. WakeWordStreamingAdapter zawija załadowany detektor + pojedynczą sesję w obiekt dostawcy wielokrotnego użytku.
let adapter = try WakeWordStreamingAdapter(detector: detector)
// pipeline.configure(wakeWord: adapter)
Źródło
- Źródła / Przemówienie WakeWord - Moduł Swift
- docs / models / kws- zipformer.md - nuty architektoniczne
- docs / inference / wake- world.md - gazociąg do składania wniosków
- Upstream: k2-fsa / icefall Przepis KWS / pkudune / keyword- spotting- models