Перейти к содержанию
modelium.
Начать с задачи
←

faster-whisper VAD: как убрать тишину и не потерять русскую речь

В faster-whisper обычный `WhisperModel.transcribe` включает Silero VAD параметром `vad_filter=True`: он оставляет участки, распознанные как речь, и восстанавливает таймкоды исходной записи. Сначала сравните одну и ту же русскую запись с VAD и без него, затем меняйте порог или длительность паузы только после проверки тихих реплик по аудио. VAD не гарантирует точность транскрипта и может отсечь полезный фрагмент.

Проверено по исходникам 29 сентября 2026 года: faster-whisper 1.2.0, коммит 4bd98d5, и документация Silero VAD v6.2. Это инструкция по коду разработчиков, а не результат прогона Modelium на русской речи: модель и аудио мы не запускали. s8 s7

Что меняет vad_filter в faster-whisper?

VAD (voice activity detection) ищет участки вероятной речи до распознавания. WhisperModel.transcribe(..., vad_filter=True) использует интегрированный Silero VAD, вырезает интервалы, которые тот не посчитал речью, затем возвращает таймкоды распознанных сегментов к шкале исходного аудио. В этой ревизии обычный WhisperModel по умолчанию запускается без VAD, а пакетный BatchedInferencePipeline — с VAD: одинаковое отсутствие явного аргумента в двух API не означает одинаковую обработку записи. s1 s2 s3

VAD не переводит речь в текст и не знает, верно ли распознано слово. Фильтр может удалить тихую реплику вместе с паузой; наличие ровных таймкодов после восстановления не доказывает, что ничего не пропало. Silero называет свою модель детектором речевой активности, а не системой распознавания. Сопоставление той же записи с VAD и без него — способ обнаружить риск, а не замер гарантированной точности. s3 s7

Что подготовить для проверяемого сравнения?

Нужны Python не ниже 3.9 по зафиксированному setup.py, свободное место для выбранной модели и своя короткая запись с русской речью, включая тихую реплику после паузы. В коде проекта small перечислен как поддерживаемое имя модели; вариант .en для русской проверки не выбирайте. CPU int8 есть в README как пример запуска, но его скорость и требуемую память на вашем компьютере здесь никто не измерял. s1 s2 s5

Для воспроизводимости установите конкретную ревизию в отдельное окружение; это чтение исходников и план запуска читателем, не результат Modelium. При первом обращении к имени модели библиотека может скачивать файлы; скачайте их заранее, если проверяете строго офлайн. Аудио проект декодирует с помощью PyAV (внешний системный FFmpeg для обычного пути из README не обязателен), приводит к нужному формату и частоте. s1 s2 s4

python3 -m venv .venv-asr
. .venv-asr/bin/activate
python -m pip install 'faster-whisper @ git+https://github.com/SYSTRAN/faster-whisper.git@4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57'
# Поместите собственную запись в ./sample-ru.wav; не отправляйте её в облачный ASR.

Эти команды предполагают POSIX-shell, Git и Python с venv/pip. Для Windows используйте штатный способ активации своего venv. Не записывайте приватный аудиофайл в публичный репозиторий или сторонний облачный блокнот. Размер модели не выводит минимальную RAM/VRAM; спецификацию запуска проверяйте для своего CPU и окружения. s1 s2

Как сравнить три режима на одной русской записи?

Первый проход оставляет звук без VAD, второй применяет консервативные значения по умолчанию. Третий показывает экспериментальный вариант min_silence_duration_ms=500, который есть в README и тесте авторов; не считайте его рекомендуемым для всех аудио. У VadOptions в этой ревизии threshold=0.5, min_silence_duration_ms=2000, speech_pad_ms=400. Более короткая пауза может изменить границу чанка и увеличить риск потери тихой речи. s1 s3 s6

# save as compare_vad.py; run: python compare_vad.py sample-ru.wav
import json
import sys
from pathlib import Path
from faster_whisper import WhisperModel

if len(sys.argv) != 2 or not Path(sys.argv[1]).is_file():
raise SystemExit("Передайте путь к существующему аудиофайлу")
audio = sys.argv[1]
model = WhisperModel("small", device="cpu", compute_type="int8")
runs = [
("без_vad", False, None),
("vad_по_умолчанию", True, None),
("vad_500мс_эксперимент", True, {"min_silence_duration_ms": 500}),
]
results = {}
for label, enabled, params in runs:
segments, info = model.transcribe(
audio, language="ru", beam_size=5,
vad_filter=enabled, vad_parameters=params,
word_timestamps=True,
)
# segments — ленивый генератор: перебор действительно выполняет ASR.
materialized = list(segments)
results[label] = {
"duration_s": info.duration,
"duration_after_vad_s": info.duration_after_vad,
"segments": [
{
"start": round(s.start, 2), "end": round(s.end, 2),
"text": s.text.strip(),
"words": [
{"start": round(w.start, 2), "end": round(w.end, 2),
"text": w.word.strip()}
for w in (s.words or [])
],
}
for s in materialized
],
}
Path("vad-comparison.json").write_text(
json.dumps(results, ensure_ascii=False, indent=2), encoding="utf-8"
)
print("Сохранено: vad-comparison.json; режимы:", ", ".join(results))

