为 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\""`
我想使用普通耳机和 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\""`