Konekäännös · Englanninkielinen alkuperäinen
Aktivointisanojen / avainsanojen tunnistus
SpeechWakeWord -moduulissa on laitehakusanan tähystäjä: rekisteröit luettelon lauseista, työnnät äänimurskaa sisään ja vastaanotat havaintoja. Perustuu jääputouksen streaming Zipformer-transduktoriin (3.49M params, Apache-2.0), joka on koottu CoreML kanssa INT8 palettization.
Lähetetty tarkastuspiste on gigaspeech KWS fine-tune. Ei-Englanti avainsanoja tarvitaan erillinen jäätiköllä hieno-tune ja jälleenvienti.
Arkkitehtuuri
| Vaihe | Yksityiskohdat |
|---|---|
| fbank | kaldi-yhteensopiva (25 ms / 10 ms, Povey-ikkuna, 80 melonia, high_freq=-400, ei CMVN:ää) |
| Koodain | 6- vaiheen syy-yhteys Zipformer2 (128- idim), 45 mel kehykset → 8 Kehys ulos (40 ms / frame) 3.3 Mt INT8 |
| Purkaja | Tilaton anturi, BPE-500 vocab, kontekstikoko 2 ... 525 KB FP16 |
| Joiner | Lineaarinen + tanh-ulostuloennuste ... 160 KB INT8 |
| Dekoodaa | Muunneltu valokeilan haku (palkki=4) Aho-Corasick ContextGraph käyttäjätunnusten yli |
Koottu koko levyllä: ~4 MB yhteensä (encoder.mlmodelc + decoder.mlmodelc + joiner.mlmodelc). Runtime muisti: ~6 MB mukaan lukien kooder tila välimuistit.
Tulos
| Metrinen | Arvo | Huomautuksia |
|---|---|---|
| RTF (CPU + Neural Engine) | 0.04 | 26× reaaliaikainen M-sarjassa |
| Palautus (12 avainsanaa) | 88% | LibriSpeech testipuhdasta, 158 positiivista lausetta |
| Väärät positiiviset / sanat | 0.27 | 60 negatiivista lausetta |
| CoreML INT8 vs PyTorch FP32 | 99% | Päästösopimus |
Viritetyt oletusarvot: acThreshold=0.15, contextScore=0.5, numTrailingBlanks=1. Per-avainsana ohitus tuettu.
CLI-käyttö
Plain-lause muodossa (ahne BPE ... toimii hyvin yhteisiä sanoja):
speech wake recording.wav --keywords "hey soniqo"
speech wake recording.wav --keywords "hey soniqo:0.15:0.5" "cancel"
Pre-tokenized muodossa (sherpa-onnx tyyli ... Suositellaan, kun tiedät tarkka hajoaminen malli oli koulutettu:
# 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
Tai avainsanatiedosto, yksi merkintä riviä kohti (# kommentteja varten):
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)
AvainsanaSpec
| Kenttä | Merkitys |
|---|---|
phrase | Näytön lauseke, esim. "hey soniqo". Käytetään myös ahneen BPE-koodauksen lähteenä, kun tokens on nolla. |
acThreshold | Keskimääräinen akustinen todennäköisyys, joka vaaditaan sovitun vertailujakson aikana. 0 → käytä viritettyä oletusta (0,15). |
boost | Per-token context boost. Positiiviset arvot helpottavat laukaisemista. 0 → käytä viritettyä oletusta (0,5). |
tokens | Valinnainen nimenomainen BPE-kappaleluettelo. Kun ei-ei, ilmaisin katsoo jokaisen palan mallin tokens.txt ja ohittaa ahneen BPE-kooderin. |
tokensKWS-sanasto on uppercase BPE . Ahtaasti lause voi poimia erilaisen BPE:n hajoamisen mallista, joka on koulutettu lähettämään . "LIGHT UP" ahneus koodaamaan ▁LI GHT ▁UP, mutta harjoitus hajoaminen on ▁ L IGHT ▁UP. Kun havaitseminen TTS-syntetisoitua tai puhdasta lukupuhetta ei osu selvästi yhteen, kokeile sherpa-onnx-tyylistä esikosketettua muotoa.
Mallilataukset
| Malli | Paraateja | Koko | HuggingFace |
|---|---|---|---|
| KWS-Zipformer-3M | 3.49M | ~ 4 Mt | aufklarer/KWS-Zipformer-3M-CoreML-INT8 |
Putkijohtojen integrointi
Moduuli paljastaa WakeWordProvider -protokollan, joka peilaa StreamingVADProvider, joten ääniputki voi portoida aktivoinnin VAD, herätyssanan tai molemmat. WakeWordStreamingAdapter wraps a ladattu ilmaisin + yksi istunto uudelleen käytettäväksi palveluntarjoajan kohteeseen.
let adapter = try WakeWordStreamingAdapter(detector: detector)
// pipeline.configure(wakeWord: adapter)
Lähde
- Lähde/PuheWakeWord ... Swift moduuli
- docs/models/kws-zipformer.md ...
- docs/inference/wake-word.md ...
- Etuvirta: k2-fsa/icefall KWS-resepti / pkufool/keyword-spotting-mallit