Asterisk AudioSocket流无法传输至Python服务,Google语音识别无响应求助
Asterisk AudioSocket对接Google Speech-to-Text问题排查与解决
配置与环境
Asterisk拨号计划配置
same => n(newIvr),Log(NOTICE, Start New IVR POC flow) same => n,AudioSocket(${UUID()},172.25.25.150:1579) same => n,Playback(goodbye) same => n,Hangup()
环境说明
- 基于Python的AudioSocket服务(使用silentindark的audiosocket_server仓库)
- 对接Google Speech-to-Text API
- 已尝试配置:pjsip.conf中
allow= slin,ulaw, alaw,Python代码中用audioop.ulaw2lin(data, 2)解码
遇到的问题
- 音频流发送后无法收到Google语音识别的文本响应
- 生成的raw和wav音频文件大小固定为13KB,wav文件时长显示0秒,在线转换raw到wav提示文件无效
解决方法
1. 对齐音频格式与Google API要求
Google Speech-to-Text默认要求PCM线性16位、单声道、8kHz/16kHz采样率。Asterisk的AudioSocket默认发送ulaw格式,需强制指定线性格式:
- 修改拨号计划的AudioSocket指令,添加格式参数:
AudioSocket(${UUID()},172.25.25.150:1579,slin) - Python侧传递给Google API时,明确指定
sample_rate_hertz=8000(Asterisk默认电话采样率)
2. 修复音频流接收与文件写入逻辑
- 确保Python服务持续读取音频流:silentindark的仓库默认可能只读取了初始socket数据,需循环读取直到连接断开:
while True: data = conn.recv(1024) if not data: break # 执行解码、写入文件或发送到API的操作 - 生成有效wav文件:raw是无格式PCM数据,必须添加正确文件头,用
wave模块实现:import wave with wave.open("valid_output.wav", "wb") as wf: wf.setnchannels(1) # 单声道 wf.setsampwidth(2) # 16位采样宽度 wf.setframerate(8000) # 匹配Asterisk采样率 wf.writeframes(decoded_data)
3. 验证Google API请求方式
- 使用流式请求而非一次性发送固定数据:若只发送13KB初始数据,Google会判定音频结束且无有效语音,导致无响应。需按API要求持续推送音频流。
- 检查API权限:确认服务账号密钥有效,项目已启用Speech-to-Text API,无配额限制。
4. 排查Asterisk侧音频路由与网络
- 在Asterisk控制台执行
core show channels,确认通话进入newIvr分支后,AudioSocket连接已正常建立。 - 验证网络连通性:确保Asterisk服务器能访问172.25.25.150的1579端口,Python服务已正常监听该端口。
内容的提问来源于stack exchange,提问作者Code Guru
相关产品推荐
相关产品推荐

