--- config: look: handDrawn --- flowchart LR mic[Mic] --> capture app --> sink speaker -.-> mic subgraph echo-cancel capture((capture)) --> Cancel sink((sink)) --> Cancel Cancel --> source((source)) Cancel --> playback((playback)) end playback --> speaker source --> OBS
スピーカーはplaybackを再生しているが、これだとエコーキャンセルの遅延が入ってしまうので音ゲー的には望ましくない。スピーカーはアプリを直接再生したいが、マイクに入るエコーの遅延時間がエコーキャンセルの想定と変わることになり、正常に動くかは検証が必要だ。
情報源
ソースコード
ChroniumのWebRTC実装に含まれているコードを使っている。 modules/audio_processing/aec3 - src - Git at Google
ここがGoogleのコードから音声処理のところだけ抜き出している。 PulseAudio/webrtc-audio-processing
PipeWireが上記を利用しているのがここ。
https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/spa/plugins/aec/aec-webrtc.cpp
Bazzaiteは/usr/lib64/libwebrtc-audio-processing-1.so.3なのでHAVE_WEBRTC1
の分岐に入っていそう
libpipewire-module-echo-cancel https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/src/modules/module-echo-cancel.c
buffer.max_size buffer.play_delay
aec.argsに設定できそうなのはこのへん。
Key | Default | 説明 |
---|---|---|
webrtc.high_pass_filter | true | いわゆるHPF |
webrtc.noise_suppression | true | ノイズ抑制 |
webrtc.extended_filter | true | ? |
webrtc.delay_agnostic | true | ディレイを補正する |
webrtc.experimental_agc | false | 最新版では削除 |
webrtc.experimental_ns | false | 最新版では削除 |
webrtc.voice_detection | true | 声にタグ付けする? |
webrtc.beamforming | true | 複数マイクで方向抽出する |
webrtc.gain_control | false | |
最終的に設定したのは以下の通り。 |
aec.args = {
# ノイズ抑制で打鍵音が抑制されてしまう
webrtc.noise_suppression = false
}