3.9 KiB
3.9 KiB
NO_VALID_AUDIO_ERROR 调试步骤
🔍 问题分析
从日志来看,ASR 连接已打开,但是报错 NO_VALID_AUDIO_ERROR,说明服务器没有收到有效的音频数据。
✅ 已完成的修复
- ✅ 添加了
ptt_on信号发送(在startTalking方法中) - ✅ 添加了
frameSize: 5参数(启用实时音频帧传输) - ✅ 已有
onFrameRecorded回调(实时发送音频帧) - ✅ 已有
onStop回调(作为备用方案,发送完整文件)
📋 重新编译和测试
1. 重新编译项目
在 HBuilderX 中:
- 停止当前运行
- 清理缓存:菜单 -> 运行 -> 清理缓存
- 重新运行到手机/模拟器
2. 测试步骤
- 打开 App,进入语音通话页面
- 按住"按住说话"按钮
- 说话 3-5 秒
- 松开按钮
- 观察日志
3. 预期日志(成功的情况)
✅ 开始说话, isTalking 设置为: true
📤 发送 ptt_on 信号
✅ ptt_on 信号发送成功
录音未启动,开始启动录音
=== startRecording 被调用 ===
✅ 录音已开始
🎤 收到音频帧 #1, isTalking: true, frameBuffer size: 3200
✅ 发送音频帧到服务器, 帧号: 1
✅ 音频帧发送成功, 帧号: 1
🎤 收到音频帧 #2, isTalking: true, frameBuffer size: 3200
...
=== stopTalking 被调用 ===
❌ 停止说话, isTalking 设置为: false
🛑 停止录音并准备发送...
⏹️ 录音已停止
4. 如果还是没有 "🎤 收到音频帧" 日志
说明 onFrameRecorded 在你的设备上不支持,这时会自动降级到 onStop 方案:
预期日志(降级方案):
✅ 开始说话, isTalking 设置为: true
📤 发送 ptt_on 信号
✅ ptt_on 信号发送成功
录音未启动,开始启动录音
✅ 录音已开始
=== stopTalking 被调用 ===
🛑 停止录音并准备发送...
⏹️ 录音已停止
📁 文件路径: /xxx/recorder/xxx.pcm
✅ 文件读取成功
📊 是否为 ArrayBuffer: true
📊 文件大小: 160000 bytes
📦 开始分片发送
📤 发送第 1 片,大小: 3200 bytes
✅ 第 1 片发送成功
...
✅ 所有音频片段发送完成
✅ ptt_off 信号发送成功
🐛 如果还是报错
检查点 1:确认 ptt_on 信号是否发送
在日志中搜索:
📤 发送 ptt_on 信号✅ ptt_on 信号发送成功
如果没有这些日志,说明代码没有重新编译。
检查点 2:确认音频数据是否发送
在日志中搜索:
🎤 收到音频帧(实时方案)- 或
📤 发送第 X 片(降级方案)
如果没有这些日志,说明音频数据没有发送到服务器。
检查点 3:WebSocket 连接状态
确认日志中有:
WebSocket onOpen
并且在发送音频前,WebSocket 状态为 1(OPEN)。
🔧 临时调试方案
如果上述都正常,但还是报错,可以尝试:
方案 1:增加延迟
在发送 ptt_on 后,等待 500ms 再开始录音:
// 发送 ptt_on 信号
this.socketTask.send({ data: 'ptt_on' })
// 等待 500ms,让服务器准备好
await new Promise(resolve => setTimeout(resolve, 500))
// 开始录音
if (!this.isRecording) {
this.startRecording()
}
方案 2:检查服务器日志
查看服务器日志中是否有:
INFO - ASR connection opened
INFO - mic_enabled set to True
如果没有 "mic_enabled set to True",说明服务器没有收到 ptt_on 信号。
方案 3:手动测试 WebSocket
使用 WebSocket 测试工具(如 Postman)连接到:
ws://你的服务器地址/voice/call?token=你的token&ptt=true
然后手动发送:
- 文本消息:
ptt_on - 二进制消息:一些音频数据
- 文本消息:
ptt_off
看服务器是否正常响应。
📞 联系支持
如果以上步骤都无法解决,请提供:
- 完整的客户端日志(从连接到报错)
- 完整的服务器日志(从连接到报错)
- 设备信息(Android 版本、手机型号)
- uni-app 版本和 HBuilderX 版本