Local-Voice/test_cache_fixes.py
2025-09-25 10:41:27 +08:00

172 lines
6.2 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
测试修复后的缓存播放功能
"""
import os
import sys
import time
# 添加项目路径
sys.path.append('.')
def test_cache_playback_fixes():
"""测试缓存播放修复"""
print("🔧 测试缓存播放修复")
print("=" * 40)
from audio_processes import save_greeting_cache, greeting_cache_exists, load_cached_audio
# 创建测试缓存
character_name = "测试角色"
mock_audio = b"test_cached_audio_" * 100 # 约1.6KB
print("📝 创建测试缓存...")
save_greeting_cache(character_name, mock_audio)
if greeting_cache_exists(character_name):
print("✅ 缓存创建成功")
# 模拟OutputProcess的修复逻辑
print("\n🎵 模拟修复后的缓存播放流程...")
# 模拟状态变量
is_playing = False
currently_playing = False
preload_buffer = []
playback_buffer = []
preload_size = 3
last_playback_time = 0
playback_cooldown_period = 0.05
tts_generation_complete = False
all_audio_received = False
# 模拟加载缓存
cached_audio = load_cached_audio(character_name)
if cached_audio:
print(f"📁 缓存音频加载: {len(cached_audio)} 字节")
# 添加到预加载缓冲区
preload_buffer.append(cached_audio)
print(f"📦 添加到预加载缓冲区")
# 应用修复后的逻辑
print("\n🔧 应用修复1: 设置TTS完成状态")
tts_generation_complete = True
print(f" tts_generation_complete = {tts_generation_complete}")
print("🔧 应用修复2: 设置all_audio_received状态")
all_audio_received = True
print(f" all_audio_received = {all_audio_received}")
print("🔧 应用修复3: 检查播放触发条件")
if (not is_playing and len(preload_buffer) >= preload_size):
print(" 🎵 条件1: 预加载完成播放")
playback_buffer.extend(preload_buffer)
preload_buffer.clear()
is_playing = True
last_playback_time = 0 # 修复: 避免冷却期
print(f" 📊 播放缓冲区: {len(playback_buffer)}")
elif (not is_playing and len(preload_buffer) > 0):
print(" 🎵 条件2: 强制播放缓存音频")
playback_buffer.extend(preload_buffer)
preload_buffer.clear()
is_playing = True
last_playback_time = 0 # 修复: 避免冷却期
print(f" 📊 播放缓冲区: {len(playback_buffer)}")
# 模拟播放冷却检查
print("\n🔧 检查播放冷却机制...")
current_time = time.time()
time_since_last_play = current_time - last_playback_time
in_cooldown = (last_playback_time > 0 and
time_since_last_play < playback_cooldown_period)
print(f" time_since_last_play = {time_since_last_play}")
print(f" playback_cooldown_period = {playback_cooldown_period}")
print(f" in_cooldown = {in_cooldown}")
if not in_cooldown:
print(" ✅ 无冷却期限制,可以播放")
currently_playing = True
print(" 🎧 开始播放音频...")
else:
print(" ❌ 仍在冷却期内,跳过播放")
# 模拟播放完成检测
print("\n🔧 检查播放完成条件...")
conditions_met = (
tts_generation_complete and # TTS生成完成
all_audio_received and # 所有音频已接收
len(preload_buffer) == 0 and # 预加载缓冲区为空
len(playback_buffer) == 0 and # 播放缓冲区为空
not currently_playing # 当前没有在播放
)
print(f" tts_generation_complete = {tts_generation_complete}")
print(f" all_audio_received = {all_audio_received}")
print(f" preload_buffer_empty = {len(preload_buffer) == 0}")
print(f" playback_buffer_empty = {len(playback_buffer) == 0}")
print(f" not_currently_playing = {not currently_playing}")
print(f" conditions_met = {conditions_met}")
if conditions_met:
print(" ✅ 播放完成条件满足")
else:
print(" ⏳ 等待播放完成")
else:
print("❌ 缓存创建失败")
def test_key_fixes():
"""测试关键修复点"""
print("\n🔍 测试关键修复点")
print("=" * 30)
print("✅ 修复1: 播放冷却问题")
print(" - 将 last_playback_time 设置为 0")
print(" - 避免立即触发冷却期")
print("\n✅ 修复2: all_audio_received 状态")
print(" - 缓存音频立即设置为 True")
print(" - 避免系统无限等待")
print("\n✅ 修复3: 播放触发逻辑")
print(" - 强制播放机制")
print(" - 确保缓存音频能正常播放")
def cleanup():
"""清理测试文件"""
print("\n🧹 清理测试文件")
from audio_processes import get_greeting_cache_path
cache_path = get_greeting_cache_path("测试角色")
if os.path.exists(cache_path):
try:
os.remove(cache_path)
print(" ✅ 测试缓存已删除")
except Exception as e:
print(f" ❌ 删除失败: {e}")
if __name__ == "__main__":
print("🚀 开始测试修复后的缓存播放功能")
try:
# 测试缓存播放修复
test_cache_playback_fixes()
# 测试关键修复点
test_key_fixes()
print("\n🎉 修复测试完成!")
except Exception as e:
print(f"\n❌ 测试过程中出错: {e}")
import traceback
traceback.print_exc()
finally:
# 清理测试文件
cleanup()