Pepper机器人中PyAudio音频流回调仅触发一次不生效如何解决
代码问题排查与修复方案
你的代码存在多处可直接导致PyAudio回调仅执行一次的问题,具体问题和对应修复方案如下:
- PyAudio回调返回值不符合协议要求
你当前回调返回None作为第一个返回值,不符合PyAudio的回调规则:无论流是输入还是输出模式,回调必须返回二元组(输出音频数据, 状态标志)。对于仅输入的音频流,第一个参数需要传入和流配置匹配的空字节对象,不能传None,PyAudio识别到非法返回值会直接终止流,导致回调仅触发一次。
修复:将回调的返回行修改为:
return b"", pyaudio.paContinue
- Socket发送无异常处理与可靠性保证
socket.send()不会保证一次性发送所有传入字节,同时如果客户端断开连接、网络中断,发送操作会抛出异常,直接终止回调线程,导致流停止运行。
修复:将回调逻辑修改为带异常捕获的可靠发送:
def callback(self, in_data, frame_count, time_info, status): try: # sendall会阻塞直到所有数据发送完成,避免数据丢失 self.client.sendall(in_data) except: # 出现异常时终止音频流 return b"", pyaudio.paAbort return b"", pyaudio.paContinue
- NaoQi系统音频设备抢占问题
Pepper机器人默认运行的ALAudioDevice、自动语音识别等原生服务会独占麦克风设备,你直接用PyAudio打开输入流会出现隐性的设备抢占错误,导致流仅读取一次就被系统终止。如果修改上述两处后问题仍存在,建议先停止所有占用麦克风的NaoQi原生服务,或者改用官方提供的ALAudioDevice接口采集音频,兼容性更好。
额外优化建议
你在onInput_startStream中调用的self.s.accept()是阻塞方法,如果没有客户端连接,该方法会一直卡住,甚至触发NaoQi盒子的超时强制终止规则,建议给socket设置超时时间,或者把连接监听逻辑放到独立线程中运行。
内容的提问来源于stack exchange,提问作者17Peps
相关产品推荐
相关产品推荐

