我正在尝试从我的麦克风记录数据,然后通过扬声器实时回放,并且有一些延迟,但我遇到了一些问题。我选择使用 python 和 alsaaudio,我当前遇到问题的脚本可以在 这里找到。这适用于我目前所拥有的(不是延迟部分),但会产生一些点击。alsaaudio docs 有这样的说法:
PCM 音频播放出现问题的最常见原因是对 PCM 设备的写入必须与设备的数据速率完全匹配。
如果写入设备的数据太少,设备就会欠载,并且会发出难听的咔嗒声。相反,如果写入设备的数据过多,则写入函数将阻塞(PCM_NORMAL 模式)或返回零(PCM_NONBLOCK 模式)。
我似乎误解了文档,它说的是关于 write():
PCM.write(数据)
在数据中写入(播放)声音。数据长度必须是帧大小的倍数,并且应该正好是一个句点的大小
我脚本中的句号是 160。
它是关于 read() 的:
在 PCM_NORMAL 模式下,该函数阻塞直到一个完整的周期可用,然后返回一个元组 (length,data),其中 length 是捕获数据的帧数,data 是捕获的声音帧作为字符串。返回数据的长度将为 periodsize*framesize 字节。
在我的脚本中, period_size*frame_size 也应该等于 160,但是当我打印长度(元组 read() 返回的一部分)时,我得到 940。显然我似乎没有将正确数量的数据传递出去。 write(),但我不知道该去哪里。我主要通过我找到的示例将这些代码放在一起,并且我刚开始使用 alsaaudio / sound,尝试将一些有趣的项目放在一起,所以我还不知道很多。
我还想从麦克风现场录制,然后以 100 毫秒的延迟播放,因此注释为 time.sleep()。如果我取消注释,长度似乎从 940 到 -32 重复,最终导致 out.write() 抛出异常(数据不足)。
有人能告诉我如何(或我的脚本有什么问题)我会实时录制和播放声音数据,并且有 100 毫秒的延迟吗?