Python 尝试从麦克风录制并实时播放

Python 尝试从麦克风录制并实时播放,python,audio-streaming,audio-recording,playback,alsa,Python,Audio Streaming,Audio Recording,Playback,Alsa,我试着从我的麦克风中记录数据,然后通过扬声器实时播放,有一些延迟,但我遇到了一些问题。我选择使用python和alsaaudio,可以找到我当前遇到问题的脚本。这适用于我目前所拥有的(不是延迟部分),但会产生一些点击。alsaaudio文档必须说明: PCM音频播放出现问题的最常见原因是写入PCM设备必须与设备的数据速率完全匹配 如果写入设备的数据太少,设备将运行不足,并会发出难听的咔哒声。相反,如果写入设备的数据太多,写入功能将阻塞(PCM_正常模式)或返回零(PCM_非阻塞模式) 我似乎误解

我试着从我的麦克风中记录数据,然后通过扬声器实时播放,有一些延迟,但我遇到了一些问题。我选择使用python和alsaaudio,可以找到我当前遇到问题的脚本。这适用于我目前所拥有的(不是延迟部分),但会产生一些点击。alsaaudio文档必须说明:

PCM音频播放出现问题的最常见原因是写入PCM设备必须与设备的数据速率完全匹配

如果写入设备的数据太少,设备将运行不足,并会发出难听的咔哒声。相反,如果写入设备的数据太多,写入功能将阻塞(PCM_正常模式)或返回零(PCM_非阻塞模式)

我似乎误解了文件,上面写的是关于write()

PCM.写入(数据)

在数据中写入(播放)声音。数据的长度必须是帧大小的倍数,并且应该正好是一个周期的大小

我剧本中的句号是160

上面说的是read():

在PCM_正常模式下,此函数将阻塞,直到有一个完整的时段可用,然后返回一个元组(长度,数据),其中长度是捕获数据的帧数,数据是作为字符串捕获的声音帧。返回数据的长度将为periodsize*framesize字节

在我的脚本中,period_size*frame_size也应该等于160,但是当我打印长度(tuple read()返回的部分)时,我得到了940。显然,我似乎没有将正确数量的数据传递给out.write(),但我不确定该去哪里。我主要是通过我找到的示例将这些代码组合在一起,我刚刚开始使用alsaaudio/sound,试图组合一些有趣的项目,所以我还不知道很多

我还想通过麦克风录制实况,然后以100毫秒的延迟播放,这就是评论的time.sleep()。如果我取消注释它,长度似乎会从940反复变为-32,最终导致out.write()抛出异常(数据不足)

有人能告诉我如何(或者我的脚本有什么问题)实时录制和播放声音数据,并且延迟100毫秒吗?

你不能使用睡眠(0.1)将输出延迟100毫秒。您需要创建一个保存100ms音频数据的缓冲区:

buf = []
while True:
    l, data = inp.read()
    buf.append(data)
    if len(buffer)>=10:
        out.write(buf[0])
        del buf[0]

将10更改为会导致100毫秒延迟的某个数字。

您也尝试过吗?试试“曼阿尔萨洛普”。您也可以通过该命令选择延迟。

我明白了,谢谢。我已经这样做了,它肯定会有延迟(仍然是点击),但我不确定如何确定哪个数字会导致正确的延迟。我试着打印经过的时间和摆弄数字,但似乎没有改变。也就是说,似乎更多的是关于回声,哈哈。麦克风离扬声器很近。