Детекция голосовой активности
Доступны две VAD-модели: Pyannote segmentation для офлайн-пакетной обработки с высокой точностью и Silero VAD v5 для потоковой детекции с низкой задержкой. Обе работают полностью на устройстве.
Pyannote (офлайн)
Pyannote segmentation-3.0 обеспечивает высокоточный VAD через архитектуру PyanNet. Он обрабатывает аудио в скользящих окнах по 10 секунд с шагом 1 секунда, затем агрегирует перекрывающиеся предсказания и применяет сглаживание гистерезисом.
Архитектура
| Этап | Детали |
|---|---|
| SincNet | 40 обученных полосовых фильтров (всего 80: 40 cos + 40 sin) |
| BiLSTM | 4 слоя, hidden=128, двунаправленный (256-мерный выход) |
| Linear | 2 линейных слоя с LeakyReLU (negative_slope=0.01) |
| Выход | 7-классовый softmax с гистерезисной постобработкой |
Размер модели: ~1.49M параметров, ~5.7 МБ на диске.
Пороги по умолчанию
- Onset:
0.767— вероятность, выше которой детектируется речь - Offset:
0.377— вероятность, ниже которой речь заканчивается
Использование 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, что делает её подходящей для приложений реального времени.
Архитектура
| Этап | Детали |
|---|---|
| STFT | Conv1d (1 в 258 каналов), reflection pad 64 только справа |
| Encoder | 4x Conv1d + ReLU |
| LSTM | Hidden size 128, состояние переносится между чанками |
| Decoder | Conv1d (128 в 1) на скрытом состоянии LSTM, sigmoid-выход |
Размер модели: ~309K параметров, ~1.2 МБ на диске.
Потоковый конечный автомат
Потоковый VAD-процессор использует 4-состояниевую машину для создания чистых речевых сегментов:
- silence — речь не обнаружена
- pendingSpeech — превышен порог onset, ожидание минимальной длительности речи
- speech — подтверждённый речевой сегмент в процессе
- pendingSilence — превышен порог offset, ожидание минимальной длительности тишины
Пороги по умолчанию
- Onset:
0.5 - Offset:
0.35 - Минимальная длительность речи:
0.25 с - Минимальная длительность тишины:
0.1 с
Использование 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-v5 | MLX | ~1.2 МБ | aufklarer/Silero-VAD-v5-MLX |
| Silero-VAD-v5 | CoreML | ~1.2 МБ | aufklarer/Silero-VAD-v5-CoreML |
| Pyannote-Segmentation-3.0 | MLX | ~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.