You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 08:12:02