实时噪音去除与PulseAudio?

有没有可能使用PulseAudio进行实时降噪,以使输出的声音更加流畅?

可能是可以的,尽管这需要大量工作,并且需要有人编写一个过滤器来实现。 - RolandiXor
3@Vadi - 我添加了一个答案,如果你仍在使用Ubuntu或任何其他基于PulseAudio的发行版,它可能会对你有所帮助。希望对你有用,伙计。 - Luis Alvarado
这个帖子似乎在做类似的事情。 - akhmed
10个回答

PulseAudio模块module-echo-cancel

我开始阅读关于PulseAudio和它的“隐藏”选项的大量资料,以便找到一个与这个问题类似的选项。我找到了噪音消除模块,它可以显著降低麦克风上的任何静音,并且甚至可以减少大部分背景噪音,基本上只录制您自己的声音,并具有出色的音质(例如用于音频录制)。要做到这一点,请按照以下步骤操作:

  1. sudo nano /etc/pulse/default.pa

  2. 在文件的任何位置添加以下行,但我建议将其放在接近末尾的地方,您会在那里找到有关回声消除的注释(大约在第140行附近):

    load-module module-echo-cancel
    
  3. 重新加载PulseAudio(pulseaudio -k)或者简单地重新启动计算机。您应该能够从输入设备部分选择新的噪音消除选项:

    screenshot

你可以在回声消除模块页面上找到更多相关信息。

将输入设为默认

如果你希望将回声消除设备设为默认, 只需将上述行改为:

load-module module-echo-cancel source_name=logitechsource

然后在文件底部添加
set-default-source logitechsource

在这种情况下,我将源命名为logitechsource,但您可以根据需要自行命名,并简单地重新启动pulseaudio。

重命名设备

最后,如果您不希望在声音设置中有一个超长的名称(当您想要选择输入/输出设备时),我的建议是像这样重命名输入设备:

load-module module-echo-cancel source_name=logitechsource source_properties=device.description=LogitechHD

再次启动pulseaudio。最终结果看起来像这样:

screenshot

更新 - 完整文档在此处找到 感谢clément

无法工作,找不到module-echo-cancel.c,这是我收到的错误信息 @luis - nikoss
@nikoss 嗨,我可以在askubuntu聊天室或通过Google Hangouts帮你一把。 - Luis Alvarado
18如果你想避免回声模块自动调整音量滑块,你可以按照 https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/224 设置 load-module module-echo-cancel aec_method=webrtc aec_args="analog_gain_control=0 digital_gain_control=1" - joelostblom
你是否知道如何在输出时动态添加/删除(pactl)回声消除功能,我想在播放在教堂录制的音频文件时使用。 - Henk Poley
4您还可以使用pactl load-module module-echo-cancel临时加载模块。 - Madacol
5~/.config/default.pa 编辑会更合适,不是吗? - BipedalShark
2module-echo-cancel添加到脉冲音频中会使我的声音在录音中听起来略带金属质感。它确实能消除一些背景噪音,但并非全部。 - Paul Rougieux
2@BipedalShark的建议不错,但由于用户配置文件会覆盖系统配置文件,您需要在文件顶部使用.include /etc/pulse/default.pa引用默认配置文件。谢谢这个精彩的回答。此外,我将我的配置写在 ~/.config/pulse/default.pa中。 - Sufian
重启后,load-module module-echo-cancel source_name=logitechsource source_properties=device.description=LogitechHD 不起作用。 - Rajesh Chaudhary
更新我的上面的评论,看起来你现在需要在空格前加上“\”,并输入aec_args="analog_gain_control=0\\ digital_gain_control=1"才能使其正常工作。 - joelostblom
每次重启后,我都必须执行pulseaudio -k才能看到带有降噪功能的麦克风。如何解决这个问题? - FreePhoenix
嗨 @FreePhoenix,我不太清楚了,我已经转移到pipewire了。 - Luis Alvarado

这是一个老问题,但我遇到了同样的问题,在一些谷歌搜索(大多数人都认为这是不可能的)和阅读一些手册后,我现在基于user2330377的想法开发出了一个解决方案。
首先,您需要为SoX创建一个噪声配置文件。只需使用任何音频录制程序录制几秒钟的噪声,然后进入保存它的目录并执行“sox noise.wav -n noiseprof noise.prof”。
然后,您需要创建一个ALSA回环设备:
sudo modprobe snd_aloop

