acoustic-echo-cancellation
Акустическое эхоподавление
Streaming Sound Wave, а также его производные типы, такие как Capturable Sound Wave, поддерживает акустическое эхоподавление (AEC). AEC удаляет эхо из захваченного аудио с микрофона, вызванное воспроизведением сигнала рендера (например, звука через динамики). Результатом является более чистая запись голоса в сценариях реального времени.
Плагин предоставляет AEC через реализацию WebRTC AEC3, доступную как лёгкий расширенный плагин, который поставляет только соответствующий код AEC3. WebRTC AEC3 — это высококачественный акустический эхоподавитель, широко используемый в приложениях реального времени. Он моделирует акустический путь между динамиками и микрофоном, чтобы вычитать эхо из захваченного сигнала.
Установка
Чтобы использовать акустическое эхоподавление, необходимо установить расширенный плагин WebRTC AEC3:
- Убедитесь, что плагин Runtime Audio Importer уже установлен в вашем проекте
- Скачайте расширенный плагин WebRTC AEC3 здесь
- Извлеките папку из скачанного архива в папку
Pluginsвашего проекта (создайте эту папку, если она отсутствует) - Пересоберите проект (этот расширенный плагин требует C++ проект)
- WebRTC AEC3 поддерживает все версии движка, поддерживаемые Runtime Audio Importer (UE 4.24, 4.25, 4.26, 4.27, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7 и 5.8)
- Это расширение предоставляется в виде исходного кода и требует C++ проект для использования
- WebRTC AEC3 доступен для Windows, Linux, Mac, Android (включая Meta Quest) и iOS
- Для получения дополнительной информации о том, как собирать плагины вручную, смотрите руководство по сборке плагинов
Основное использование
Типичный рабочий процесс AEC включает три шага:
- Включите AEC на вашей потоковой/захватываемой звуковой волне
- Настройте размер чанка рендера на звуковой волне рендера для доставки кадров по 10 мс
- Привяжите звуковую волну рендера, чей звук будет использоваться для подавления эха из захватываемого сигнала
Включение AEC
Чтобы включить AEC после создания потоковой звуковой волны, используйте функцию ToggleAEC. Вы должны указать частоту дискретизации и количество каналов для процессора AEC. Если входящее аудио захвата или рендера не соответствует этим значениям, оно будет автоматически пересэмплировано, однако настроенная частота дискретизации всё равно влияет на качество (например, 48000 Гц даст лучшее эхоподавление, чем 16000 Гц) и производительность, поэтому стоит выбирать эти значения осознанно, а не полагаться на пересэмплирование.
- Blueprint
- C++

// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
StreamingSoundWave->ToggleAEC(true, 48000, 1);
Вы можете проверить, включена ли в данный момент AEC:
- Blueprint
- C++

// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
bool bEnabled = StreamingSoundWave->IsAECEnabled();
Настройка размера чанка рендера
WebRTC AEC3 требует обработки аудио чанками длительностью 10 мс. Чтобы гарантировать, что рендерная звуковая волна доставляет аудиоданные с правильным размером кадра, используйте функцию SetNumSamplesPerChunk для рендерной Imported Sound Wave (звуковой волны, воспроизводимой через динамики).
Формула для расчёта правильного количества сэмплов на чанк:
Например, для аудио 48000 Гц: 48000 / 100 = 480 семплов на чанк.
- Blueprint
- C++

// Assuming ImportedSoundWave is a UE reference to a UImportedSoundWave object (the render sound wave being played through speakers)
ImportedSoundWave->SetNumSamplesPerChunk(ImportedSoundWave->GetSampleRate() / 100);
Привязка Render Sound Wave
После включения AEC и настройки размера чанка привяжите Render Sound Wave, аудиоданные которого будут использоваться для выявления и удаления эха из захватываемого сигнала. Обычно это звуковая волна, воспроизводимая через динамики, которую может улавливать микрофон:
- Blueprint
- C++

// Assuming StreamingSoundWave is the capture sound wave (microphone input) with AEC enabled
// (can also be a UCapturableSoundWave, which is the most common use case)
// Assuming ImportedSoundWave is the render sound wave being played through speakers
StreamingSoundWave->BindAECToSoundWavePlayback(ImportedSoundWave);
Чтобы отвязать воспроизводимую Sound Wave:
- Blueprint
- C++

// Assuming StreamingSoundWave is the capture sound wave (microphone input) with AEC enabled
// (can also be a UCapturableSoundWave, which is the most common use case)
// Assuming ImportedSoundWave is the render sound wave being played through speakers
StreamingSoundWave->UnbindAECFromSoundWavePlayback(ImportedSoundWave);
Дополнительная настройка
Задержка потока
Вы можете задать предполагаемую задержку потока (в миллисекундах) между путями рендеринга и захвата аудио. Это учитывает задержку оборудования и системы, хотя WebRTC AEC3 может оценить это автоматически во многих случаях:
- Blueprint
- C++

// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
StreamingSoundWave->SetAECStreamDelay(50);
Сброс AEC
Вы можете сбросить внутреннее состояние процессора AEC в любое время, очистив накопленную модель эха:
- Blueprint
- C++

StreamingSoundWave->ResetAEC();
WebRTC AEC3 поддерживает частоты дискретизации 8000, 16000, 32000 и 48000 Гц. Несовпадающее аудио автоматически передискретизируется, но это создаёт издержки производительности. Для наилучшего качества и производительности используйте 48000 Гц и согласуйте фактическую аудиоконфигурацию как захватывающего, так и воспроизводимого потоков.