0

我一直在玩一些语音到文本和文本到语音的系统,并且遇到了一个问题,即当计算机发出它可以识别的声音时,它开始从自身接收命令。为避免这种情况,我想要麦克风拾取的所有声音流,这些声音不是由计算机本身产生的。

我看到 PulseAudio 有一个回声消除模块,但到目前为止,我无法区分它的输出和原始麦克风输出:它仍然包含麦克风拾取的来自计算机扬声器的所有声音。我想知道默认的回声消除器是否与我想要的相反(即,它消除了麦克风听到的声音被发送到扬声器)。

知道我该怎么做(最好用pacmd)?我已经彻底混淆了自己试图为回声消除器指定非默认源,并徘徊在环回模块和其他可能不相关的东西中。我对 PulseAudio 知之甚少,还没有找到很好的介绍(我查看了很多PulseAudio 文档,但没有看到任何相关内容),并且可能只是遗漏了一些简单的东西。我对回声消除显然不起作用感到沮丧,我找不到有关它的文档,也找不到其他人的工作示例。

在此先感谢您的帮助!

其他可能相关的细节:我在联想 Thinkpad T410 上运行 Ubuntu Saucy。我使用的是内置麦克风和扬声器(所以,我很确定他们使用的是同一张声卡,我不会遇到时钟漂移问题)。我的实际应用程序通过 GStreamer 获得声音,但 GStreamer 从 PulseAudio 获得声音,而且我认为 GStreamer 本身没有 AEC 功能。如果有不同的方法可以做到这一点,我很乐意切换到那个。

4

1 回答 1

1

啊,我明白了!仅仅加载回声消除插件是不够的;然后你需要开始使用它。特别是,它只会抵消传入它的声音的回声,如果没有声音通过它,则什么都不会被抵消。因此,打开/etc/pulse/default.pa并添加该行

load-module module-echo-cancel

朝向底部(我把它放在加载的行之后module-filter-apply)。然后,通过运行(作为非 root 用户)重新启动 PulseAudio 守护程序pulseaudio -k。接下来,运行pacmd以获取 PulseAudio 的命令行界面,并为其提供命令list-sourceslist-sinks. 请注意响应中回声消除器的索引。再次编辑/etc/pulse/default.pa,并取消注释末尾的两行 about set-default,将单词input和替换output为回声消除器的源和接收器的索引。pulseaudio -k最后,再次使用(再次以非 root 用户身份运行)重新启动 PulseAudio 。

现在,默认情况下,所有要输出的声音在到达扬声器之前都通过回声消除器发送,所有要输入的声音在通过麦克风进入后从回声消除器中拉出,事情确实有效。您可以通过运行并查看输入设备屏幕上的声级来验证它是否正常工作pavucontrol(尝试播放一些音乐和说话,并注意回声消除输入在您说话时显示正常的声级,但声级非常低(几乎没有)当您保持沉默但音乐正在播放时)。

这个答案主要来自这篇文章,我希望我能在几周前找到它。

于 2014-03-31T12:44:38.780 回答