这是必需的,因为与Jack不同,pulseaudio不能直接将音频软件连接在一起;因此,我们将使用回环设备作为代理。
现在您需要启动paman并找到您的麦克风(或其他录音设备)和刚刚创建的回环设备的名称。一旦找到了这些名称,您可以执行以下命令来开始从麦克风录制声音,通过SoX进行处理,然后在回环设备上播放:
pacat -r -d alsa_input.pci-0000_00_14.2.analog-stereo --latency=1msec|sox -b 16 -e signed -c 2 -r 44100 -t raw - -b 16 -e signed -c 2 -r 44100 -t raw - noisered noise.prof 0.2|pacat -p -d alsa_output.2.analog-stereo --latency=1msec

(在-d参数中,您需要替换正确的设备名称--第一个pacat调用的输入设备和第二个的回环设备输出。)

好了,快完成了!作为最后一步,使用您选择的应用程序开始录制声音,然后启动pavucontrol,切换到"Recording"选项卡,并将用于录制的音频设备(显示为右侧的灰色按钮)设置为"Loopback Audio Device的Monitor"。现在,您应该有一个清晰且无噪音的录音!


1这个脚本确实简化了流程。https://gist.github.com/tiagoengel/334573f7c3b98c27356297d6b1996336 - Thomas

在Ubuntu LTS或基于Debian的发行版上有一个非常简单的解决方案。这是一个在线脚本,可以激活已经存在于PulseAudio(Debian上的默认音频系统)中的降噪功能。
wget -qO - https://gist.githubusercontent.com/grigio/cb93c3e8710a6f045a3dd9456ec01799/raw/94f07c7d75bcf5dd9b08a9c3034844223ec6fbe1/fix-microphone-background-noise.sh | sudo bash && pulseaudio -k

你也可以在secsetion中运行这些命令(它们是同一件事)
sudo cp /etc/pulse/default.pa /etc/pulse/default.pa.bak
sudo cat <<EOT >> /etc/pulse/default.pa
load-module module-echo-cancel source_name=noechosource sink_name=noechosink
set-default-source noechosource
set-default-sink noechosink
EOT

嘿,我该怎么撤销这个操作?我执行了两次,现在看到了重复的输入,麦克风和摄像头都不见了! - Omar Dulaimi
这个方法有效,谢谢Karim!顺便说一下,@OmarDulaimi - 可能已经太晚了,但下次只需查看脚本即可 :) 它在第一行创建了一个备份,你可以在/etc/pulse/default.pa.bak找到它,所以答案是:将/etc/pulse/default.pa文件移动到其他地方(以防万一,这又是一个备份),然后将/etc/pulse/default.pa.bak重命名为/etc/pulse/default.pa - konrados

关于噪音消除,模块文档页面上没有任何信息。只有模块-回声消除中包含了AEC(声学回声消除)算法,它有几种实现方式,比如webrtc | speex。

因此,尽可能购买带有集成噪音消除功能的耳机|麦克风。

在我测试Ubuntu上的语音录制时,我发现了一些特定的特点:

  • Skype、Telegram使用默认设备的原始输入(在我的情况下是前置麦克风|后置麦克风插孔)。如果你需要在这些应用程序中消除噪音,你应该只购买带有集成噪音消除功能的耳机|麦克风

  • 如果你需要在浏览器中进行语音通话,那么你应该记住浏览器有自己的语音处理算法实现,例如WebRTC。

  • 此外,网络应用程序(如talky、hangouts、appear.in等网站)可以有自己的语音处理算法实现,尽管它们可能基于webrtc hangout-analysis



有一个用于module-ladspa-sink的降噪插件。 在这里,您可以找到一个针对Fedora安装的教程,并提供两个示例录音以了解插件的效果。 在Ubuntu上:
1. 下载linux_rnnoise_bin_x64.tar.gz。 2. 从存档中复制bin/ladspa/librnnoise_ladspa.so/usr/local/lib/librnnoise_ladspa.so或其他任何位置。 3. 使用pactl list sources short找出您的输入设备的名称。例如,我的麦克风被称为alsa_input.usb-046d_0994_4A365E20-02.mono-fallback。 4. 运行以下命令以激活降噪功能(在运行之前,请将/usr/local/lib/librnnoise_ladspa.soalsa_input.usb-046d_0994_4A365E20-02.mono-fallback替换为步骤2和3中确定的值):
    pacmd load-module module-null-sink sink_name=mic_denoised_out
    pacmd load-module module-ladspa-sink sink_name=mic_raw_in \
        sink_master=mic_denoised_out label=noise_suppressor_mono \
        plugin=/usr/local/lib/librnnoise_ladspa.so \
        control=50
    pacmd load-module module-loopback \
        source=alsa_input.usb-046d_0994_4A365E20-02.mono-fallback \
        sink=mic_raw_in channels=1 source_dont_move=true sink_dont_move=true
    pacmd load-module module-remap-source source_name=denoised \
        master=mic_denoised_out.monitor channels=1

