Automatische vertaling · Engels origineel

Voice Activity Detection .Silero VAD

p99 · VAP › Modellen

Twee VAD modellen zijn beschikbaar: Pyannote segmentatie voor offline batchverwerking met hoge nauwkeurigheid, en Silero VAD voor het streamen van lage-latency detectie. Beide draaien volledig op het apparaat.

Pyannote (Offline)

Pyannote segmentation-3.0 biedt hoge nauwkeurigheid VAD met behulp van een PyanNet-architectuur. Het verwerkt spraak in 10-seconde schuifvensters met een 1-seconde stap, aggregeert overlappende voorspellingen en past hysteresis gladmaken toe.

Architectuur

Fase Gegevens
SincNet40 geleerde bandpass filters (80 totaal: 40 cos + 40 sin)
BILSTM4 lagen, verborgen=128, bidirectionele (256-dim uitvoer)
Lineair2 lineaire lagen met LeakyReLU (negatief_helling=0,01)
Uitvoer7-klasse softmax met hysterese na verwerking

Modelgrootte: ~1.49M parameters, ~5.7 MB op schijf.

Standaarddrempels

CLI-gebruik

# 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 is een lichtgewicht streamingmodel dat 512-sample brokken verwerkt (32 ms bij 16 kHz). Het draait op 23x real-time in release-modus, waardoor het geschikt is voor live audio-toepassingen.

Backend split: MLX en CoreML zijn nu allebei standaard aan Silero v6.2.1 export: aufklarer/Silero-VAD-v6.2.1-MLX en aufklarer/Silero-VAD-v6.2.1-CoreML. Beide houden dezelfde 32 ms streaming API.

Architectuur

Fase Gegevens
STFTConv1d (1 tot 258 kanalen), alleen-rechts-reflectie pad van 64
Encoder4x Conv1d + ReLU
LSTMVerborgen maat 128, staat gedragen over brokken
DecoderConv1d (128 tot 1) op LSTM verborgen toestand, sigmoid uitvoer

Modelgrootte: ~309K parameters, ~1.2 MB op schijf.

Streaming State Machine

De streaming VAD processor gebruikt een 4-state machine om schone spraaksegmenten te produceren:

  1. stilte
  2. pendencySpeech
  3. speech bevestigd spraaksegment in uitvoering
  4. pendencySilence Overgestoken offsetdrempel, wachtend op minimale stilteduur

Standaarddrempels

CLI-gebruik

# 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

Opties

Optie Geldt voor Omschrijving
--onset BeideSpeech begin-kansdrempel
--offset BeideSpeech offset waarschijnlijkheidsdrempel
--min-speechStreaming Minimale duur van het spraaksegment (seconden)
--min-silenceStreaming Minimale stilteduur tot eindsegment (seconden)
--engineStreamingInferentiemotor: mlx of coreml
--json BeideJSON-uitvoerformaat
Belangrijk

Voor real-time toepassingen, gebruik speech vad-stream met Silero VAD. Het Pyannote model vereist het volledige audiobestand en is beter geschikt voor offline batchverwerking waar nauwkeurigheid de prioriteit heeft.

Pauzes bevestigen met Smart Turn

Een VAD hoort alleen stilte, dus het kan een voltooide zin van een pauze middenzin niet onderscheiden. Voeg Smart Turn v3.2 toe aan StreamingVADProcessor of voer speech vad-stream --smart-turn uit om elke pauze te bevestigen voordat het segment eindigt: een voltooide zin eindigt de turn onmiddellijk, een mid-sententiepauze blijft luisteren.

Modeldownloads

ModelBackend GrootteHuggingFace
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")
    }
}

Ook beschikbaar op Android, en op Linux & Windows via Speech Core (ONNX Runtime).