---
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に設定できそうなのはこのへん。

KeyDefault説明
webrtc.high_pass_filtertrueいわゆるHPF
webrtc.noise_suppressiontrueノイズ抑制
webrtc.extended_filtertrue
webrtc.delay_agnostictrueディレイを補正する
webrtc.experimental_agcfalse最新版では削除
webrtc.experimental_nsfalse最新版では削除
webrtc.voice_detectiontrue声にタグ付けする?
webrtc.beamformingtrue複数マイクで方向抽出する
webrtc.gain_controlfalse
最終的に設定したのは以下の通り。
aec.args = {
    # ノイズ抑制で打鍵音が抑制されてしまう
	webrtc.noise_suppression = false
}