让arecord忽略aplay

让arecord忽略aplay

我正在尝试在我的树莓派上创建一种机器人来回答我的问题。

起初我把它设置为只有在听到它的名字时才会响应,效果很好。但现在我添加了更自然的对话,我偶然发现了一个问题。

每当机器人使用 aplay 命令说话时,arecord 命令都会捕获自己的声音并将其发送给机器人进行处理。机器人无法区分我的声音和它自己的声音,因此它开始循环自言自语(非常有趣,我必须补充一下)。

我检查了我的机器人代码,以验证听到的内容是否与所说的内容完全相同(在我将其转换为文本之后),但这并不能很好地工作(有时它可以理解自己,几乎没有变化),并且需要一些额外的处理时间才能发现这一点,在这段时间里我自己的命令没有被处理,因为它试图找出它听到的声音是否是它自己的。

我想知道是否有一种方法可以使 arecord 实例忽略同一台机器中 aplay 实例所说的内容。我相信更底层的解决方案绝对是可能的(例如,我在想如何在没有耳机的情况下使用 Skype;它不需要使用语音识别来知道不要无限循环我朋友的声音)。

我正在寻找解决方案一段时间,但我似乎找不到任何提及此问题的信息(这似乎应该很常见)。也许我只是不知道这种现象的名称。想法?

答案1

如果问题是arecord通过麦克风捕获您用 控制的扬声器的声音aplay,可能会有延迟:

您要查找的关键字是回声消除。现有的软件可用于 ALSA 和 Pulseaudio,例如在基于 Linux 的智能手机中使用。

基本上,该算法必须将接收到的输入与发送的输出相关联,以测量延迟并确定音量,然后从输入中减去具有正确延迟和缩放的输出以将其取消。

相关内容