Подавление акустического эха
Streaming Sound Wave, а также его производные типы, такие как Capturable Sound Wave, поддерживают подавление акустического эха (Acoustic Echo Cancellation, 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)
- Это расширение предоставляется в виде исходного кода и требует проект 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);
Привязка Sound Wave для рендеринга
После включения AEC и настройки размера чанка привяжите Sound Wave для рендеринга, аудио которого будет использоваться для идентификации и удаления эха из захваченного сигнала. Обычно это 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);
Чтобы отвязать звуковую волну рендеринга:
- 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);
Дополнительная конфигурация
Stream Delay
Вы можете установить расчетную задержку потока (в миллисекундах) между путями рендеринга и захвата аудио. Это учитывает аппаратную и системную задержку, хотя 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 Гц и согласуйте фактическую аудиоконфигурацию как для потоков захвата, так и для потоков воспроизведения.