测试说明.md 4.0 KB

🧪 快速响应优化测试说明

当前状态

✅ 后端服务已启动 ✅ 前端优化代码已部署 ✅ 快速预播放机制已启用


工作原理

播放流程

1. 收到第1-4个音频块 → 收集中
2. 收到第5个音频块 → ⚡ 立即播放前5个块
3. 用户听到: "一百字的..." (~0.5秒音频)
4. 预播放完成 → 等待
5. 收到ai_response_end → 停止预播放,播放完整音频
6. 用户听到完整回复: "一百字的作文啊,那你想要..."

测试步骤

1. 打开前端页面

浏览器访问: https://192.168.2.105:5173

2. 测试短回复

说: "你好"

预期:

  • ~1秒内听到AI回复
  • 浏览器console显示:

    ⚡ 收到5个音频块,立即开始快速预播放!
    🚀 快速预播放:播放前5个音频块
    🎵 音频播放完成
    ⏳ 预播放完成,等待ai_response_end信号...
    ✅ 播放完整音频(所有X个块)
    ✅ 所有音频播放完成
    

3. 测试长回复

说: "请给我讲个100字的故事"

预期:

  • ~1秒内听到开头 "一百字..."
  • 预播放完成后短暂停顿
  • 接着从头播放完整故事

浏览器console应显示:

📦 收到音频块: ... (收集中)
⚡ 收到5个音频块,立即开始快速预播放!  
🎵 音频开始播放  ← ~1秒出现
...
🎵 音频播放完成
⏳ 预播放完成,等待ai_response_end信号...
📦 收到音频块: ... (继续收集)
✅ AI回复完成
⏹️ 停止预播放,准备播放完整音频
✅ 播放完整音频(所有58个块)
✅ 所有音频播放完成

后端日志应显示:

⚡ 性能分析报告
📊 录音时长: XXXXms
📊 ASR处理: ~XXXms
📊 TTS首包: XXXms
📊 总延迟: XXXXms  ← 应该比之前快

性能指标

期待值

指标 目标值 说明
首字响应 < 2秒 用户听到第一个字
预播放时长 ~0.5秒 前5个块的音频长度
总延迟 2-4秒 停止录音到播放完成

测试记录

测试时间 问题 首字响应 总延迟 是否完整播放
17:19 "你好" ~1秒 3.3秒 ✅ 是
17:19 "请写100字作文" ~1秒 4.5秒 ✅ 是

已知现象

轻微重复

  • 前0.5秒音频会播放两次(预播放 + 完整播放)
  • 用户可能会听到: "一百字...一百字的作文啊..."
  • 这是正常的,trade-off是换取快速响应

短暂停顿

  • 预播放和完整播放之间有~100ms停顿
  • 这是切换音频源的必要间隔
  • 可接受

如何验证优化效果

1. 观察首字响应时间

从停止录音到听到第一个字的时间

优化前: 5-30秒 优化后: ~1秒 ⚡

2. 检查完整性

确保能听到完整的回复,不会中断

验证: 长回复也能完整播放 ✅

3. 查看性能报告

后端日志中的性能分析

关注: 总延迟是否 < 4秒


问题排查

如果听不到声音

  1. 检查浏览器console是否有错误
  2. 确认Audio元素已激活
  3. 检查音量设置

如果只听到开头就断了

  1. 检查是否显示"播放完整音频"
  2. 确认allChunksReceived=true
  3. 查看是否有播放错误

如果延迟仍然很高

  1. 检查网络连接
  2. 查看后端性能报告
  3. 确认VAD参数已优化

进一步优化

如果想要更快的响应:

激进模式(3个块就播)

// frontend/src/utils/audioPlayerFallback.ts
// 第169行附近
if (totalChunks === 3 && !this.hasStartedPlaying) {
  this.playQuickPreview()  // 改为3个块
}

// 第186行
const previewChunks = Math.min(3, this.audioChunks.length)  // 改为3

效果: 首字响应更快(~600ms) 风险: 音频太短(~0.3秒),可能只听到一个字


总结

当前配置(5块预播放)是最佳平衡点:

  • ✅ 首字响应快(~1秒)
  • ✅ 预播放有意义(~0.5秒音频)
  • ✅ 完整播放正常
  • ⚠️ 前0.5秒轻微重复(可接受)

立即测试并享受快速响应!🚀