Шумоподавление и детекция голоса (VAD)

Готовим грязный реальный звук к обработке: убираем тишину и шум.

VAD (Voice Activity Detection) — детекция голосовой активности: определение, в какие моменты записи присутствует речь, а где тишина или шум.

Реальный звук грязный: гул кондиционера, эхо, паузы, шорохи. Подавать такое напрямую в ASR — терять качество и тратить вычисления на пустоту. Поэтому перед моделями ставят этап очистки. Два главных инструмента — VAD и шумоподавление.

VAD: где вообще есть речь

Мы уже строили простейший VAD по энергии. Современный VAD (Silero, WebRTC) — это маленькая, но точная модель, устойчивая к шуму. Зачем он нужен: отсекает тишину (ASR не тратится на пустоту), нарезает длинную запись на речевые сегменты, экономит ресурсы в реальном времени (модель «просыпается» только на речь). VAD — почти всегда первый шаг аудио-конвейера.

Спектральное вычитание шума

Классический denoise работает в частотной области. Идея: если оценить спектр шума (например, по паузе, где речи нет), его можно вычесть из спектра всей записи. Что останется — речь. Метод простой и до сих пор полезен как базовый.

спектр (речь + шум):  [5, 8, 3, 9, 2]
спектр шума (из паузы):[1, 1, 1, 1, 1]
вычитаем, обрезаем по 0: [4, 7, 2, 8, 1]   = очищенная речь

Спектральное вычитание кодом

noisy = [5.0, 8.0, 3.0, 9.0, 2.0]    # спектр: речь + шум
noise = [1.2, 1.0, 1.5, 0.8, 1.1]    # оценка шума по паузе

# вычитаем шум, отрицательное обрезаем в ноль
clean = [round(max(n - no, 0.0), 2) for n, no in zip(noisy, noise)]

print("Зашумлённый:", noisy)
print("Шум:        ", noise)
print("Очищенный:  ", clean)

Вывод:

Зашумлённый: [5.0, 8.0, 3.0, 9.0, 2.0]
Шум:         [1.2, 1.0, 1.5, 0.8, 1.1]
Очищенный:   [3.8, 7.0, 1.5, 8.2, 0.9]

Энергия шума «срезана» с каждого частотного бина. Грубо, но эффективно. Минус — может оставлять «музыкальный шум» (артефакты), от которого избавляются нейросети.

Нейросетевой denoise

Современные шумоподавители (RNNoise, Demucs, deep denoisers) — нейросети, обученные на парах «грязный звук → чистый звук». Они различают речь и шум не по простому порогу, а по сложным паттернам, и убирают даже нестационарный шум (клавиатуру, лай) с минимумом артефактов. Это то, что работает в видеозвонках в реальном времени.

Идею маски в нейросетевом denoise проще всего понять как «умную прозрачную плёнку» поверх спектрограммы. Для каждой точки время-частота сеть выставляет число от 0 до 1: единица означает «здесь чистая речь, пропустить целиком», ноль — «здесь только шум, заглушить». Умножив спектрограмму на такую маску, мы приглушаем шумные области и сохраняем речевые, а затем обратным STFT собираем чистый звук. Это ровно та же логика масок, что в сегментации изображений, где сеть решает для каждого пикселя «объект или фон» — ещё одна точка, где аудио-AI напрямую заимствует приёмы у компьютерного зрения.

У шумоподавления есть коварная ловушка: больше — не значит лучше. Слишком агрессивный denoise начинает вместе с гулом вырезать и саму речь — особенно тихие согласные вроде «ф», «с», «х», которые по спектру похожи на шум. Голос становится «подводным», глухим, а ASR на нём ошибается сильнее, чем на исходной зашумлённой записи. Классическое спектральное вычитание вдобавок оставляет «музыкальный шум» — характерное бульканье из случайных всплесков. Поэтому в реальных конвейерах ищут баланс: чуть-чуть недочистить безопаснее, чем перестараться и повредить полезный сигнал, который потом уже не восстановишь.

VAD стоит воспринимать как экономиста аудио-конвейера, а не просто как фильтр тишины. В живом разговоре речь занимает едва ли половину времени — остальное паузы, вдохи, молчание. Если модель ASR или denoise честно обрабатывает каждую секунду, половина вычислений уходит впустую, а в реальном времени это лишняя задержка и расход батареи. VAD позволяет тяжёлым моделям «спать» и просыпаться только на речь. Бонусом он защищает Whisper и подобные seq2seq-модели от галлюцинаций: на отрезанной тишине им просто не на чем фантазировать, ведь туда они её и не получают.

Как работает под капотом

Многие denoise-модели предсказывают маску для спектрограммы: для каждой точки время-частота — число от 0 до 1, «насколько это речь». Маску умножают на спектрограмму, подавляя шумные области и сохраняя речевые. Затем обратным STFT собирают чистый звук. Это та же идея масок, что в сегментации изображений, — снова аналогия с компьютерным зрением.

Частые ошибки

  • Агрессивный denoise. Сильное подавление режет и саму речь, ухудшая ASR — нужен баланс.
  • Оценивать шум по речи. Спектр шума надо брать из паузы (где VAD сказал «тишина»), иначе вычтете речь.
  • Пропускать VAD. Без него модель обрабатывает тонны тишины — медленно и с лишними «галлюцинациями» ASR.

Итоги

  • VAD находит, где есть речь; это обычно первый шаг конвейера.
  • Спектральное вычитание — простой denoise: оценить шум по паузе и вычесть.
  • Нейросетевой denoise предсказывает маску речи и убирает даже сложный шум.
  • Перебор с очисткой вредит речи — важен баланс.
Проверьте себя
1. Зачем нужен VAD в начале аудио-конвейера?
AЧтобы перевести речь
BЧтобы найти, где есть речь, и не тратить модели на тишину и шум
CЧтобы сделать звук громче
DЧтобы синтезировать голос
2. Откуда берут оценку спектра шума для спектрального вычитания?
AИз самой громкой части речи
BИз паузы, где речи нет (по данным VAD)
CИз текста
DИз частоты сэмплирования
3. Как работают многие нейросетевые denoise-модели под капотом?
AУдаляют весь звук
BПредсказывают маску речи для спектрограммы и подавляют шумные области
CПереводят текст
DМеняют частоту сэмплирования