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