Детекция голосовой активности — Silero VAD v5

Доступны две VAD-модели: Pyannote segmentation для офлайн-пакетной обработки с высокой точностью и Silero VAD v5 для потоковой детекции с низкой задержкой. Обе работают полностью на устройстве.

Pyannote (офлайн)

Pyannote segmentation-3.0 обеспечивает высокоточный VAD через архитектуру PyanNet. Он обрабатывает аудио в скользящих окнах по 10 секунд с шагом 1 секунда, затем агрегирует перекрывающиеся предсказания и применяет сглаживание гистерезисом.

Архитектура

ЭтапДетали
SincNet40 обученных полосовых фильтров (всего 80: 40 cos + 40 sin)
BiLSTM4 слоя, hidden=128, двунаправленный (256-мерный выход)
Linear2 линейных слоя с LeakyReLU (negative_slope=0.01)
Выход7-классовый softmax с гистерезисной постобработкой

Размер модели: ~1.49M параметров, ~5.7 МБ на диске.

Пороги по умолчанию

Использование 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 v5 (потоковый)

Silero VAD v5 — это лёгкая потоковая модель, которая обрабатывает чанки по 512 сэмплов (32 мс при 16 кГц). Она работает в 23 раза быстрее реального времени в режиме release, что делает её подходящей для приложений реального времени.

Архитектура

ЭтапДетали
STFTConv1d (1 в 258 каналов), reflection pad 64 только справа
Encoder4x Conv1d + ReLU
LSTMHidden size 128, состояние переносится между чанками
DecoderConv1d (128 в 1) на скрытом состоянии LSTM, sigmoid-выход

Размер модели: ~309K параметров, ~1.2 МБ на диске.

Потоковый конечный автомат

Потоковый VAD-процессор использует 4-состояниевую машину для создания чистых речевых сегментов:

  1. silence — речь не обнаружена
  2. pendingSpeech — превышен порог onset, ожидание минимальной длительности речи
  3. speech — подтверждённый речевой сегмент в процессе
  4. pendingSilence — превышен порог offset, ожидание минимальной длительности тишины

Пороги по умолчанию

Использование 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

Опции

ОпцияПрименяется кОписание
--onsetОбаПорог вероятности начала речи
--offsetОбаПорог вероятности конца речи
--min-speechПотоковыйМинимальная длительность речевого сегмента (секунды)
--min-silenceПотоковыйМинимальная длительность тишины для завершения сегмента (секунды)
--engineПотоковыйДвижок инференса: mlx или coreml
--jsonОбаФормат вывода JSON
Важно

Для приложений реального времени используйте speech vad-stream с Silero VAD. Pyannote-модель требует полного аудиофайла и лучше подходит для офлайн-пакетной обработки, где точность важнее.

Загрузка моделей

МодельБэкендРазмерHuggingFace
Silero-VAD-v5MLX~1.2 МБaufklarer/Silero-VAD-v5-MLX
Silero-VAD-v5CoreML~1.2 МБaufklarer/Silero-VAD-v5-CoreML
Pyannote-Segmentation-3.0MLX~5.7 МБaufklarer/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")
    }
}

Также доступно на Android, Linux и Windows через ONNX Runtime.