Maskinoversettelse · Engelsk original

Deteksjon av stemmeaktivitet — Silero VAD

p99 · VAP — Modeller

To VAD-modeller er tilgjengelige: Pyannote-segmentering for offline batchprosessering med høy nøyaktighet, og Silero VAD for streaming av lav latens deteksjon. Begge kjører helt på-device.

Pyannote (på linje)

Pyannote segmentation-3.0 gir høy nøyaktighet VAD ved hjelp av en pyanNet-arkitektur. Den behandler tale i 10-sekunds glidende vinduer med et 1-sekunders steg, deretter samler overlappende spådommer og anvender hysteress glatting.

Arkitektur

Stage Detaljer
SincNet40 lærde bandpass filtre (80 totalt: 40 cos + 40 synd)
BiLSTM4 lag, skjult = 128, toveis (256-dim utgang)
Linear2 lineære lag med LeakyReLU (negativ_sloppe=0,01)
Utgang7-klasse mykmaks med hysterese etter behandling

Modellstørrelse: ~ 1.49M parametre, ~ 5,7 MB på disken.

Standardgrenser

CLI bruk

# 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 er en lett streaming modell som behandler 512-sample biter (32 ms ved 16 kHz). Den kjører ved 23x sanntid i frigjøringsmodus, noe som gjør den egnet for live lydprogrammer.

Motordeling: MLX og CoreML nå begge standard til Silero v6.2.1 eksport: aufklarer/Silero-VAD-v6.2.1-MLX og aufklarer/Silero-VAD-v6.2.1-CoreML. Begge holde den samme 32 ms streaming API.

Arkitektur

Stage Detaljer
STFTConv1d (1 til 258 kanaler), refleksjonspute til høyre på 64
Koder4x Conv1d + ReLU
LSTM Skjult størrelse 128, State båret over biter
DehydreringConv1d (128 til 1) på LSTM skjult tilstand, sigmoid utgang

Modellstørrelse: ~ 309K parametere, ~ 1,2 MB på disken.

Streaming State Machine

Streaming VAD prosessoren bruker en 4-tilstandsmaskin til å produsere rene talesegmenter:

  1. silens - ingen tale oppdaget
  2. avhengig tale - startgrense krysset, venter på minste taletid
  3. speech - bekreftet talesegment i gang
  4. avhengigSilence - offset terskel krysset, venter på minimum stillhet varighet

Standardgrenser

CLI bruk

# 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

Alternativer

MulighetGjelder Beskrivelse
--onset Begge deler Sannsynsgrense for talestart
--offset Begge delerTale offset sannsynlighetsgrense
--min-speechStreamingMinimum talesegment varighet (sekunder)
--min-silenceStreamingMinimum stillhet varighet til slutt segment (sekunder)
--engineStreamingInferensmotor: mlx eller coreml
--json Begge delerJSON-utgangsformat
Viktig

For sanntidsapplikasjoner, bruk speech vad-stream med Silero VAD. Pyannote modellen krever full lydfil og er bedre egnet for offline batchbehandling der nøyaktighet er prioriteten.

Bekreft pauser med Smart Turn

A VAD hører bare stillhet, så det kan ikke fortelle en ferdig setning fra en pause midt-sentens. Legg til Smart Turn v3.2 til StreamingVADProcessor — eller kjør speech vad-stream --smart-turn — for å bekrefte hver pause før segmentet avsluttes: en ferdig setning avslutter turen umiddelbart, fortsetter en midt-sentence pause å lytte.

Modellnedlastninger

ModellMotor StørrelseHuggingFace
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")
    }
}

Også tilgjengelig på Android, og på Linux & Windows gjennom talekjerne (ONNX Runtime).