Ai_GirlFriend/xuniYou/录音问题完整诊断.md
2026-03-02 18:57:11 +08:00

6.5 KiB
Raw Blame History

录音问题完整诊断

📊 当前状态分析

从日志中看到的流程

14:54:12.223 === startTalking 被调用 ===
14:54:12.223 ✅ 开始说话, isTalking 设置为: true
14:54:12.223 📤 发送 ptt_on 信号
14:54:12.223 === startRecording 被调用 ===
14:54:12.246 ✅ 录音已开始

[5秒后用户松开按钮]

14:54:17.219 === stopTalking 被调用 ===
14:54:17.391 📋 完整的 res 对象: {"tempFilePath":"_doc/uniapp_temp_..."}
14:54:17.391 📁 文件路径: _doc/uniapp_temp_1772434445765/recorder/1772434458065.pcm
14:54:17.416 ⏱️ 录音时长: undefined, ms
14:54:17.417 📦 文件大小: undefined, bytes

[然后就没有后续日志了]

问题分析

已经工作的部分:

  1. ptt_on 信号发送成功
  2. 录音启动成功
  3. onStop 回调触发成功
  4. 获取到文件路径

没有工作的部分:

  1. 没有看到 " 录音文件路径有效,准备读取文件..."
  2. 没有看到 WebSocket 状态检查的日志
  3. 没有看到文件读取的任何日志

可能的原因

最可能的原因:代码在某个检查点 return 了,但没有输出日志。

可能的检查点:

  1. res.tempFilePath 检查 (有日志,说明通过了)
  2. res.duration 检查 duration 是 undefined跳过了检查
  3. this.socketTask 检查 (没有日志,可能在这里 return 了)
  4. this.socketTask.readyState 检查 (没有日志)

🔧 已添加的诊断代码

我已经添加了更详细的日志:

console.log('✅ 录音文件路径有效,准备读取文件...')

// 检查 WebSocket 状态
console.log('🔍 检查 WebSocket 状态...')
console.log('🔍 this.socketTask 是否存在:', !!this.socketTask)

if (!this.socketTask) {
    console.error('❌ socketTask 不存在')
    // ... 显示提示
    return
}

console.log('🔌 WebSocket 状态:', this.socketTask.readyState)
console.log('🔌 状态说明: 0=CONNECTING, 1=OPEN, 2=CLOSING, 3=CLOSED')

if (this.socketTask.readyState !== 1) {
    console.error('❌ WebSocket 未连接,无法发送,状态:', this.socketTask.readyState)
    // ... 显示提示
    return
}

console.log('✅ WebSocket 状态正常,继续处理...')

🧪 测试步骤

1. 重新编译

在 HBuilderX 中:

  1. 停止当前运行
  2. 清理缓存
  3. 重新运行到手机

2. 测试并观察日志

按住说话 3-5 秒,观察以下日志:

预期日志(如果 WebSocket 正常):

⏹️ 录音已停止
📁 文件路径: xxx
✅ 录音文件路径有效,准备读取文件...
🔍 检查 WebSocket 状态...
🔍 this.socketTask 是否存在: true
🔌 WebSocket 状态: 1
🔌 状态说明: 0=CONNECTING, 1=OPEN, 2=CLOSING, 3=CLOSED
✅ WebSocket 状态正常,继续处理...
📁 转换后的绝对路径: xxx
📂 获取文件系统管理器: 成功
📁 准备读取文件: xxx
✅ 文件读取成功

预期日志(如果 WebSocket 断开):

⏹️ 录音已停止
📁 文件路径: xxx
✅ 录音文件路径有效,准备读取文件...
🔍 检查 WebSocket 状态...
🔍 this.socketTask 是否存在: false
❌ socketTask 不存在

或者:

⏹️ 录音已停止
📁 文件路径: xxx
✅ 录音文件路径有效,准备读取文件...
🔍 检查 WebSocket 状态...
🔍 this.socketTask 是否存在: true
🔌 WebSocket 状态: 3
🔌 状态说明: 0=CONNECTING, 1=OPEN, 2=CLOSING, 3=CLOSED
❌ WebSocket 未连接,无法发送,状态: 3

🐛 可能的问题和解决方案

问题 1WebSocket 在录音过程中断开

症状:

  • 录音开始时 WebSocket 是连接的
  • 录音结束时 WebSocket 已断开
  • 日志显示状态为 2CLOSING或 3CLOSED

可能原因:

  1. 服务器主动关闭连接(超时、错误等)
  2. 网络不稳定
  3. App 进入后台导致连接断开

解决方案:

onStop 回调中添加重连逻辑:

if (!this.socketTask || this.socketTask.readyState !== 1) {
    console.log('🔄 WebSocket 已断开,尝试重连...')
    
    // 保存录音文件路径
    const savedFilePath = res.tempFilePath
    
    // 重新连接
    this.connectWebSocket()
    
    // 等待连接建立
    setTimeout(() => {
        if (this.socketTask && this.socketTask.readyState === 1) {
            console.log('✅ 重连成功,继续发送音频')
            // 继续读取和发送文件
            this.readAndSendAudioFile(savedFilePath)
        } else {
            console.error('❌ 重连失败')
            uni.showToast({
                title: '连接断开,请重新进入',
                icon: 'none'
            })
        }
    }, 2000)
    
    return
}

问题 2this.socketTask 为 null

症状:

  • 日志显示 this.socketTask 是否存在: false

可能原因:

  1. WebSocket 连接失败
  2. 变量被意外清空
  3. 作用域问题

解决方案:

检查 connectWebSocket 方法是否正确设置了 this.socketTask

问题 3录音时间太短

症状:

  • 录音时长小于 500ms
  • 日志显示 " 录音时长太短"

解决方案:

录音至少 2-3 秒。

问题 4文件路径问题

症状:

  • 文件路径是相对路径
  • 文件读取失败

解决方案:

已添加文件路径转换逻辑,会自动转换为绝对路径。

📝 调试技巧

1. 使用 console.log 追踪执行流程

在关键位置添加日志:

console.log('🔍 执行到这里了 - 步骤 1')
// ... 代码
console.log('🔍 执行到这里了 - 步骤 2')
// ... 代码
console.log('🔍 执行到这里了 - 步骤 3')

2. 检查变量值

console.log('🔍 变量值:', {
    socketTask: !!this.socketTask,
    readyState: this.socketTask?.readyState,
    isTalking: this.isTalking,
    isRecording: this.isRecording
})

3. 捕获异常

try {
    // 可能出错的代码
} catch (err) {
    console.error('❌ 捕获到异常:', err)
    console.error('❌ 异常详情:', JSON.stringify(err))
}

🚀 下一步

  1. 重新编译并测试
  2. 观察新增的日志
  3. 根据日志确定具体问题
  4. 如果还有问题,提供完整日志

重点关注:

  • 🔍 this.socketTask 是否存在?
  • 🔌 WebSocket 状态是什么?
  • 如果状态不是 1为什么会断开

当前进度:

  • ptt_on 信号发送
  • 录音启动
  • onStop 回调触发
  • WebSocket 状态检查(待确认)
  • 文件读取(待执行)
  • 音频发送(待执行)