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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:32:32