Local-Voice/CACHED_AUDIO_TIMING_FIX.md
2025-09-25 11:25:16 +08:00

2.8 KiB
Raw Blame History

缓存音频播放时序修复总结

问题描述

在打招呼读取缓存播放时发现有时会立即触发播放完成显示异常的时间差49.292秒),导致缓存音频无法正常播放完整。

根本原因

_process_cached_audio 方法中,缓存音频的处理存在时序问题:

  1. 立即设置完成状态:缓存音频被添加到预加载缓冲区后,立即设置 all_audio_received = True
  2. 时序变量未初始化last_audio_chunk_time 没有在缓存音频开始播放时正确设置
  3. 完成检测误判:播放完成检测逻辑使用旧的或零值的 last_audio_chunk_time,计算出异常的时间差,误判播放已完成

修复方案

1. 修改 _process_cached_audio 方法

  • 延迟设置 all_audio_received:不在音频添加到缓冲区时立即设置,而是等待实际开始播放时设置
  • 正确初始化时序变量:在缓存音频开始播放时设置 last_audio_chunk_time = time.time()
  • 确保时序同步:保证 all_audio_receivedlast_audio_chunk_time 在正确的时间点设置

2. 修改音频缓冲区转移逻辑

在以下缓冲区转移场景中也添加了时序变量初始化:

  • 预加载缓冲区达到阈值时
  • 最小缓冲区模式启动时
  • 强制转移预加载缓冲区时

3. 关键修改点

_process_cached_audio 中:

# 修复前立即设置all_audio_received
self.all_audio_received = True

# 修复后:等待播放开始时设置
self.last_audio_chunk_time = time.time()  # 关键修复
self.all_audio_received = True

在缓冲区转移逻辑中:

# 在各种缓冲区转移场景中添加
self.last_audio_chunk_time = time.time()
print(f"🎵 设置last_audio_chunk_time = {self.last_audio_chunk_time}")

修复效果

  1. 解决立即完成问题缓存音频不再出现49.292秒的异常时间差
  2. 确保完整播放:缓存音频能够正常播放完整时长
  3. 时序同步:播放完成检测逻辑现在使用正确的时间戳
  4. 避免死锁:即使在异常情况下,也能正确设置完成状态避免系统卡死

测试验证

创建了专门的测试脚本 test_cached_timing_fix.py 验证修复效果:

  • 关键时序变量存在且可访问
  • 时序变量可以正确设置和读取
  • 时间差计算正常接近0秒而非49.292秒)
  • 异常时间差问题得到解决

影响范围

  • 缓存音频播放:修复了所有缓存音频的播放时序问题
  • 播放完成检测:改进了播放完成检测的准确性
  • 系统稳定性:提高了整个音频播放系统的稳定性

这个修复确保了缓存音频(如角色打招呼)能够正常播放完整,不会立即触发播放完成。