Перейти к содержанию
Публикация AiManual

Забей на RNNoise: локальные нейросети для подавления шума, которые не тормозят

Обзор эффективных моделей для локального подавления шума в аудио. Практическое руководство по обучению и настройке. Сравнение производительности.

Коротко

Что будет в материале

  1. 01

    RNNoise умер? Нет, но он раздражает

  2. 02

    Что нам нужно от современного деноизера?

  3. 03

    Три модели, которые реально работают

  4. 04

    Как собрать свой датасет (без боли)

RNNoise умер? Нет, но он раздражает

Помните 2017 год? RNNoise тогда казался революцией - реальное шумоподавление на CPU. Сегодня он выглядит как старый Nokia в мире iPhone. Задержки в 50-100 мс, странные артефакты на фоновой музыке, полное игнорирование современных нейросетевых архитектур.

Проблема не в том, что RNNoise плох. Он просто устарел. Когда каждая миллисекунда на счету в реальных ASR-системах (вспомните наш разговор про локальную транскрибацию), эти задержки становятся критичными.

Что нам нужно от современного деноизера?

  • Задержка < 10 мс для реального времени
  • Работа на CPU без GPU
  • Сохранять музыку, а не превращать её в кашу
  • Открытые веса и возможность дообучения
  • Меньше 100 МБ на диске

Вот главное: большинство статей про шумоподавление сосредоточены на качестве звука. На практике важнее задержка и стабильность. ASR-система с идеальным звуком, но задержкой в 200 мс - бесполезна.

Три модели, которые реально работают

Модель Задержка Размер Качество музыки Сложность обучения
Demucs (урезанная) 15-25 мс 40 МБ Отличное Средняя
FullSubNet 8-12 мс 25 МБ Хорошее Высокая
Conv-TasNet 5-8 мс 15 МБ Среднее Низкая

Demucs: когда качество важнее скорости

Исходный Demucs создан для source separation (разделения инструментов). Но если отрезать от него всё лишнее, получается мощный деноизер. Главное преимущество - он не портит музыкальные фрагменты. Именно то, что нужно для подкастов с фоновой музыкой.

💡
Demucs работает в частотной области. Это ключевое отличие от RNNoise. Вместо попытки предсказать спектральную маску, он учится восстанавливать чистый спектр напрямую. Результат - меньше артефактов, особенно на переходных процессах.

FullSubNet: золотая середина

Архитектура специально создана для реального времени. Использует и полнодиапазонные, и субдиапазонные признаки одновременно. На практике это значит: он одинаково хорошо удаляет и постоянный гул (кондиционер), и импульсные шумы (клавиатура).

Conv-TasNet: скорость превыше всего

Если ваша задача - ASR с минимальной задержкой, это ваш выбор. Conv-TasNet работает полностью во временной области, без преобразований в частотную. Задержка минимальна, но есть нюанс: на сложных музыкальных фрагментах появляются артефакты.

Как собрать свой датасет (без боли)

Все говорят "нужен хороший датасет". Никто не говорит, как его собрать за неделю, а не за месяц. Вот мой рецепт:

1 Где взять чистый звук

  • LibriSpeech - 1000 часов чистых записей голоса
  • Ваши собственные записи в студийных условиях
  • Common Voice от Mozilla - фильтруйте по качеству
  • Аудиокниги - профессиональная запись, но нужно вырезать музыку

2 Как добавить реалистичный шум

Не используйте белый шум. Это бесполезно для реальных задач. Вместо этого:

  1. Запишите 10-20 минут фонового звука в разных условиях (офис, кафе, улица, дом)
  2. Смешивайте чистый звук с шумом в соотношениях от 0 dB до 20 dB SNR
  3. Добавляйте эхо (реверберацию) - это критично для реальных помещений
  4. Не забывайте про щелчки, скрипы и другие импульсные шумы

Самый частый провал: обучение на синтетических шумах, тестирование на реальных. Если ваша модель будет работать в офисах - записывайте шум в офисах, а не в студии.

3 Аугментация, которая работает

Стандартная аугментация (pitch shift, time stretch) здесь не подходит. Вместо этого:

  • Изменяйте громкость шума динамически (как в реальной жизни)
  • Добавляйте несколько источников шума одновременно
  • Имитируйте движение микрофона (Doppler effect для проезжающих машин)
  • Используйте комнатные импульсные отклики разных помещений

Тонкая настройка: где собака зарыта

Вы скачали предобученную модель. Она работает, но не идеально. Что дальше? Fine-tuning, но не тот, о котором все пишут.

Unsloth для аудио: стоит ли?

Unsloth великолепен для LLM, но для аудиомоделей? Не совсем. Проблема в том, что большинство аудиоархитектур используют специфичные операции, которые Unsloth не оптимизирует. Вы сэкономите 20% памяти, но потеряете совместимость.

