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

基于Asterisk AudioSocket与Node.js的语音流传输问题排查

排查方向及解决方案

1. 处理Asterisk AudioSocket的握手帧

Asterisk建立AudioSocket连接后,会先发送19字节的握手帧(包含版本、音频编码、采样率等元数据),这不是有效音频数据。如果你的Node.js服务器直接把这19字节传给Google STT,必然触发超时错误。

  • 先在Node.js代码中解析握手帧:前4字节是魔法字AUD\0,后续字段包含编码类型(0=PCMU、1=PCMA)、采样率等信息,解析完成后再开始转发后续的音频流到STT。

2. 验证Asterisk配置正确性

  • 检查extensions.conf中的AudioSocket调用参数,确保指定了兼容的传输模式和编码:
    [from-3cx]
    exten => _X.,1,NoOp(Incoming 3CX call)
    same => n,AudioSocket(127.0.0.1:8080,raw) ; raw模式传输原始编码音频
    same => n,Hangup()
    
  • 确认Asterisk加载了res_audiosocket.so模块:执行命令asterisk -rx "module show like audiosocket"查看模块状态,未加载则手动加载。

3. 对齐3CX与Asterisk的音频编码

3CX和Asterisk的SDP协商必须使用相同的音频编码(优先PCMU/8kHz,电话系统通用格式),编码不匹配会导致Asterisk无法转发有效音频流:

  • 开启Asterisk verbose日志:core set verbose 5,查看通话建立时的SDP协商记录,确认双方最终使用的编码一致。

4. 修复Node.js服务器的流转发逻辑

  • 确保Node.js在解析握手帧后,持续监听TCP连接的音频数据并转发到Google STT的流式识别接口,不能仅发送初始的19字节就停止。
  • 检查TCP连接状态:如果Asterisk意外断连,要处理重连或错误捕获,避免STT流因为无数据输入超时。

5. 调整Google STT的流式配置

  • 确保STT的音频参数与Asterisk输出完全匹配:比如配置encoding: 'MULAW'(对应PCMU编码)、sampleRateHertz: 8000、languageCode: 'zh-CN'(根据实际语言调整)。
  • 关闭singleUtterance参数(设为false),避免STT在短暂静音时提前终止识别流程触发超时。

内容的提问来源于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 23:28:13