172 lines
6.2 KiB
Python
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() |