157 lines
3.9 KiB
Markdown
157 lines
3.9 KiB
Markdown
# NO_VALID_AUDIO_ERROR 调试步骤
|
||
|
||
## 🔍 问题分析
|
||
|
||
从日志来看,ASR 连接已打开,但是报错 `NO_VALID_AUDIO_ERROR`,说明服务器没有收到有效的音频数据。
|
||
|
||
## ✅ 已完成的修复
|
||
|
||
1. ✅ 添加了 `ptt_on` 信号发送(在 `startTalking` 方法中)
|
||
2. ✅ 添加了 `frameSize: 5` 参数(启用实时音频帧传输)
|
||
3. ✅ 已有 `onFrameRecorded` 回调(实时发送音频帧)
|
||
4. ✅ 已有 `onStop` 回调(作为备用方案,发送完整文件)
|
||
|
||
## 📋 重新编译和测试
|
||
|
||
### 1. 重新编译项目
|
||
|
||
在 HBuilderX 中:
|
||
1. 停止当前运行
|
||
2. 清理缓存:菜单 -> 运行 -> 清理缓存
|
||
3. 重新运行到手机/模拟器
|
||
|
||
### 2. 测试步骤
|
||
|
||
1. 打开 App,进入语音通话页面
|
||
2. 按住"按住说话"按钮
|
||
3. 说话 3-5 秒
|
||
4. 松开按钮
|
||
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 再开始录音:
|
||
|
||
```javascript
|
||
// 发送 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
|
||
```
|
||
|
||
然后手动发送:
|
||
1. 文本消息:`ptt_on`
|
||
2. 二进制消息:一些音频数据
|
||
3. 文本消息:`ptt_off`
|
||
|
||
看服务器是否正常响应。
|
||
|
||
## 📞 联系支持
|
||
|
||
如果以上步骤都无法解决,请提供:
|
||
1. 完整的客户端日志(从连接到报错)
|
||
2. 完整的服务器日志(从连接到报错)
|
||
3. 设备信息(Android 版本、手机型号)
|
||
4. uni-app 版本和 HBuilderX 版本
|