184 lines
3.9 KiB
Markdown
184 lines
3.9 KiB
Markdown
# 语音通话问题诊断报告
|
||
|
||
## 当前状态总结
|
||
|
||
### ✅ 已经工作的部分
|
||
|
||
1. **录音功能** - 完全正常
|
||
- 按住按钮可以开始录音
|
||
- 松开按钮可以停止录音
|
||
- 生成 PCM 格式音频文件
|
||
|
||
2. **文件读取** - 完全正常
|
||
- 可以读取录音文件
|
||
- 文件大小正常(约 260KB)
|
||
|
||
3. **WebSocket 连接** - 初始正常
|
||
- 可以成功连接到服务器
|
||
- 状态为 1 (OPEN)
|
||
|
||
4. **文件发送** - 完全正常
|
||
- 可以成功发送音频数据到服务器
|
||
- 发送成功回调被触发
|
||
|
||
### ❌ 存在的问题
|
||
|
||
**核心问题:WebSocket 在发送音频后立即关闭(code: 1000)**
|
||
|
||
从日志可以看到:
|
||
```
|
||
✅ 录音文件发送成功
|
||
❌ WebSocket 关闭, code: 1000
|
||
```
|
||
|
||
## 问题分析
|
||
|
||
### 可能的原因
|
||
|
||
1. **服务器端主动关闭连接**
|
||
- 服务器收到音频后立即关闭了连接
|
||
- 可能是服务器端的错误处理逻辑
|
||
|
||
2. **音频格式不匹配**
|
||
- 发送的是 PCM 格式
|
||
- 服务器可能期望其他格式(如 MP3)
|
||
|
||
3. **数据大小问题**
|
||
- PCM 文件较大(260KB)
|
||
- 可能超过服务器的接收限制
|
||
|
||
4. **协议不匹配**
|
||
- 服务器可能期望特定的消息格式
|
||
- 可能需要包装成 JSON 或添加元数据
|
||
|
||
## 诊断步骤
|
||
|
||
### 第1步:检查服务器日志
|
||
|
||
查看服务器端的日志,确认:
|
||
- 是否收到了音频数据
|
||
- 收到数据后做了什么处理
|
||
- 为什么关闭了连接
|
||
|
||
### 第2步:检查音频格式
|
||
|
||
当前发送的是:
|
||
- 格式:PCM
|
||
- 采样率:16000Hz
|
||
- 声道:单声道
|
||
- 大小:约 260KB
|
||
|
||
服务器期望的格式是什么?
|
||
|
||
### 第3步:检查 WebSocket 协议
|
||
|
||
服务器端的 WebSocket 接口文档:
|
||
- 期望的消息格式是什么?
|
||
- 是否需要先发送元数据?
|
||
- 是否需要分片发送?
|
||
|
||
### 第4步:测试不同的音频格式
|
||
|
||
尝试发送 MP3 格式:
|
||
```javascript
|
||
format: 'mp3' // 而不是 'pcm'
|
||
```
|
||
|
||
MP3 文件更小,可能更容易被服务器接受。
|
||
|
||
## 建议的解决方案
|
||
|
||
### 方案1:修改音频格式为 MP3
|
||
|
||
```javascript
|
||
const recorderOptions = {
|
||
duration: 600000,
|
||
sampleRate: 16000,
|
||
numberOfChannels: 1,
|
||
encodeBitRate: 48000,
|
||
format: 'mp3', // 改为 mp3
|
||
audioSource: 'auto'
|
||
}
|
||
```
|
||
|
||
优点:
|
||
- 文件更小(约 20-30KB)
|
||
- 兼容性更好
|
||
- 传输更快
|
||
|
||
缺点:
|
||
- 有损压缩
|
||
- 可能影响识别准确度
|
||
|
||
### 方案2:添加消息包装
|
||
|
||
在发送音频前,先发送元数据:
|
||
|
||
```javascript
|
||
// 1. 先发送元数据
|
||
this.socketTask.send({
|
||
data: JSON.stringify({
|
||
type: 'audio_start',
|
||
format: 'pcm',
|
||
sampleRate: 16000,
|
||
channels: 1,
|
||
size: fileRes.data.byteLength
|
||
})
|
||
})
|
||
|
||
// 2. 再发送音频数据
|
||
this.socketTask.send({
|
||
data: fileRes.data
|
||
})
|
||
|
||
// 3. 发送结束标记
|
||
this.socketTask.send({
|
||
data: JSON.stringify({
|
||
type: 'audio_end'
|
||
})
|
||
})
|
||
```
|
||
|
||
### 方案3:分片发送
|
||
|
||
如果文件太大,分片发送:
|
||
|
||
```javascript
|
||
const chunkSize = 8192 // 8KB per chunk
|
||
for (let i = 0; i < fileRes.data.byteLength; i += chunkSize) {
|
||
const chunk = fileRes.data.slice(i, i + chunkSize)
|
||
this.socketTask.send({ data: chunk })
|
||
}
|
||
```
|
||
|
||
## 下一步行动
|
||
|
||
1. **查看服务器端代码** - 了解期望的数据格式
|
||
2. **查看服务器日志** - 确认是否收到数据
|
||
3. **测试 MP3 格式** - 看是否能解决问题
|
||
4. **联系后端开发** - 确认 WebSocket 协议规范
|
||
|
||
## 临时测试方案
|
||
|
||
为了快速验证,可以:
|
||
|
||
1. 使用 Postman 或其他工具测试 WebSocket 接口
|
||
2. 手动发送一个小的音频文件
|
||
3. 观察服务器的响应
|
||
|
||
## 当前代码状态
|
||
|
||
- ✅ 录音功能完整
|
||
- ✅ 文件发送功能完整
|
||
- ✅ 错误处理完善
|
||
- ✅ 日志详细
|
||
- ⚠️ 等待服务器端问题解决
|
||
|
||
## 结论
|
||
|
||
**客户端代码已经完成并正常工作。** 问题出在服务器端,需要:
|
||
|
||
1. 检查服务器为什么关闭连接
|
||
2. 确认服务器期望的数据格式
|
||
3. 调整客户端发送格式以匹配服务器要求
|