💡
Вместо Unsloth используйте gradient checkpointing и mixed precision training. Для Conv-TasNet это даёт экономию памяти в 3-4 раза без сторонних библиотек.

Loss-функции: MSE не работает

Все учат с MSE loss. Все получают размытый звук. Потому что MSE усредняет ошибки. Для аудио нужны специальные loss-функции:

  • Multi-resolution STFT loss - сравнивает спектрограммы на разных разрешениях
  • SI-SNR (Scale-Invariant SNR) - игнорирует общую громкость
  • Mel-spectrogram loss - фокусируется на воспринимаемом качестве
  • Комбинация всех трёх с разными весами для разных частот

Как НЕ надо делать fine-tuning

  1. Не обновляйте все слои модели. Заморозьте encoder, обучайте только decoder
  2. Не используйте большой learning rate. Начните с 1e-5, а не с 1e-3
  3. Не обучайте на коротких сегментах (менее 2 секунд). Модель не выучит долгосрочные зависимости
  4. Не забывайте про overfitting. Если качество на валидации падает после 3-й эпохи - остановитесь

Интеграция с ASR: Whisper и не только

Шумоподавление без ASR - как машина без колес. Но интеграция - это отдельная история.

Whisper ненавидит артефакты

Whisper обучен на "сыром" звуке. Если ваш деноизер создаёт даже минимальные артефакты, точность Whisper падает на 20-30%. Решение? Обучайте деноизер совместно с Whisper или используйте loss от Whisper's encoder.

Пайплайн vs End-to-End

Два подхода:

  1. Отдельный деноизер → Whisper (проще, но больше задержка)
  2. Joint training деноизера и Whisper (сложнее, но задержка меньше)

Для реального времени я рекомендую первый вариант с буферизацией. Да, будет дополнительная задержка в 50-100 мс, но система стабильнее. Как мы обсуждали в статье про поиск для AI-агентов, иногда стабильность важнее минимальной задержки.

Wav2Vec2 более терпим

Если сравнивать с Whisper vs Wav2Vec2, то Wav2Vec2 менее чувствителен к артефактам шумоподавления. Но его точность на чистых данных ниже. Выбор зависит от задачи.

Развёртывание: от прототипа к продакшену

Обучение модели - полдела. Развернуть её так, чтобы она не падала под нагрузкой - это отдельный квест.

ONNX или PyTorch?

ONNX даёт прирост скорости в 1.5-2 раза. Но:

  • Не все операции поддерживаются
  • Отладка сложнее
  • Динамические размеры работают хуже

Мой совет: сначала на PyTorch, потом конвертируйте в ONNX только если производительность критична.

Буферизация и латенси

Самая частая ошибка - обработка каждого фрейма отдельно. На практике:

  1. Накопите 200-500 мс аудио
  2. Обработайте весь буфер
  3. Используйте overlap-add для плавных переходов
  4. Отправляйте в ASR порциями по 1-2 секунды

Не пытайтесь достичь нулевой задержки. Это невозможно физически. Вместо этого минимизируйте джиттер (вариативность задержки). Стабильные 50 мс лучше, чем 10 мс в одном случае и 100 мс в другом.

Мониторинг качества

Как понять, что модель деградирует в продакшене? Не по loss, точно.

  • Считайте PESQ/MOS онлайн (есть lightweight реализации)
  • Отслеживайте confidence score от ASR
  • Собирайте feedback от пользователей (кнопка "было неразборчиво")
  • Периодически запускайте эталонные тесты

Что делать, если всё равно плохо

Вы перепробовали все модели, настроили всё возможное, а качество всё равно не устраивает. Что дальше?

Может, проблема не в деноизере?

Часто проблема в upstream:

  • Плохой микрофон (нет, встроенный в ноутбук не считается хорошим)
  • Некорректная sample rate (16 кГц vs 48 кГц)
  • Клиппинг (перегрузка) на входе
  • Фоновый шум на 90 dB (тут уже ничего не поможет)

Гибридный подход

Иногда одна модель не справляется. Комбинируйте:

  1. Классический noise gate для тишины между фразами
  2. Conv-TasNet для быстрого подавления
  3. Demucs для финального полиша

Да, задержка увеличится. Но качество будет заметно лучше.

Когда сдаться и использовать облако

Если нужна качественная обработка музыки или студийный уровень - локальные модели не справятся. Сервисы вроде Adobe Enhanced Speech или облачные API дадут лучшее качество. Но вы платите деньгами и задержкой.

💡
Финальный совет: начните с Conv-TasNet. Он простой, быстрый, и покажет, решает ли шумоподавление вашу проблему. Если нет - переходите к более сложным моделям. Не пытайтесь сразу построить идеальную систему.

Локальное шумоподавление - не магия, а инженерия. Сложная, капризная, но достижимая. Главное - не гнаться за теоретическими метриками, а решать конкретные проблемы ваших пользователей. Иногда удаление фонового шума кофеварки важнее, чем идеальное сохранение музыки Бетховена.