Акустическое подавление эха
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 для рендерной импортированной звуковой волны (звуковой волны, воспроизводимой через динамики).
Формула для расчета правильного количества сэмплов на чанк:
Например, для аудио с частотой 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);
Привязка звуковой волны рендеринга
После включения AEC и настройки размера чанка привяжите звуковую волну рендеринга, аудио которой будет использоваться для идентификации и удаления эха из захваченного сигнала. Обычно это звуковая волна, воспроизводимая через динамики, которую может уловить микрофон:
- 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);
Дополнительная настройка
Задержка потока
Вы можете задать предполагаемую задержку потока (в миллисекундах) между путями рендеринга и захвата аудио. Это компенсирует аппаратную и системную задержку, хотя 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 Гц и согласуйте фактическую аудиоконфигурацию как потоков захвата, так и потоков воспроизведения.