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.

Vain englanti

Lähetetty tarkastuspiste on gigaspeech KWS fine-tune. Ei-Englanti avainsanoja tarvitaan erillinen jäätiköllä hieno-tune ja jälleenvienti.

Arkkitehtuuri

Vaihe Yksityiskohdat
fbankkaldi-yhteensopiva (25 ms / 10 ms, Povey-ikkuna, 80 melonia, high_freq=-400, ei CMVN:ää)
Koodain6- 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
JoinerLineaarinen + 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.0426× reaaliaikainen M-sarjassa
Palautus (12 avainsanaa)88%LibriSpeech testipuhdasta, 158 positiivista lausetta
Väärät positiiviset / sanat0.2760 negatiivista lausetta
CoreML INT8 vs PyTorch FP3299% 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).
boostPer-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.
Kun käytetään esikypsytettyä tokens

KWS-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

MalliParaateja KokoHuggingFace
KWS-Zipformer-3M3.49M~ 4 Mtaufklarer/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