Детекция голосовой активности

Доступны две 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

# Офлайн VAD
.build/release/audio vad recording.wav

# JSON-вывод
.build/release/audio vad recording.wav --json

# Пользовательские пороги
.build/release/audio 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

# Потоковый VAD
.build/release/audio vad-stream recording.wav

# Пользовательские пороги
.build/release/audio vad-stream recording.wav --onset 0.6 --offset 0.3

# Минимальные длительности
.build/release/audio vad-stream recording.wav --min-speech 0.5 --min-silence 0.2

# Выбрать движок
.build/release/audio vad-stream recording.wav --engine coreml

Опции

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

Для приложений реального времени используйте audio 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

// Офлайн VAD (Pyannote)
let pyannote = try await PyannoteVAD.loadFromHub()
let segments = try await pyannote.detectSpeech(audioFile: "recording.wav")
for segment in segments {
    print("\(segment.start)s - \(segment.end)s")
}

// Потоковый VAD (Silero)
let silero = try await SileroVAD.loadFromHub()
let processor = StreamingVADProcessor(model: silero, config: .sileroDefault)
for chunk in audioChunks {
    if let segment = try processor.process(chunk: chunk) {
        print("Speech: \(segment.start)s - \(segment.end)s")
    }
}

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