> ## Documentation Index
> Fetch the complete documentation index at: https://docs.miscord.ru/llms.txt
> Use this file to discover all available pages before exploring further.

# FINAL NOISE SUPPRESSION SOLUTION

# 🎙️ Финальное решение шумоподавления в 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) ✅

```typescript theme={"dark"}
const rawStream = await navigator.mediaDevices.getUserMedia({
  audio: {
    echoCancellation: true,
    noiseSuppression: true,
    autoGainControl: true,
    sampleRate: 48000,
    channelCount: 1,
    // Google experimental constraints
    advanced: [
      { googHighpassFilter: { exact: true } },  // Убирает дыхание!
      { googNoiseSuppression: { exact: true } },
      { googTypingNoiseDetection: { exact: true } },
    ]
  }
});
```

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

```javascript theme={"dark"}
// APM3 + Hybrid AGC + ML-шумоподавление
app.commandLine.appendSwitch('enable-features', 'WebRtcUseEchoCanceller3,WebRtcHybridAgc');
app.commandLine.appendSwitch('enable-webrtc-apm-in-audio-service');
app.commandLine.appendSwitch('agc2-use-adaptive-digital', 'true');
```

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

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

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

Добавить кнопку для ручного включения/выключения микрофона:

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

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

Автоматически заглушать микрофон когда человек НЕ говорит:

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

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

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

```typescript theme={"dark"}
threshold: -25,  // Было -35, увеличиваем для агрессивного подавления
```

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

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

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

### Проблема:

Все продвинутые шумодавы (RNNoise, DeepFilterNet, Speex) работают через:

1. **Web Audio API** → создает синтетический stream
2. **AudioWorklet** → обработанный stream теряет constraints
3. **Результат**: WebRTC получает "сырой" поток без браузерной обработки

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

```
getUserMedia (с constraints) → Web Audio API → destination.stream
                 ↓                                      ↓
         [браузерное NS]                        [НЕТ constraints!]
                 ↓                                      ↓
            WebRTC ✅                              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` изменить пороги:

```typescript theme={"dark"}
// Более высокие пороги = меньше фоновых шумов передается
const totalThreshold = 8;   // Было 3, увеличиваем
const midThreshold = 12;    // Было 5, увеличиваем  
const maxThreshold = 15;    // Было 8, увеличиваем
```

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

## Выводы

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

***

**Рекомендация:** Используйте текущее решение + добавьте агрессивный VAD для автоматического заглушения микрофона при молчании. Это даст лучший результат чем любое процессорное шумоподавление!

**Дата:** 30 сентября 2025\
**Статус:** ГОТОВО К ПРОДАКШЕНУ
