Шумоподавление и детекция голоса (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 предсказывает маску речи и убирает даже сложный шум.
- Перебор с очисткой вредит речи — важен баланс.