我一直在玩一些语音到文本和文本到语音的系统,我遇到了一个问题,当计算机发出它能识别的声音时,它开始从自己接收命令。为了避免这种情况,我想要一个由麦克风拾取的所有声音流,这些声音不是由计算机本身产生的。
我看到PulseAudio有一个回声消除模块,但到目前为止,我一直无法区分它的输出和原始麦克风输出:它仍然包含来自计算机扬声器的麦克风拾取的所有声音。我想知道默认的回声消除器是否与我想要的相反(即,它将麦克风听到的声音从发送到扬声器中删除)。
知道我怎么能做到这一点(最好与pacmd
)?在尝试为回声消除器指定非默认源时,我彻底把自己弄糊涂了,并且已经进入了环回模块和其他可能不相关的东西。我对PulseAudio所知甚少,也没有找到一个很好的介绍(我看过很多PulseAudio文档,但没有看到任何相关内容),可能只是错过了一些简单的东西。我对回声消除显然不起作用感到沮丧,我找不到关于它的文档,也找不到其他人的例子。
提前感谢您的帮助!
其他可能相关的细节:我在联想Thinkpad T410上运行Ubuntu Saucy。我使用内置麦克风和扬声器(所以,我很确定他们使用相同的声卡,我不会有时钟漂移问题)。我的实际应用程序通过GStreamer获得声音,但GStreamer从PulseAudio获得声音,我不认为GStreamer本身具有AEC功能。如果有别的方法,我很乐意换成那个
啊,我知道了!仅仅加载回声消除插件是不够的;然后你需要开始使用它。特别是,它只会取消传入它的声音的回声,如果没有声音通过它,什么也不会被取消。因此,打开/etc/pulse/default.pa
并添加
load-module module-echo-cancel
指向底部(我把它放在加载module-filter-apply
的行之后)。然后(以非root用户)运行pulseaudio -k
重启PulseAudio守护进程。接下来,运行pacmd
以获得PulseAudio的命令行接口,并向它提供命令list-sources
和list-sinks
。请注意响应中回声消除器的指数。再次编辑/etc/pulse/default.pa
,取消末尾关于set-default
的两行注释,将input
和output
替换为回波消除器的源和汇索引。最后,使用pulseaudio -k
重新启动PulseAudio(同样,以非root用户身份运行)。
现在,默认情况下,所有要输出的声音在发送到扬声器之前都会通过回声消除器发送,所有要输入的声音在通过麦克风进入后都会从回声消除器中取出,并且实际工作。你可以通过运行pavucontrol
并查看输入设备屏幕上的声级来验证它是否有效(尝试播放一些音乐和说话,并注意回声取消输入在你说话时显示正常声级,但在你沉默但音乐正在播放时显示非常低的声级(接近于没有))。
这个答案主要来自这个帖子,我希望我几个星期前就能找到。