Strojový překlad · Anglický originál

Detekce hlasové aktivity - Silero VAD

p99 · VAP - Modely

K dispozici jsou dva modely VAD: segmentace Pyannote pro offline zpracování šarží s vysokou přesností a Silero VAD pro streamování detekce nízké latence. Oba běží zcela on-zařízení.

Pyannote (Offline)

Pyannote segmentation-3.0 poskytuje vysokou přesnost VAD pomocí architektury PyanNet. Provádí řeč v 10-second posuvná okna s 1- second krokem, pak agregáty překrývající předpovědi a aplikuje hysterezi vyhlazení.

Architektura

FázePodrobnosti
IngelNet40 učených bandpassových filtrů (celkem 80: 40 cos + 40 sin)
BiLSTM4 vrstvy, skryté = 128, obousměrné (256-dim výstup)
Lineární2 lineární vrstvy s LeakyReLU (negativní _ sklon = 0,01)
Výstup7- třída softmax s hysterezi post- processing

Velikost modelu: ~ 1.49M parametry, ~ 5.7 MB na disku.

Výchozí prahové hodnoty

Použití CLI

# 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 je lehký streamingový model, který zpracovává vzorky 512- vzorku (32 ms na 16 kHz). V reálném čase 23x v režimu uvolnění je vhodný pro živé audio aplikace.

Backend split: MLX a CoreML nyní oba výchozí hodnoty pro Silero v6.2.1 vývozy: aufklarer/Silero-VAD-v6.2.1-MLX a aufklarer/Silero-VAD-v6.2.1-CoreML. Oba mají stejné 32 ms streaming API.

Architektura

FázePodrobnosti
STFTConv1d (1 do 258 kanálů), pouze odrazový blok 64
Enkodér4x Conv1d + ReLU
LSTMSkrytá velikost 128, stav přenášen přes kusy
DekodérConv1d (128 to 1) na LSTM skrytém stavu, sigmoid výstup

Velikost modelu: ~ 309K parametry, ~ 1.2 MB na disku.

Streaming State Machine

Proudový procesor VAD používá stroj 4-state k výrobě čistějších řeckých segmentů:

  1. Ticho. - žádný projev nebyl zaznamenán
  2. přívěšek Projev - nástupní práh překročen, čekání na minimální trvání řeči
  3. řeč - probíhá potvrzený segment řeči
  4. Tiše. - kompenzační práh překročen, čekání na minimální dobu ticha

Výchozí prahové hodnoty

Použití CLI

# 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

Možnosti

MožnostPlatí proPopis
--onsetObojíPrahová hodnota pravděpodobnosti nástupu řeči
--offsetObojíPrahová hodnota pravděpodobnosti pro odstupňování řeči
--min-speechStreamingMinimální délka části řeči (sekundy)
--min-silenceStreamingMinimální doba ticha do konce segmentu (sekundy)
--engineStreamingSpouštěcí motor: mlx nebo coreml
--jsonObojíVýstupní formát JSON
Důležité

Pro aplikace v reálném čase, použijte speech vad-stream s Silero VAD. Model Pyannote vyžaduje plný audio soubor a je vhodnější pro offline zpracování šarží, kde je přesnost prioritou.

Potvrdit pauzy se Smart Turn

VAD slyší pouze ticho, takže nemůže určit dokončenou větu z pauzy uprostřed. Smart Turn v3.2 do StreamingVADProcessor - nebo utečte speech vad-stream --smart-turn - pro potvrzení každé pauzy před koncem segmentu: dokončená věta okamžitě ukončí zatáčku, přestávka uprostřed věty stále poslouchá.

Stáhnout model

VzorBackendVelikostHuggingFace
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 MBaufklarer / Pyannote- Segmentation- 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")
    }
}

Také k dispozici na Android, a dále Linux & Windows prostřednictvím jádra řeči (ONNX Runtime).