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

265 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 录音问题完整诊断
## 📊 当前状态分析
### 从日志中看到的流程
```
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` 检查 ❌(没有日志)
## 🔧 已添加的诊断代码
我已经添加了更详细的日志:
```javascript
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` 回调中添加重连逻辑:
```javascript
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 追踪执行流程
在关键位置添加日志:
```javascript
console.log('🔍 执行到这里了 - 步骤 1')
// ... 代码
console.log('🔍 执行到这里了 - 步骤 2')
// ... 代码
console.log('🔍 执行到这里了 - 步骤 3')
```
### 2. 检查变量值
```javascript
console.log('🔍 变量值:', {
socketTask: !!this.socketTask,
readyState: this.socketTask?.readyState,
isTalking: this.isTalking,
isRecording: this.isRecording
})
```
### 3. 捕获异常
```javascript
try {
// 可能出错的代码
} catch (err) {
console.error('❌ 捕获到异常:', err)
console.error('❌ 异常详情:', JSON.stringify(err))
}
```
## 🚀 下一步
1. **重新编译并测试**
2. **观察新增的日志**
3. **根据日志确定具体问题**
4. **如果还有问题,提供完整日志**
重点关注:
- 🔍 this.socketTask 是否存在?
- 🔌 WebSocket 状态是什么?
- 如果状态不是 1为什么会断开
---
**当前进度:**
-`ptt_on` 信号发送
- ✅ 录音启动
-`onStop` 回调触发
- ❌ WebSocket 状态检查(待确认)
- ❌ 文件读取(待执行)
- ❌ 音频发送(待执行)