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

Источник: https://modelium.tech/zhurnal/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](#src-s8) [s7](#src-s7)

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

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

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

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

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

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

python3 -m venv .venv-asr. .venv-asr/bin/activatepython -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](#src-s1) [s2](#src-s2)

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

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

# save as compare_vad.py; run: python compare_vad.py sample-ru.wavimport jsonimport sysfrom pathlib import Pathfrom faster_whisper import WhisperModelif 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](#src-s1) [s2](#src-s2)

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

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

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

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

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

Для записи встречи или звонка фильтрация может уменьшить объём пустого звука, передаваемого модели, но **не гарантирует** меньшую задержку и не исправляет ошибочные слова: проверить их нужно на своём CPU и аудио. Для бизнес-процесса [разбора звонков продаж](/zhurnal/analiz-zvonkov-prodazh-lokalno/) исходный файл и ручное подтверждение полей CRM важнее красивой непрерывной расшифровки. Если запись содержит чувствительные данные, отдельно [проверьте офлайн-контур](/zhurnal/proverka-offline-kontura-ii/): локальный код не является доказательством отсутствия сетевого обмена при скачивании модели или в остальных частях стека. [s1](#src-s1) [s2](#src-s2)

**Следующий шаг:** на своей русской записи сверьте слово и его время у нескольких пауз в `vad-comparison.json`, затем откройте [протокол разбора звонка](/zhurnal/analiz-zvonkov-prodazh-lokalno/). Пока хотя бы один критичный фрагмент пропадает, не переносите результат в CRM автоматически.

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

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

## Источники

1. [faster-whisper: README, установка, транскрипция и VAD](https://raw.githubusercontent.com/SYSTRAN/faster-whisper/4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57/README.md) — получено 2026-09-29
2. [faster-whisper: код обычного и пакетного transcribe](https://raw.githubusercontent.com/SYSTRAN/faster-whisper/4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57/faster_whisper/transcribe.py) — получено 2026-09-29
3. [faster-whisper: VadOptions и восстановление таймкодов](https://raw.githubusercontent.com/SYSTRAN/faster-whisper/4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57/faster_whisper/vad.py) — получено 2026-09-29
4. [faster-whisper: декодирование и ресемплинг audio.py](https://raw.githubusercontent.com/SYSTRAN/faster-whisper/4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57/faster_whisper/audio.py) — получено 2026-09-29
5. [faster-whisper: требования Python и зависимостей в setup.py](https://raw.githubusercontent.com/SYSTRAN/faster-whisper/4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57/setup.py) — получено 2026-09-29
6. [faster-whisper: тест VAD и таймкодов](https://raw.githubusercontent.com/SYSTRAN/faster-whisper/4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57/tests/test_transcribe.py) — получено 2026-09-29
7. [Silero VAD v6.2: назначение детектора и ограничения авторских заявлений](https://raw.githubusercontent.com/snakers4/silero-vad/be95df9152c0d7618fa1edfeb296fc3dae32376f/README.md) — получено 2026-09-29
8. [faster-whisper: версия пакета на закреплённом коммите](https://raw.githubusercontent.com/SYSTRAN/faster-whisper/4bd98d5c5bf5dfd52a8fcd8b27c1492a3ec41f57/faster_whisper/version.py) — получено 2026-09-29
