260 lines
5.5 KiB
Markdown
260 lines
5.5 KiB
Markdown
|
|
# 录音数据保护机制说明
|
|||
|
|
|
|||
|
|
## 🛡️ 多重保护机制
|
|||
|
|
|
|||
|
|
为了确保录音数据不丢失,已添加**6层保护机制**:
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 1️⃣ 延迟等待机制 ✅
|
|||
|
|
```
|
|||
|
|
停止录音 → 等待1500ms → 等待1000ms → 返回文件
|
|||
|
|
总延迟:2500ms(确保MP3编码完成)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2️⃣ 三次验证机制 ✅
|
|||
|
|
```javascript
|
|||
|
|
// 立即验证
|
|||
|
|
verifyFile(path, 1) // 0ms
|
|||
|
|
|
|||
|
|
// 第二次验证
|
|||
|
|
setTimeout(() => verifyFile(path, 2), 500) // 500ms
|
|||
|
|
|
|||
|
|
// 最终验证
|
|||
|
|
setTimeout(() => verifyFile(path, 3), 1500) // 1500ms
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**作用:** 监控文件大小增长,确认编码完成
|
|||
|
|
|
|||
|
|
### 3️⃣ 文件备份机制 ✅
|
|||
|
|
```javascript
|
|||
|
|
createBackup(tempPath, fileSize) {
|
|||
|
|
// 复制到永久目录:Documents/recordings/
|
|||
|
|
// 文件名:voice_backup_[timestamp].mp3
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**作用:** 防止临时文件被系统清理
|
|||
|
|
|
|||
|
|
### 4️⃣ 元数据记录 ✅
|
|||
|
|
```javascript
|
|||
|
|
lastRecordInfo = {
|
|||
|
|
path: "...",
|
|||
|
|
duration: 8500,
|
|||
|
|
fileSize: 128000,
|
|||
|
|
timestamp: 1701961234567
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
fileVerifyHistory = [
|
|||
|
|
{ attempt: 1, size: 45000, time: ... },
|
|||
|
|
{ attempt: 2, size: 100000, time: ... },
|
|||
|
|
{ attempt: 3, size: 128000, time: ... }
|
|||
|
|
]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**作用:** 追踪文件写入过程,诊断问题
|
|||
|
|
|
|||
|
|
### 5️⃣ 诊断信息显示 ✅
|
|||
|
|
```javascript
|
|||
|
|
recordDiagnostic = {
|
|||
|
|
actualSize: 128000,
|
|||
|
|
actualSizeKB: "125.00",
|
|||
|
|
duration: 8500,
|
|||
|
|
durationSec: "8.5",
|
|||
|
|
expectedSize: 136000,
|
|||
|
|
expectedSizeKB: "132.81",
|
|||
|
|
sizeRatio: "94.1%", // 实际/预期
|
|||
|
|
timestamp: "2025-12-07 22:00:00"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**作用:** 帮助排查问题
|
|||
|
|
|
|||
|
|
### 6️⃣ 用户警告机制 ✅
|
|||
|
|
```javascript
|
|||
|
|
if (fileSize < minExpectedSize * 0.5) {
|
|||
|
|
// 弹窗警告用户
|
|||
|
|
uni.showModal({
|
|||
|
|
title: '录音文件异常',
|
|||
|
|
content: '文件太小,建议重新录音',
|
|||
|
|
confirmText: '重新录音',
|
|||
|
|
cancelText: '仍然使用'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**作用:** 让用户决定是否重新录音
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 保护机制对比
|
|||
|
|
|
|||
|
|
| 机制 | 覆盖场景 | 可靠性 |
|
|||
|
|
|------|----------|--------|
|
|||
|
|
| **延迟等待** | MP3编码时间 | ⭐⭐⭐⭐⭐ |
|
|||
|
|
| **三次验证** | 监控写入过程 | ⭐⭐⭐⭐ |
|
|||
|
|
| **文件备份** | 临时文件丢失 | ⭐⭐⭐⭐⭐ |
|
|||
|
|
| **元数据记录** | 问题诊断 | ⭐⭐⭐ |
|
|||
|
|
| **诊断显示** | 问题排查 | ⭐⭐⭐⭐ |
|
|||
|
|
| **用户警告** | 数据异常 | ⭐⭐⭐⭐⭐ |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔍 诊断流程
|
|||
|
|
|
|||
|
|
### 录音完成后,查看控制台日志:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
[录音] 录音结束,详细信息: { duration: 8500, fileSize: ... }
|
|||
|
|
[录音] 第1次验证成功: { size: 45000, sizeKB: 43.95KB }
|
|||
|
|
[录音] 第2次验证成功: { size: 100000, sizeKB: 97.66KB }
|
|||
|
|
[录音] 文件仍在增长: +55000 bytes ← 说明仍在编码
|
|||
|
|
[录音] 第3次验证成功: { size: 128000, sizeKB: 125.00KB }
|
|||
|
|
[录音] 文件大小稳定,编码完成 ← 编码完成
|
|||
|
|
[录音] 警告:文件过小!实际=128000, 预期>136000 ← 可选警告
|
|||
|
|
[录音] 文件已完全保存,大小: 128000 bytes
|
|||
|
|
[录音] 备份成功: /storage/.../recordings/voice_backup_xxx.mp3 ← 备份完成
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 健康的录音日志特征:
|
|||
|
|
- ✅ 三次验证都成功
|
|||
|
|
- ✅ 文件大小从小到大增长
|
|||
|
|
- ✅ 最终大小 > 预期的50%
|
|||
|
|
- ✅ 备份成功创建
|
|||
|
|
|
|||
|
|
### 异常的录音日志特征:
|
|||
|
|
- ❌ 验证失败
|
|||
|
|
- ❌ 文件大小不增长
|
|||
|
|
- ❌ 最终大小 < 预期的50%
|
|||
|
|
- ❌ 备份失败
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧪 测试建议
|
|||
|
|
|
|||
|
|
### 测试1:正常录音
|
|||
|
|
```
|
|||
|
|
1. 录音 8 秒
|
|||
|
|
2. 停止录音
|
|||
|
|
3. 等待 3 秒(看提示)
|
|||
|
|
4. 查看日志
|
|||
|
|
5. 检查文件大小 > 100KB
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 测试2:短录音
|
|||
|
|
```
|
|||
|
|
1. 录音 3 秒
|
|||
|
|
2. 停止录音
|
|||
|
|
3. 检查文件大小 > 40KB
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 测试3:长录音
|
|||
|
|
```
|
|||
|
|
1. 录音 15 秒
|
|||
|
|
2. 停止录音
|
|||
|
|
3. 检查文件大小 > 200KB
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 测试4:极端情况
|
|||
|
|
```
|
|||
|
|
1. 录音 1 秒(太短)
|
|||
|
|
2. 应该显示警告
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 备份文件位置
|
|||
|
|
|
|||
|
|
### Android设备
|
|||
|
|
```
|
|||
|
|
/storage/emulated/0/Documents/recordings/
|
|||
|
|
voice_backup_[timestamp].mp3
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 查看备份文件
|
|||
|
|
```javascript
|
|||
|
|
// 在代码中可以访问
|
|||
|
|
speechRecorder.lastBackupPath
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 清理旧备份(可选)
|
|||
|
|
```javascript
|
|||
|
|
// 保留最近10个备份,删除更旧的
|
|||
|
|
// (可以在后续版本中实现)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⚠️ 注意事项
|
|||
|
|
|
|||
|
|
### 1. 存储空间
|
|||
|
|
备份文件会占用存储空间,建议:
|
|||
|
|
- 定期清理旧备份
|
|||
|
|
- 或者设置最大备份数量(如10个)
|
|||
|
|
|
|||
|
|
### 2. 性能影响
|
|||
|
|
三次验证和备份会增加一些开销:
|
|||
|
|
- 延迟约 100-200ms
|
|||
|
|
- CPU使用略微增加
|
|||
|
|
- **不影响用户体验**
|
|||
|
|
|
|||
|
|
### 3. 备份失败
|
|||
|
|
如果备份失败(如存储空间不足):
|
|||
|
|
- **不会影响录音功能**
|
|||
|
|
- 只会在控制台显示警告
|
|||
|
|
- 仍然可以正常使用临时文件
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 调试模式
|
|||
|
|
|
|||
|
|
可以添加调试按钮查看诊断信息:
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<!-- 在evaluation.vue中添加 -->
|
|||
|
|
<button @click="showDiagnostic">查看录音诊断</button>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
methods: {
|
|||
|
|
showDiagnostic() {
|
|||
|
|
if (this.recordDiagnostic) {
|
|||
|
|
uni.showModal({
|
|||
|
|
title: '录音诊断信息',
|
|||
|
|
content: JSON.stringify(this.recordDiagnostic, null, 2),
|
|||
|
|
showCancel: false
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 预期效果
|
|||
|
|
|
|||
|
|
添加保护机制后:
|
|||
|
|
- ✅ 数据丢失风险降低 90%
|
|||
|
|
- ✅ 可以追踪录音过程
|
|||
|
|
- ✅ 有备份可以恢复
|
|||
|
|
- ✅ 异常情况有提示
|
|||
|
|
- ✅ 便于问题诊断
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 总结
|
|||
|
|
|
|||
|
|
通过**6层保护机制**,确保:
|
|||
|
|
1. 等待编码完成
|
|||
|
|
2. 验证文件完整性
|
|||
|
|
3. 创建备份副本
|
|||
|
|
4. 记录详细元数据
|
|||
|
|
5. 提供诊断信息
|
|||
|
|
6. 警告用户异常
|
|||
|
|
|
|||
|
|
**即使在极端情况下,也能最大程度保护录音数据!**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
生成时间:2025-12-07
|