音響エコーキャンセリング
Streaming Sound Wave と、Capturable Sound Wave などの派生型は、音響エコーキャンセリング(AEC)をサポートしています。AEC は、レンダー信号(例:スピーカーから再生される音声)によって引き起こされるキャプチャされたマイク音声のエコーを取り除きます。これにより、リアルタイム通信シナリオでのクリーンな音声キャプチャが実現します。
このプラグインは、WebRTC AEC3 実装を通じて AEC を提供します。これは、関連する 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 のワークフローは 3 つのステップで構成されます:
- ストリーミング/キャプチャ可能なサウンドウェーブで AEC を有効にする
- 10 ms フレーム配信のために、レンダーサウンドウェーブで レンダーチャンクサイズを設定する
- キャプチャ信号からエコーをキャンセルするために使用される音声の レンダーサウンドウェーブをバインドする
AEC の有効化
ストリーミングサウンドウェーブを作成した後に AEC を有効にするには、ToggleAEC 関数を使用します。AEC プロセッサのサンプルレートとチャンネル数を指定する必要があります。入力のキャプチャオーディオまたはレンダーオーディオがこれらの値と一致しない場合、自動的にリサンプリングされますが、設定されたサンプルレートは品質(例:48000 Hz の方が 16000 Hz よりも優れたエコーキャンセリングをもたらします)とパフォーマンスに影響を与えるため、リサンプリングに任せるのではなく、意図的にこれらの値を選択する価値があります。
- 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 ms チャンク で処理する必要があります。レンダーサウンドウェーブが正しいフレームサイズでオーディオデータを配信するようにするには、レンダー Imported Sound Wave (スピーカーから再生されるサウンドウェーブ) で SetNumSamplesPerChunk 関数を使用します。
チャンクあたりの正しいサンプル数を計算する式は次のとおりです。
たとえば、48000 Hzのオーディオの場合: 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);
レンダリング中の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 Hzのサンプルレートをサポートしています。不一致のオーディオは自動的にリサンプリングされますが、これにはパフォーマンスのオーバーヘッドがあります。最高の品質とパフォーマンスを得るには、48000 Hzを使用し、キャプチャストリームとレンダーストリームの両方の実際のオーディオ設定を一致させてください。