Maskinöversättning · Engelskt original

Voice Activity Detection – Silero VAD

p99 VAP -- Models

Två VAD modeller är tillgängliga: Pyannote segmentering för offline batch bearbetning med hög noggrannhet och Silero VAD för streaming low-latency detection. Båda kör helt på-enhet.

Pyannote (Offline)

Pyannote segmentation-3.0 ger hög noggrannhet VAD med hjälp av en PyanNet-arkitektur. Det behandlar tal i 10-sekunds glidande fönster med ett 1-sekunders steg, sedan aggregerar överlappande förutsägelser och tillämpar hysteresutjämning.

Arkitektur

StegDetaljer
SincNet40 lärda bandpassfilter (80 totalt: 40 cos + 40 sin)
BiLSTM4 lager, dolda = 128, bidirectional (256-dim utgång)
Linjär2 linjära lager med LeakyReLU (negative_slope=0.01)
Output7-klass softmax med hysteres efterbehandling

Modellstorlek: ~ 1,49M parametrar, ~ 5,7 MB på disken.

Standard trösklar

CLI Användning

# 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 är en lätt streaming modell som processer 512-prov bitar (32 ms vid 16 kHz). Det körs vid 23x realtid i släppläge, vilket gör det lämpligt för levande ljudapplikationer.

Backend split: MLX och CoreML nu båda standard till Silero v6.2.1 export: aufklarer/Silero-VAD-v6.2.1-MLX och aufklarer/Silero-VAD-v6.2.1-CoreMLBåda håller samma 32 ms streaming API.

Arkitektur

StegDetaljer
STFTConv1d (1 till 258 kanaler), endast reflektionsplatta på 64
Encoder4x Conv1d + ReLU
LSTMDold storlek 128, staten bärs över bitar
DecoderConv1d (128 till 1) på LSTM dolda tillstånd, sigmoidutgång

Modellstorlek: ~ 309K parametrar, ~ 1,2 MB på disk.

Streaming State Machine

streaming VAD processor använder en 4-statsmaskin för att producera rena talsegment:

  1. tystnad - inget tal som upptäckts
  2. pendingSpeech - inställd tröskel korsades, väntar på minsta tal varaktighet
  3. speech — bekräftat talsegment pågår
  4. pendingSilence - kompenserad tröskel överskrids och väntar på minsta tystnadslängd

Standard trösklar

CLI Användning

# 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

Alternativ

AlternativGäller förBeskrivning
--onsetBåda båda tvåTal inställd sannolikhet tröskel
--offsetBåda båda tvåTal offset sannolikhet tröskel
--min-speechStreamingMinsta talsegmentets varaktighet (sekunder)
--min-silenceStreamingMinsta tystnadslängden för slutsegmentet (sekunder)
--engineStreamingInferensmotor: mlx eller coreml
--jsonBåda båda tvåJSON utdata format
Viktigt

För realtidsapplikationer, använd speech vad-stream med Silero VAD. Pyannote-modellen kräver fullständig ljudfil och passar bättre för offline batch bearbetning där noggrannhet är prioritet.

Bekräfta pauser med Smart Turn

En VAD hör bara tystnad, så det kan inte berätta en färdig mening från en paus mitten av meningen. Fäst Smart Turn v3.2 till StreamingVADProcessor - eller kör speech vad-stream --smart-turn - för att bekräfta varje paus innan segmentet slutar:

Modell nedladdningar

ModellBackendStorlekHuggingFace
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")
    }
}

Också tillgänglig på Android, och på Linux & Windows genom Speech Core (ONNX Runtime).