基本的に PulseAudio のフィルタとして使うことになる。 アプリ側にノイズ除去があると二重にかかって酷い事になりがちなので、アプリか PulseAudio のどちらかをオフにする。
Wayland を使う場合は WaylandとPipeWireとEasyEffectsでノイズ除去する を参照。
設定は ~/.config/pulse/default.pa に以下のように書く。
.include /etc/pulse/default.pa
# your configurations here
検証等でエコーバックさせるには module-loopback を有効にすればいい
% pactl load-module module-loopback
無効にするには
% pactl unload-module module-loopback
PulseAudio 標準添付。バックエンドとして WebRTC, Speex 等が選べるけど WebRTC を選んでおけば問題なさそう。 標準のマイクよりも音が大きめになるっぽい感じ。ボリュームは控えたほうがよさげ。
- https://wiki.archlinux.org/index.php/PulseAudio/Troubleshooting#Enable_Echo/Noise-Cancellation
- https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/#module-echo-cancel
- https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/blob/master/src/modules/echo-cancel/webrtc.cc
load-module module-echo-cancel use_master_format=1 aec_method=webrtc aec_args="analog_gain_control=0\ digital_gain_control=1" source_name=nc_source sink_name=nc_sink
update-source-proplist nc_source device.description="Microphone (NC)"
update-sink-proplist nc_sink device.description="Headphones (NC)"
set-default-source nc_source
もし speex を使う場合は channels=1 を指定する必要がある。
回帰型ニューラルネットワークを使ったノイズ除去。タイプ音も消してくれる。すごい。でも普通の声もたまに消える気もする。
% yay -S noise-suppression-for-voice
load-module module-null-sink sink_name=mic_denoised_out rate=48000
load-module module-ladspa-sink sink_name=mic_raw_in sink_master=mic_denoised_out label=noise_suppressor_mono channels=1 plugin=/usr/lib/ladspa/librnnoise_ladspa.so control=50
load-module module-loopback source=alsa_input.pci-0000_00_1f.3.analog-stereo sink=mic_raw_in channels=1 source_dont_move=true sink_dont_move=true
load-module module-remap-source source_name=denoised master=mic_denoised_out.monitor channels=1
update-source-proplist denoised device.description="Microphone (RNNoise)"
set-default-source denoised
この設定はとても複雑。loopback を利用するから遅延も起きる。
https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/843 RNNoise Module が欲しいって言われてるけど 3rd party に依存できないって話とかで難しそう。そのかわり https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/120 の module-ladspa-source
upvote したらって言われてる。すごく欲しい。
ニューラルネットワークだから本来ならトレーニングがいる。rnnoise は学習済みデータとして https://github.com/xiph/rnnoise/blob/master/src/rnn_data.c を持っている。おそらく、英語話者の音声を使ってトレーニングしたのではと想像する。
トレーニングさせる方法は https://github.com/xiph/rnnoise/blob/master/TRAINING-README に記述がある。
日本語での精度を上げるには日本語音声を使って再トレーニングをした方がよいのだろうなとか思う。
noise-suppression-for-voice を簡単に設定できるようにしたやつ。https://github.com/lawl/NoiseTorch/blob/master/module.go を見た感じ README にある手順を中で実行してるだけぽい。だから loopback
を使う事による遅延もおきる。