为 Alsa/Pulse 环回创建实时音频过滤器

Create a real-time audio filter for Alsa/Pulse loopback

我想使用普通耳机和 Linux 电脑重现 active noise-control 耳机的效果,以便实时消除任何环境噪音(不仅仅是从背景噪音中清除声音输入).

计划是通过 Alsa/Pulseaudio 环回麦克风输入,应用前馈窄带噪声消除滤波器(作为 LADSPA 滤波器?),然后将结果输出到耳机。

问题是我不知道从哪里开始过滤部分:我应该如何将它连接到 Alsa/Pulseaudio?是否有某种 C API 可用于创建自定义过滤器?

1) 我建议在 Pulseaudio 中这样做;通过过滤器重定向 ALSA 输出将更加困难。

2) Pulseaudio 已经有类似 module-ladspa-sink 的模块,详细信息例如here。该模块将 LADSPA 处理后的声音转发到 master,但由于您同时需要麦克风输入和计算机声音输出,您可能必须使用其他一些模块(例如组合接收器,空接收器作为虚拟输出接收器)and/or pulseaudio 环回命令将它们在不同的通道集上转发到 LADSPA 模块。

也许你也可以加载两个 LADSPA 模块,使用一个作为虚拟输出,将麦克风输入环回另一个,并从一个 LADSPA 插件处理这两个模块——我没试过,但如果可行,它可能更简单。

3) 已经有用于 Pulseaudio 的噪声消除和回声消除模块,例如用于在基于 Linux 的智能手机中;也许其中之一足以满足您的需求。 Google.

4) 如果其他一切都失败了,或者单独使用 LADSPA 过滤器还不够,请查看此模块(或其他 Pulseaudio 模块)的 source,并相应地进行修改。

来自 IRC 上的 debianuser,对我有用。替换为您在 /proc/asound/cards 中命名的卡。您可以在 /etc/modprobe.d/alsa-base.conf 或类似的 'options snd-mycard id="mycardname" enable=1' 行中编辑该名称。

defaults.pcm.dmix.!rate 48000
defaults.pcm.dmix.!format S16_LE
pcm.multi {
    type multi
    slaves.a.pcm "dmix:RealCardName"
    slaves.a.channels 2
    slaves.b.pcm "dmix:Loopback"
    slaves.b.channels 2
    bindings.0 { slave a; channel 0; }
    bindings.1 { slave a; channel 1; }
    bindings.2 { slave b; channel 0; }
    bindings.3 { slave b; channel 1; }
}
pcm.both {
    type route
    slave.pcm "multi"
    ttable.0.0 1
    ttable.1.1 1
    ttable.0.2 1
    ttable.1.3 1
}
pcm.!default {
    type asym
    playback.pcm "plug:both"
    capture.pcm "plug:dsnoop:RealCardName"
}

pcm.nowplaying "plug:\"dsnoop:Loopback,1\""`