在您的语音录制应用程序中,您将配置来自Null outputRemapped monitor of null output的音频输入,并进行测试(我使用了Skype Echo)。
为了使更改永久生效,请将步骤4中的命令追加到/etc/pulse/default.pa中,省略每行开头的pacmd

调查显示,目前没有已知的方法可以在任何Linux子系统中进行实时噪声降噪滤波。一些网站指出,你可以购买硬件来更好地完成这项任务,而不是使用软件滤波器。
或者,如果这是为了录音,你可以通过Audacity传递声音并在那里使用噪声过滤器。

可惜,我不知道为什么。谢谢你的调查。 - Vadim Peretokin
当然!在模块文档页面上没有关于噪音消除的任何信息。只有module-echo-cancel中包含了AEC(声学回声消除)算法,它有几种实现方式,比如webrtc | speex。 - vskubriev

这里至少有一种方法,在实现中使用webrtc-aec。

http://wiki.gentoo.org/wiki/PulseAudio

webrtc-aec 是一种使用webrtc.org AudioProcessing库的技术,可以在支持该技术的应用程序中极大地增强VoIP通话质量,实现声学回声消除、模拟增益控制、降噪和其他处理功能。
以下是一篇2013年的论文,讨论了噪音去除问题,但并非特指webrtc-aec: http://lac.linuxaudio.org/2013/papers/37.pdf "我们提出了一个基于PulseAudio的多通道噪音/回声抑制解决方案的初步结果,并解释了设计决策的动机。这项工作在PulseAudio回声消除和信号处理框架中取得了一些改进,在3.0/4.0版本开发周期中进行了贡献,并将有助于未来的嵌入式Linux音频解决方案。进一步的工作包括优化音频流混合的代码,更高效的重采样方法,以及在多通道处理流程中实现高效的AEC。"

我原本打算做的是快速处理一个噪音文件,利用sox实时去除噪音,然后播放输出的音频,这样我就可以将其作为pulse中的输入流来使用。我相信pulse能够以这种方式创建和重定向输入输出流。也就是说,播放流可以被重定向作为另一个应用程序的输入流,而播放流是按应用程序而不是按设备进行的,因此不需要将其路由到设备硬件上。 - user2330377
我正在尝试使用pacmd列出PulseAudio设备,使用pacat录制和播放它们,并使用sox对流进行实时效果处理。 - user2330377
你有兴趣发布这些剧本吗? - Vadim Peretokin
这不就是PulseAudio插件回声消除中使用的吗? - Rémi Benoit

如果你使用的发行版是使用pipewire而不是pulseaudio(例如PopOS 22.04+),你可以通过以下步骤创建一个回声消除的音频源/麦克风:
  1. cp /usr/share/pipewire/pipewire.conf ~/.config/pipewire/pipewire.conf(如果目录不存在,请创建)。

  2. this snippet from the docs添加到活动模块中,以便在pipewire.conf中有以下内容:

     context.modules = [
    
      # ... 这里加载了很多其他模块
    
      {   name = libpipewire-module-echo-cancel
          args = {
              # library.name  = aec/libspa-aec-webrtc
              # node.latency = 1024/48000
              source.props = {
                 node.name = "Echo Cancellation Source"
              }
              sink.props = {
                 node.name = "Echo Cancellation Sink"
              }
          }
      }
    ]
    
  3. 重新启动pipewire:systemctl --user restart pipewire.service

你可以通过录制自己的声音来听取结果,可以使用类似于“simplescreenrecorder”这样的工具,或者运行以下命令“gst-launch-1.0 pulsesrc ! pulsesink”(确保戴上耳机,否则麦克风会捕捉到扬声器的声音,产生不愉快的反馈噪音)。
个人而言,我发现回声消除模块的降噪效果使我的声音听起来更加自然,相比之下,使用像NoiseTorch这样能够更积极降噪的程序。然而,回声消除主要适用于消除风扇噪音等类似声音,而NoiseTorch除了在说话时去除一些噪音外,还可以在不说话时自动静音麦克风。

我的AMD笔记本有同样的问题,下面的代码可以取消噪音:
sudo nano /etc/pulse/default.pa

## add below code on bottom
### Enable Echo/Noise-Cancelation
load-module module-echo-cancel aec_method=webrtc aec_args="analog_gain_control=0 digital_gain_control=1" source_name=echoCancel_source sink_name=echoCancel_sink
set-default-source echoCancel_source
set-default-sink echoCancel_sink
### 2nd tips
.ifexists module-echo-cancel.so
load-module module-echo-cancel aec_method=webrtc source_name=echocancel sink_name=echocancel1
set-default-source echocancel
set-default-sink echocancel1
.endif

希望有人能得到帮助。