162 lines
4.1 KiB
Markdown
162 lines
4.1 KiB
Markdown
|
|
# 按住说话功能调试指南
|
|||
|
|
|
|||
|
|
## 问题现象
|
|||
|
|
按住说话按钮后,日志显示"开始说话"和"停止说话",但没有音频数据发送。
|
|||
|
|
|
|||
|
|
## 已添加的调试日志
|
|||
|
|
|
|||
|
|
### 1. 按住按钮时
|
|||
|
|
```
|
|||
|
|
startTalking 被调用, micEnabled: true, isRecording: false
|
|||
|
|
开始说话, isTalking 设置为: true
|
|||
|
|
录音未启动,开始启动录音
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 录音启动时
|
|||
|
|
```
|
|||
|
|
=== startRecording 被调用 ===
|
|||
|
|
isRecording: false
|
|||
|
|
isApp: true/false
|
|||
|
|
socketTask 状态: 1 (1表示已连接)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. App 端原生录音
|
|||
|
|
```
|
|||
|
|
=== startRecord (App原生) 被调用 ===
|
|||
|
|
请求录音权限
|
|||
|
|
权限请求结果: {...}
|
|||
|
|
录音权限已授予
|
|||
|
|
开始启动原生录音器
|
|||
|
|
原生录音器已启动
|
|||
|
|
收到原生音频帧, isTalking: true, buffer size: xxx
|
|||
|
|
✅ 发送原生音频数据到服务器
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 小程序/H5 端录音
|
|||
|
|
```
|
|||
|
|
小程序/H5 端:设置录音监听器
|
|||
|
|
启动 recorderManager
|
|||
|
|
recorderManager.start 已调用
|
|||
|
|
✅ 录音已开始
|
|||
|
|
收到音频帧, isTalking: true, frameBuffer size: xxx
|
|||
|
|
✅ 发送音频数据到服务器
|
|||
|
|
音频数据发送成功
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 检查清单
|
|||
|
|
|
|||
|
|
### 1. WebSocket 连接状态
|
|||
|
|
查看日志中的 `socketTask 状态`:
|
|||
|
|
- `0` = CONNECTING (连接中)
|
|||
|
|
- `1` = OPEN (已连接) ✅
|
|||
|
|
- `2` = CLOSING (关闭中)
|
|||
|
|
- `3` = CLOSED (已关闭)
|
|||
|
|
|
|||
|
|
如果不是 `1`,说明 WebSocket 未连接成功。
|
|||
|
|
|
|||
|
|
### 2. 录音权限
|
|||
|
|
App 端查看:
|
|||
|
|
```
|
|||
|
|
权限请求结果: { granted: [...], deniedAlways: [], deniedPresent: [] }
|
|||
|
|
```
|
|||
|
|
- `granted` 数组应该包含 `android.permission.RECORD_AUDIO`
|
|||
|
|
- 如果在 `deniedAlways` 或 `deniedPresent` 中,需要手动授权
|
|||
|
|
|
|||
|
|
### 3. 录音是否真正启动
|
|||
|
|
查看是否有:
|
|||
|
|
- App 端:`原生录音器已启动`
|
|||
|
|
- 小程序端:`✅ 录音已开始`
|
|||
|
|
|
|||
|
|
如果没有,可能是:
|
|||
|
|
- 权限被拒绝
|
|||
|
|
- recorderManager 初始化失败
|
|||
|
|
- 录音参数不支持
|
|||
|
|
|
|||
|
|
### 4. 音频帧是否产生
|
|||
|
|
查看是否有:
|
|||
|
|
- `收到音频帧` 或 `收到原生音频帧`
|
|||
|
|
|
|||
|
|
如果没有,说明录音器没有产生音频数据。
|
|||
|
|
|
|||
|
|
### 5. isTalking 状态
|
|||
|
|
查看日志中的 `isTalking` 值:
|
|||
|
|
- 按住时应该是 `true`
|
|||
|
|
- 松开时应该是 `false`
|
|||
|
|
|
|||
|
|
如果一直是 `false`,说明状态没有正确更新。
|
|||
|
|
|
|||
|
|
## 常见问题及解决方案
|
|||
|
|
|
|||
|
|
### 问题1:录音权限被拒绝
|
|||
|
|
**现象**:日志显示 `录音权限被拒绝`
|
|||
|
|
|
|||
|
|
**解决**:
|
|||
|
|
1. 进入手机设置 → 应用管理 → 找到你的应用
|
|||
|
|
2. 权限管理 → 麦克风 → 允许
|
|||
|
|
|
|||
|
|
### 问题2:recorderManager 未初始化
|
|||
|
|
**现象**:日志显示 `recorderManager 未初始化`
|
|||
|
|
|
|||
|
|
**解决**:
|
|||
|
|
1. 确认 manifest.json 中 `Record` 模块已启用
|
|||
|
|
2. 重新编译项目
|
|||
|
|
3. 检查是否在 App 端(App 端不使用 recorderManager)
|
|||
|
|
|
|||
|
|
### 问题3:WebSocket 未连接
|
|||
|
|
**现象**:`socketTask 状态: null` 或不是 `1`
|
|||
|
|
|
|||
|
|
**解决**:
|
|||
|
|
1. 检查后端服务是否启动
|
|||
|
|
2. 检查 WebSocket URL 是否正确
|
|||
|
|
3. 检查 token 是否有效
|
|||
|
|
|
|||
|
|
### 问题4:音频帧不发送
|
|||
|
|
**现象**:有 `收到音频帧` 但没有 `发送音频数据`
|
|||
|
|
|
|||
|
|
**解决**:
|
|||
|
|
1. 检查 `isTalking` 是否为 `true`
|
|||
|
|
2. 检查 `socketTask.readyState` 是否为 `1`
|
|||
|
|
3. 确认按住按钮时没有松开
|
|||
|
|
|
|||
|
|
### 问题5:录音格式不支持
|
|||
|
|
**现象**:录音启动失败或报错
|
|||
|
|
|
|||
|
|
**解决**:
|
|||
|
|
尝试修改录音参数:
|
|||
|
|
```javascript
|
|||
|
|
recorderManager.start({
|
|||
|
|
format: 'mp3', // 改为 mp3 试试
|
|||
|
|
sampleRate: 16000,
|
|||
|
|
numberOfChannels: 1,
|
|||
|
|
frameSize: 1 // 改小一点
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 测试步骤
|
|||
|
|
|
|||
|
|
1. **清空控制台**
|
|||
|
|
2. **进入语音通话页面**
|
|||
|
|
- 查看 WebSocket 是否连接成功
|
|||
|
|
- 查看是否有 `WebSocket onOpen` 日志
|
|||
|
|
|
|||
|
|
3. **按住"按住说话"按钮**
|
|||
|
|
- 应该看到 `startTalking 被调用`
|
|||
|
|
- 应该看到 `isTalking 设置为: true`
|
|||
|
|
- 应该看到 `=== startRecording 被调用 ===`
|
|||
|
|
- 应该看到录音启动成功的日志
|
|||
|
|
|
|||
|
|
4. **保持按住 2-3 秒**
|
|||
|
|
- 应该看到多个 `收到音频帧` 日志
|
|||
|
|
- 应该看到多个 `✅ 发送音频数据到服务器` 日志
|
|||
|
|
|
|||
|
|
5. **松开按钮**
|
|||
|
|
- 应该看到 `停止说话, isTalking 设置为: false`
|
|||
|
|
- 之后的音频帧应该显示 `⏸️ 不发送音频数据`
|
|||
|
|
|
|||
|
|
## 下一步
|
|||
|
|
|
|||
|
|
如果按照上述步骤仍然无法工作,请:
|
|||
|
|
1. 截图完整的控制台日志
|
|||
|
|
2. 说明是在什么平台测试(App/小程序/H5)
|
|||
|
|
3. 说明具体卡在哪一步
|