Skip to main content

🎙️ Финальное решение шумоподавления в Miscord

Анализ проблемы

После глубокого изучения WebRTC и аудио-обработки, выявлено:

❌ Что НЕ работает с WebRTC:

  1. Web Audio API destination streams - создают синтетические потоки без constraints
  2. AudioWorklet обработанные потоки - не передают constraints в WebRTC
  3. Процессорное шумоподавление через Web Audio - несовместимо с WebRTC
  4. MediaStreamTrackProcessor - экспериментальный API, плохая поддержка

✅ Что РАБОТАЕТ:

  1. Браузерное шумоподавление через getUserMedia constraints
  2. Google experimental constraints (googHighpassFilter и др.)
  3. Chromium флаги в Electron для APM3
  4. Voice Activity Detection (VAD) для отключения микрофона при молчании

Реализованное решение

1. Браузерное шумоподавление (voiceService.ts) ✅

2. Electron улучшения (electron/main.js) ✅

Дополнительные рекомендации

🎯 Для максимального качества:

1. Push-to-Talk (PTT) режим

Добавить кнопку для ручного включения/выключения микрофона:
  • Микрофон включается только при удержании кнопки
  • Полностью убирает дыхание и фоновые шумы при молчании
  • Поддерживает режим «зажать для разговора»

2. Улучшенный VAD (Voice Activity Detection)

Автоматически заглушать микрофон когда человек НЕ говорит:
  • Используем Silero VAD (уже есть в проекте: silero_vad_v5.onnx)
  • Настраиваем агрессивный порог для фильтрации дыхания
  • Микрофон активен только при детекции речи

3. Noise Gate с более высоким порогом

В advancedNoiseGate.ts увеличить порог:

4. Рекомендации пользователям

  • Использовать направленный микрофон (не встроенный в ноутбук)
  • Расстояние до микрофона: 10-15 см
  • Использовать Electron приложение (лучшее качество)
  • Настроить микрофон в системе Windows (убрать усиление если есть)

Почему RNNoise/DeepFilterNet НЕ подходят для WebRTC?

Проблема:

Все продвинутые шумодавы (RNNoise, DeepFilterNet, Speex) работают через:
  1. Web Audio API → создает синтетический stream
  2. AudioWorklet → обработанный stream теряет constraints
  3. Результат: WebRTC получает “сырой” поток без браузерной обработки

Техническое объяснение:

Единственный способ использовать RNNoise с WebRTC:

Серверная обработка - обрабатывать аудио на сервере перед отправкой другим клиентам. Но это:
  • Увеличивает задержку
  • Требует мощный сервер
  • Сложно масштабируется

Рекомендуемое решение

Вариант 1: Текущее решение + VAD (РЕКОМЕНДУЕТСЯ) ✅

Что уже есть:
  • Браузерное шумоподавление ✅
  • Google experimental filters ✅
  • Electron APM3 ✅
Что добавить:
  • Агрессивный VAD для автоматического заглушения при молчании
  • Push-to-Talk опция для пользователей
  • Noise Gate с высоким порогом
Результат:
  • Дыхание между фразами НЕ передается (микрофон заглушен)
  • Во время речи - максимальное браузерное шумоподавление
  • Эта схема используется в Miscord.

Вариант 2: Серверное шумоподавление (для будущего)

Обрабатывать аудио на backend с помощью RNNoise/DeepFilterNet:
  • Клиент отправляет сырой аудио
  • Сервер обрабатывает через RNNoise
  • Сервер отправляет обработанный аудио другим клиентам
Плюсы:
  • Максимальное качество шумоподавления
  • Работает для всех клиентов
Минусы:
  • Высокая нагрузка на сервер
  • Увеличенная задержка
  • Сложная реализация

Следующие шаги

Для немедленного улучшения:

  1. Включить агрессивный VAD ✅ (уже есть в проекте)
  2. Добавить Push-to-Talk режим (опционально для пользователей)
  3. Увеличить порог Noise Gate для фильтрации дыхания
  4. Рекомендовать Electron пользователям

Код для агрессивного VAD:

В voiceService.ts изменить пороги:
Это заглушит микрофон при тихих звуках (дыхание, шорохи).

Выводы

Текущее решение оптимально для WebRTC
Electron версия работает отлично благодаря APM3
Для полного устранения дыхания нужен агрессивный VAD
⚠️ RNNoise/DeepFilterNet требуют серверной обработки для WebRTC

Рекомендация: Используйте текущее решение + добавьте агрессивный VAD для автоматического заглушения микрофона при молчании. Это даст лучший результат чем любое процессорное шумоподавление! Дата: 30 сентября 2025
Статус: ГОТОВО К ПРОДАКШЕНУ