Ai_GirlFriend/xuniYou/语音通话问题诊断.md
2026-02-28 18:04:34 +08:00

3.9 KiB
Raw Blame History

语音通话问题诊断报告

当前状态总结

已经工作的部分

  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 格式:

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 })
}

下一步行动

  1. 查看服务器端代码 - 了解期望的数据格式
  2. 查看服务器日志 - 确认是否收到数据
  3. 测试 MP3 格式 - 看是否能解决问题
  4. 联系后端开发 - 确认 WebSocket 协议规范

临时测试方案

为了快速验证,可以:

  1. 使用 Postman 或其他工具测试 WebSocket 接口
  2. 手动发送一个小的音频文件
  3. 观察服务器的响应

当前代码状态

  • 录音功能完整
  • 文件发送功能完整
  • 错误处理完善
  • 日志详细
  • ⚠️ 等待服务器端问题解决

结论

客户端代码已经完成并正常工作。 问题出在服务器端,需要:

  1. 检查服务器为什么关闭连接
  2. 确认服务器期望的数据格式
  3. 调整客户端发送格式以匹配服务器要求