Wav2Vec2-обусловленная диффузия для очистки речи
Это работа про то, как добавить в diffusion-based speech enhancement не просто шумовой контекст, а фонетическую опору. Авторы берут frozen wav2vec 2.0, извлекают признаки из зашумленного сигнала и подают их в U-Net denoiser через FiLM-модуляцию в bottleneck. Идея простая, но важная: диффузионная модель должна восстанавливать не только “чисто звучащий” спектр, но и содержательно правильную речь.
Зачем здесь wav2vec 2.0
Классические enhancement-модели часто оптимизируют локальную акустическую близость: маску, complex STFT, waveform-регрессию. Они хорошо убирают шум, но при тяжелых искажениях могут сглаживать речь, съедать фрикативы, портить форманты или создавать красивый, но семантически сомнительный сигнал. Диффузионные модели вроде StoRM дают более естественную генерацию, но без дополнительной лингвистической подсказки обратный процесс остается в основном акустическим.
wav2vec 2.0 полезен именно как устойчивый фонетический якорь. Его признаки извлекаются из noisy input, но предобучение заставляет их удерживать информацию о фонемах и речевом содержании даже при шуме. Поэтому conditioning через wav2vec 2.0 можно читать как способ сказать denoiser-у: “вот речевая структура, которую нельзя потерять, пока ты чистишь спектр”.
Архитектура
- База — diffusion speech enhancement в стиле StoRM/NCSN++: U-Net работает в комплексной STFT-области и делает reverse diffusion за фиксированное число шагов.
- wav2vec 2.0 base заморожен. Авторы берут выход последнего transformer layer с шагом около 20 мс.
- Трехслойный MLP превращает эти признаки в FiLM-коэффициенты: scale и shift для feature maps.
- FiLM вставляется только в bottleneck U-Net, а не во все уровни. Это принципиально: bottleneck содержит более абстрактное представление, которое естественнее совмещать с фонетическими признаками.
- Последовательность FiLM-коэффициентов сжимается во времени через exponential smoothing. Авторы мотивируют это как steady-state форму Kalman filter для простой linear-Gaussian модели, то есть не просто “усреднили как получилось”, а выбрали причинную агрегацию с понятным статистическим смыслом.
Что показали эксперименты
На VoiceBank-DEMAND главное сравнение идет против StoRM при одинаковой ширине U-Net. В 128-channel варианте StoRM получает PESQ 2.4862, а Wav2Vec2-FiLM версия — 2.8742. Это и есть примерно +0.4 PESQ, вынесенные в мета-строку. STOI тоже растет: 0.8571 → 0.8673. В 32-channel варианте прирост меньше, но модель все равно выше baseline по PESQ/STOI.
Есть важный нюанс: SI-SDR не всегда улучшается. Авторы связывают это с более агрессивным noise suppression: модель лучше с perceptual/quality-метриками, но может сильнее вмешиваться в энергетическую структуру сигнала. Для продакшена это не мелочь: если downstream-задача чувствительна к фазе, уровню или speaker identity, нужно смотреть не только PESQ.
На LibriMix результат для 32-channel варианта выглядит сильнее: PESQ 2.0099 против 1.6385 у StoRM-32, STOI 0.7836 против 0.7409, SI-SDR 11.91 против 9.61. То есть идея переносится за пределы VoiceBank-DEMAND, хотя масштаб проверки пока умеренный.
Почему bottleneck-only лучше
Самая полезная ablation-часть — место FiLM conditioning. Bottleneck-only дает PESQ около 2.86. Если добавить FiLM еще в encoder, качество падает, а если в decoder плюс bottleneck — падает сильно. Это логично: ранние уровни U-Net заняты низкоуровневой спектро-временной геометрией, и высокоуровневый phonetic modulation может там ломать локальные детали. Bottleneck — компромиссная точка, где речь уже достаточно абстрагирована, но еще влияет на реконструкцию.
Стоимость inference
Дополнительный wav2vec 2.0 encoder выглядит дорогим только на бумаге. В diffusion pipeline основная цена — U-Net, умноженный на 30 reverse steps. Для 32-channel конфигурации авторы оценивают diffusion часть примерно в 592 GFLOPs, а wav2vec 2.0 base — около 13.27 GFLOPs на секунду речи, то есть небольшая добавка к общей цене. RTF у Ours-32 растет с 0.36 до 0.55 относительно StoRM-32, но остается faster-than-real-time на GTX 3090.
Ограничения
- Нет формального subjective listening test, а для enhancement это часто важнее одной объективной метрики.
- Проверены wav2vec 2.0 features, но не WavLM/HuBERT, хотя для noisy/reverberant речи они могут вести себя иначе.
- Diffusion sampling все еще тяжелее, чем discriminative denoiser, особенно если нужен streaming или edge.
- SI-SDR trade-off показывает, что модель может быть “перечищающей”, а не просто лучше во всех смыслах.
Практический вывод
Работа хороша не тем, что “диффузия снова победила”, а тем, что показывает правильный способ вставлять SSL-речевые представления в генеративный denoiser. Не обязательно скармливать wav2vec everywhere; достаточно узкой FiLM-модуляции в bottleneck и аккуратной temporal aggregation. Для speech stack это полезный паттерн: семантический/фонетический encoder может выступать как control signal для enhancement, dereverberation или bandwidth extension, если не разрушать низкоуровневую акустику.
Фишка из статьи. Авторы используют wav2vec 2.0 не как ASR-голову, а как источник bottleneck-признаков для FiLM-conditioning в diffusion speech enhancement. При этом FiLM-коэффициенты можно сглаживать экспоненциально, получая управляемый компромисс между временной детализацией и стабильностью conditioning.
| VB-DEMAND | PESQ | STOI | SI-SDR |
|---|---|---|---|
| Noisy | 1.9797 | 0.7867 | 8.4450 |
| StoRM-128 | 2.4862 | 0.8571 | 18.5656 |
| OURS-128 | 2.8742 | 0.8673 | 17.9844 |
| StoRM-32 | 2.7941 | 0.8522 | 17.9520 |
| OURS-32 | 2.8636 | 0.8589 | 17.8179 |
| Mean pool-32 | 2.9186 | 0.8613 | 17.3581 |
| Инференс | Параметры | RTF | Real-time |
|---|---|---|---|
| StoRM-128 | 55.1M | 1.63 | нет |
| OURS-128 | 55.1M | 1.80 | нет |
| StoRM-32 | 3.6M | 0.36 | да |
| OURS-32 | 3.6M | 0.55 | да |
Техническая деталь: wav2vec 2.0 заморожен, работает с 768-мерным последним слоем и 20-мс frame rate. Это делает работу особенно интересной для легких enhancement-моделей: качество растет, но 32-канальная версия остается real-time.