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 (разделения инструментов). Но если отрезать от него всё лишнее, получается мощный деноизер. Главное преимущество - он не портит музыкальные фрагменты. Именно то, что нужно для подкастов с фоновой музыкой.
FullSubNet: золотая середина
Архитектура специально создана для реального времени. Использует и полнодиапазонные, и субдиапазонные признаки одновременно. На практике это значит: он одинаково хорошо удаляет и постоянный гул (кондиционер), и импульсные шумы (клавиатура).
Conv-TasNet: скорость превыше всего
Если ваша задача - ASR с минимальной задержкой, это ваш выбор. Conv-TasNet работает полностью во временной области, без преобразований в частотную. Задержка минимальна, но есть нюанс: на сложных музыкальных фрагментах появляются артефакты.
Как собрать свой датасет (без боли)
Все говорят "нужен хороший датасет". Никто не говорит, как его собрать за неделю, а не за месяц. Вот мой рецепт:
1 Где взять чистый звук
- LibriSpeech - 1000 часов чистых записей голоса
- Ваши собственные записи в студийных условиях
- Common Voice от Mozilla - фильтруйте по качеству
- Аудиокниги - профессиональная запись, но нужно вырезать музыку
2 Как добавить реалистичный шум
Не используйте белый шум. Это бесполезно для реальных задач. Вместо этого:
- Запишите 10-20 минут фонового звука в разных условиях (офис, кафе, улица, дом)
- Смешивайте чистый звук с шумом в соотношениях от 0 dB до 20 dB SNR
- Добавляйте эхо (реверберацию) - это критично для реальных помещений
- Не забывайте про щелчки, скрипы и другие импульсные шумы
Самый частый провал: обучение на синтетических шумах, тестирование на реальных. Если ваша модель будет работать в офисах - записывайте шум в офисах, а не в студии.
3 Аугментация, которая работает
Стандартная аугментация (pitch shift, time stretch) здесь не подходит. Вместо этого:
- Изменяйте громкость шума динамически (как в реальной жизни)
- Добавляйте несколько источников шума одновременно
- Имитируйте движение микрофона (Doppler effect для проезжающих машин)
- Используйте комнатные импульсные отклики разных помещений
Тонкая настройка: где собака зарыта
Вы скачали предобученную модель. Она работает, но не идеально. Что дальше? Fine-tuning, но не тот, о котором все пишут.
Unsloth для аудио: стоит ли?
Unsloth великолепен для LLM, но для аудиомоделей? Не совсем. Проблема в том, что большинство аудиоархитектур используют специфичные операции, которые Unsloth не оптимизирует. Вы сэкономите 20% памяти, но потеряете совместимость.
Loss-функции: MSE не работает
Все учат с MSE loss. Все получают размытый звук. Потому что MSE усредняет ошибки. Для аудио нужны специальные loss-функции:
- Multi-resolution STFT loss - сравнивает спектрограммы на разных разрешениях
- SI-SNR (Scale-Invariant SNR) - игнорирует общую громкость
- Mel-spectrogram loss - фокусируется на воспринимаемом качестве
- Комбинация всех трёх с разными весами для разных частот
Как НЕ надо делать fine-tuning
- Не обновляйте все слои модели. Заморозьте encoder, обучайте только decoder
- Не используйте большой learning rate. Начните с 1e-5, а не с 1e-3
- Не обучайте на коротких сегментах (менее 2 секунд). Модель не выучит долгосрочные зависимости
- Не забывайте про overfitting. Если качество на валидации падает после 3-й эпохи - остановитесь
Интеграция с ASR: Whisper и не только
Шумоподавление без ASR - как машина без колес. Но интеграция - это отдельная история.
Whisper ненавидит артефакты
Whisper обучен на "сыром" звуке. Если ваш деноизер создаёт даже минимальные артефакты, точность Whisper падает на 20-30%. Решение? Обучайте деноизер совместно с Whisper или используйте loss от Whisper's encoder.
Пайплайн vs End-to-End
Два подхода:
- Отдельный деноизер → Whisper (проще, но больше задержка)
- Joint training деноизера и Whisper (сложнее, но задержка меньше)
Для реального времени я рекомендую первый вариант с буферизацией. Да, будет дополнительная задержка в 50-100 мс, но система стабильнее. Как мы обсуждали в статье про поиск для AI-агентов, иногда стабильность важнее минимальной задержки.
Wav2Vec2 более терпим
Если сравнивать с Whisper vs Wav2Vec2, то Wav2Vec2 менее чувствителен к артефактам шумоподавления. Но его точность на чистых данных ниже. Выбор зависит от задачи.
Развёртывание: от прототипа к продакшену
Обучение модели - полдела. Развернуть её так, чтобы она не падала под нагрузкой - это отдельный квест.
ONNX или PyTorch?
ONNX даёт прирост скорости в 1.5-2 раза. Но:
- Не все операции поддерживаются
- Отладка сложнее
- Динамические размеры работают хуже
Мой совет: сначала на PyTorch, потом конвертируйте в ONNX только если производительность критична.
Буферизация и латенси
Самая частая ошибка - обработка каждого фрейма отдельно. На практике:
- Накопите 200-500 мс аудио
- Обработайте весь буфер
- Используйте overlap-add для плавных переходов
- Отправляйте в ASR порциями по 1-2 секунды
Не пытайтесь достичь нулевой задержки. Это невозможно физически. Вместо этого минимизируйте джиттер (вариативность задержки). Стабильные 50 мс лучше, чем 10 мс в одном случае и 100 мс в другом.
Мониторинг качества
Как понять, что модель деградирует в продакшене? Не по loss, точно.
- Считайте PESQ/MOS онлайн (есть lightweight реализации)
- Отслеживайте confidence score от ASR
- Собирайте feedback от пользователей (кнопка "было неразборчиво")
- Периодически запускайте эталонные тесты
Что делать, если всё равно плохо
Вы перепробовали все модели, настроили всё возможное, а качество всё равно не устраивает. Что дальше?
Может, проблема не в деноизере?
Часто проблема в upstream:
- Плохой микрофон (нет, встроенный в ноутбук не считается хорошим)
- Некорректная sample rate (16 кГц vs 48 кГц)
- Клиппинг (перегрузка) на входе
- Фоновый шум на 90 dB (тут уже ничего не поможет)
Гибридный подход
Иногда одна модель не справляется. Комбинируйте:
- Классический noise gate для тишины между фразами
- Conv-TasNet для быстрого подавления
- Demucs для финального полиша
Да, задержка увеличится. Но качество будет заметно лучше.
Когда сдаться и использовать облако
Если нужна качественная обработка музыки или студийный уровень - локальные модели не справятся. Сервисы вроде Adobe Enhanced Speech или облачные API дадут лучшее качество. Но вы платите деньгами и задержкой.
Локальное шумоподавление - не магия, а инженерия. Сложная, капризная, но достижимая. Главное - не гнаться за теоретическими метриками, а решать конкретные проблемы ваших пользователей. Иногда удаление фонового шума кофеварки важнее, чем идеальное сохранение музыки Бетховена.