Tłumaczenie automatyczne · Oryginał angielski

Wykrywanie aktywności głosu - Silero VAD

p99 · VAP

Dostępne są dwa modele VAD: Segmentacja Pyannote do przetwarzania partii offline z wysoką dokładnością, oraz Silero VAD do wykrywania niskiego opóźnienia strumieniowego. Oba działają w całości na urządzeniu.

Pyannote (Offline)

Pyannote segmentation-3.0 zapewnia wysoką dokładność VAD przy użyciu architektury PyanNet. Przetwarza mowę w oknie przesuwnym 10- drugim etapie 1-, następnie agreguje pokrywające się przewidywania i stosuje wygładzanie histerezy.

Architektura

EtapSzczegóły
SindNet40 uczonych filtrów (80 razem: 40 cos + 40 sin)
BiLSTM4 warstwy, ukryte = 128, dwukierunkowe (wyjście 256- dim)
Liniowe2 warstwy liniowe z LeakyReLU (ujemne _ nachylenie = 0,01)
Wyjście7-klasowy softmax z histerezą po przetworzeniu

Rozmiar modelu: ~ 1.49M parametry, ~ 5.7 MB na dysku.

Domyślne progi

Zastosowanie 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

Silero VAD jest lekkim modelem strumieniowym, który przetwarza fragmenty próbki 512- (32 ms przy 16 kHz). Działa w czasie rzeczywistym 23x, co czyni go odpowiednim dla aplikacji audio na żywo.

Rozdzielone tyły: MLX i CoreML teraz oba domyślne do eksportu Silero v6.2.1: aufklarer/Silero-VAD-v6.2.1-MLX oraz aufklarer/Silero-VAD-v6.2.1-CoreML. Oba przechowywać ten sam 32 ms streaming API.

Architektura

EtapSzczegóły
STFTConv1d (1 do kanałów 258), tylko prawe odbicie 64
Enkoder4x Conv1d + ReLU
LSTMUkryty rozmiar 128, stan przenoszony przez kawałki
DekoderConv1d (128 do 1) w stanie ukrytym LSTM, wyjście sigmoid

Rozmiar modelu: ~ 309K parametry, ~ 1.2 MB na dysku.

Streaming State Machine

Procesor strumieniowy VAD wykorzystuje maszynę stanu 4- do produkcji czystych segmentów mowy:

  1. Cisza - nie wykryto mowy
  2. pendingSpeech - próg początkowy przekroczony, czekający na minimalny czas trwania mowy
  3. przemowa - potwierdzony segment mowy w toku
  4. wahadłucz Cisza - przekroczony próg kompensacyjny, czekający na minimalny czas trwania ciszy

Domyślne progi

Zastosowanie 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

Opcje

OpcjaDotyczyOpis
--onsetObaPróg prawdopodobieństwa wystąpienia mowy
--offsetObaPróg prawdopodobieństwa offsetu mowy
--min-speechStrumieniowanieMinimalny czas trwania segmentu mowy (sekundy)
--min-silenceStrumieniowanieMinimalny czas trwania ciszy do segmentu końcowego (sekundy)
--engineStrumieniowanieSilnik do składania wniosków: mlx lub coreml
--jsonObaFormat wyjściowy JSON
Ważne

Dla aplikacji w czasie rzeczywistym, zastosowanie speech vad-stream Silero VAD. Model Pyannote wymaga pełnego pliku audio i jest lepiej dostosowany do przetwarzania partii offline, gdzie dokładność jest priorytetem.

Potwierdź pauzy za pomocą Smart Turn

VAD słyszy tylko ciszę, więc nie może odróżnić gotowego zdania od zdania środkowego. Smart Turn v3.2 do StreamingVADProcessor - lub uruchomić speech vad-stream --smart-turn - aby potwierdzić każdą pauzę przed zakończeniem segmentu: gotowe zdanie kończy się natychmiast zakrętem, przerwa w zdaniu środkowym ciągle słucha.

Pobieranie modeli

WzórWsteczRozmiarHuggingFace
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")
    }
}

Dostępne również na stronie Android, i Linux i Windows poprzez rdzeń mowy (ONNX Runtime).