Konekäännös · Englanninkielinen alkuperäinen

Äänen aktiivisuusdetektori Silero VAD

p99 · VAP ... Mallit

Saatavana on kaksi VAD -mallia: Pyannote -segmentointi - offline-eränkäsittelyssä suurella tarkkuudella ja Silero VAD - streaming low-latency detection.

Pyannote (Offline)

Pyannote segmentation-3.0 tarjoaa korkean tarkkuuden VAD:n käyttäen PyanNet-arkkitehtuuria. Se käsittelee puhetta 10-sekunnin liukuikkunassa 1 -sekuntiaskeleella, sitten yhdistää päällekkäisiä ennusteita ja soveltaa hysteriaa.

Arkkitehtuuri

Vaihe Yksityiskohdat
SincNet40 oppinutta kaistapassisuodatinta (80 yhteensä: 40 cos + 40 sin)
BiLSTM4 kerrosta, piilotettu=128, kaksisuuntainen (256-dim lähtö)
Lineaarinen2 lineaarista kerrosta, joissa on vuotoreLU (negatiivinen_slope=0,01)
Tuotos7-luokan softmax hystereesi jälkikäsittely

Mallin koko: ~1.49M parametrit, ~5,7 MB levyllä.

Oletuskynnykset

CLI-käyttö

# Offline VAD
.build/release/speech vad recording.wav

# JSON output
.build/release/speech vad recording.wav --json

# Custom thresholds
.build/release/speech vad recording.wav --onset 0.6 --offset 0.3

Silero VAD (Streaming)

Silero VAD on kevyt streaming-malli, joka käsittelee 512-näytteen paloja (32 ms 16 kHz:n kohdalla). Se toimii 23x reaaliaikaisesti julkaisutilassa, jolloin se soveltuu live-audiosovelluksiin.

Taustaosan jako: MLX ja CoreML ovat nyt molemmat oletuksena Silero v6.2.1 vienti: aufklarer/Silero-VAD-v6.2.1-MLX sekä aufklarer/Silero-VAD-v6.2.1-CoreML. Molemmat pitävät saman 32 ms streaming API.

Arkkitehtuuri

Vaihe Yksityiskohdat
STFTConv1d (1-258 kanavaa), vain oikeanpuoleinen heijastuslevy 64
Koodain4x Conv1d + ReLU
LSTM Piilotettu koko 128, tila kuljettaa yli paloja
PurkajaConv1d (128-1) LSTM:n piilotilassa, sigmoidin ulostulo

Mallin koko: ~309K parametrit, ~1.2 MB levyllä.

Streaming valtion kone

Virtaus VAD -prosessori käyttää 4-tilaista konetta puhtaan puheen segmenttien tuottamiseen:

  1. hiljaisuus ...
  2. kulutusPuhe Aloitettu kynnys ylitettynä, odottaen puheen vähimmäiskestoa
  3. Puhe Vahvistettu puheen segmentti käynnissä
  4. menotHiljaisuus ... ..

Oletuskynnykset

CLI-käyttö

# Streaming VAD
.build/release/speech vad-stream recording.wav

# Custom thresholds
.build/release/speech vad-stream recording.wav --onset 0.6 --offset 0.3

# Minimum durations
.build/release/speech vad-stream recording.wav --min-speech 0.5 --min-silence 0.2

# Choose engine
.build/release/speech vad-stream recording.wav --engine coreml

Valinnat

VaihtoehtoKoskee Tavaran kuvaus
--onsetMolemmat Puheen alkamisen todennäköisyyskynnys
--offsetMolemmat Puheen kompensaation todennäköisyyskynnys
--min-speechVirtaaminenMinimi puhesegmentin kesto (sekuntia)
--min-silenceVirtaaminen Pienin hiljaisuuden kesto loppuun segmenttiin (sekuntia)
--engineVirtaaminen Päätelmämoottori: mlx tai coreml
--jsonMolemmatJSON- tulostusmuoto
Tärkeää

Reaaliaikasovelluksissa käytetään speech vad-stream Silero VAD. Pyannote -malli edellyttää koko äänitiedostoa ja soveltuu paremmin offline-eräkäsittelyyn, jossa tarkkuus on etusijalla.

Vahvista tauot Smart Turn

VAD kuulee vain hiljaisuuden, joten se ei erota lopullista lausetta tauosta. Smart Turn v3.2 - StreamingVADProcessor tai ajaa speech vad-stream --smart-turn Voit vahvistaa jokaisen tauon ennen segmentin loppua: lopullinen lause päättyy käännöksen välittömästi, keski-lause tauko jatkaa kuuntelemista.

Mallilataukset

Malli Taustaosa KokoHuggingFace
Silero-VAD-v6.2.1MLX~1.2 MBaufklarer/Silero-VAD-v6.2.1-MLX
Silero-VAD-v6.2.1CoreML~1.2 MBaufklarer/Silero-VAD-v6.2.1-CoreML
Pyannote-Segmentation-3.0MLX~5,7 Mtaufklarer/Pyannote-segmentaatio-MLX

Swift API

import SpeechVAD

// Offline VAD (Pyannote)
let pyannote = try await PyannoteVADModel.fromPretrained()
let segments = pyannote.detectSpeech(audio: samples, sampleRate: 16000)
for segment in segments {
    print("\(segment.startTime)s - \(segment.endTime)s")
}

// Streaming VAD (Silero)
let silero = try await SileroVADModel.fromPretrained()
let processor = StreamingVADProcessor(model: silero, config: .sileroDefault)
for event in processor.process(samples: audioBuffer) {
    switch event {
    case .speechStarted(let time):
        print("Speech started at \(time)s")
    case .speechEnded(let segment):
        print("Speech: \(segment.startTime)s - \(segment.endTime)s")
    }
}

Saatavana myös Android ja Linux & Windows puheydin kautta (ONNX Runtime) .