基于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
相关产品推荐
相关产品推荐