API предоставляет language="ru" для многоязычной модели и word_timestamps=True; таймкоды слов добавляются отдельно от сегментов. segments — ленивый генератор, поэтому без list(segments) распознавание может не завершиться. Поля duration и duration_after_vad в возвращаемом info позволяют видеть длительность удалённого аудио, не качество распознавания. При явных clip_timestamps VAD в этом интерфейсе игнорируется; не совмещайте их в контрольном опыте. s1 s2

Как понять, что фильтр не пропустил важную речь?

Откройте JSON рядом с исходной записью и выпишите вручную контрольные точки: тихое «да» после длинной паузы, начало слова у границы, цифру и фамилию в шуме. Для каждого режима прослушайте оригинальное аудио на этих интервалах и отметьте «слово есть/нет», отличие текста и смещение начала/конца сегмента. Слова в варианте без VAD сами могут быть ошибкой распознавания: слушать исходник важнее, чем считать первый проход эталоном. Такой контрольный лист — методика читателя, не опубликованный авторский benchmark.

Не выбирайте порог только по величине duration_after_vad: программа могла удалить шум, а могла вместе с ним отрезать тихую речь. В реализации threshold задаёт границу вероятности речи, speech_pad_ms добавляет контекст по краям, min_speech_duration_ms отбрасывает короткие фрагменты и min_silence_duration_ms разделяет участки. Меняйте один параметр за раз, повторяя ручную сверку; дефолтная 0.5 — параметр авторов, а не универсальная настройка русских звонков. s3

В коде после фильтрации применяется restore_speech_timestamps, но точность самого распознавания границ речи остаётся открытым вопросом. Если фрагмент пропал, вернитесь к vad_filter=False или настройте фильтр на копии, не уничтожая исходную запись. Если нужен только заданный вручную диапазон, clip_timestamps — другой маршрут, который в обычном transcribe отключает VAD. s2 s3

Где VAD помогает в локальном контуре, а где нет?

Для записи встречи или звонка фильтрация может уменьшить объём пустого звука, передаваемого модели, но не гарантирует меньшую задержку и не исправляет ошибочные слова: проверить их нужно на своём CPU и аудио. Для бизнес-процесса разбора звонков продаж исходный файл и ручное подтверждение полей CRM важнее красивой непрерывной расшифровки. Если запись содержит чувствительные данные, отдельно проверьте офлайн-контур: локальный код не является доказательством отсутствия сетевого обмена при скачивании модели или в остальных частях стека. s1 s2

Следующий шаг: на своей русской записи сверьте слово и его время у нескольких пауз в vad-comparison.json, затем откройте протокол разбора звонка. Пока хотя бы один критичный фрагмент пропадает, не переносите результат в CRM автоматически.

Источники и границы проверки

Исходники faster-whisper закреплены на 4bd98d5 (версия 1.2.0), Silero — на be95df9 (тег v6.2); тексты получены 29 сентября 2026 года. Значения по умолчанию здесь относятся к обычному WhisperModel, кроме прямо оговорённого пакетного вызова; не переносите их на другую версию без проверки. s2 s3 s7 s8 Ни один запуск модели, измерение WER, скорости, русского распознавания или минимальной памяти Modelium не проводил.

Источники

  1. faster-whisper: README, установка, транскрипция и VAD — revision 4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57. Получено 29.09.2026.
  2. faster-whisper: код обычного и пакетного transcribe — revision 4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57. Получено 29.09.2026.
  3. faster-whisper: VadOptions и восстановление таймкодов — revision 4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57. Получено 29.09.2026.
  4. faster-whisper: декодирование и ресемплинг audio.py — revision 4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57. Получено 29.09.2026.
  5. faster-whisper: требования Python и зависимостей в setup.py — revision 4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57. Получено 29.09.2026.
  6. faster-whisper: тест VAD и таймкодов — revision 4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57. Получено 29.09.2026.
  7. Silero VAD v6.2: назначение детектора и ограничения авторских заявлений — revision be95df9152c0d7618fa1edfeb296fc3dae32376f. Получено 29.09.2026.
  8. faster-whisper: версия пакета на закреплённом коммите — revision 4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57. Получено 29.09.2026.