172 lines
5.6 KiB
Python
172 lines
5.6 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
测试缓存音频播放功能
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import time
|
||
from pathlib import Path
|
||
|
||
# 添加项目路径
|
||
sys.path.append('.')
|
||
|
||
from audio_processes import (
|
||
get_greeting_cache_path,
|
||
greeting_cache_exists,
|
||
load_cached_audio,
|
||
save_greeting_cache
|
||
)
|
||
|
||
def test_cached_audio_playback():
|
||
"""测试缓存音频播放功能"""
|
||
print("🎵 测试缓存音频播放功能")
|
||
print("=" * 50)
|
||
|
||
# 确保缓存目录存在
|
||
os.makedirs("greeting_cache", exist_ok=True)
|
||
|
||
# 测试角色
|
||
character_name = "测试角色"
|
||
greeting_text = "这是一个测试角色的打招呼音频。"
|
||
|
||
# 1. 创建测试缓存音频
|
||
print(f"\n📝 创建测试缓存音频...")
|
||
cache_path = get_greeting_cache_path(character_name)
|
||
|
||
# 生成模拟音频数据(较大音频以测试播放)
|
||
mock_audio_data = b"mock_cached_audio_data_" * 100 # 约2.5KB
|
||
|
||
# 保存到缓存
|
||
save_success = save_greeting_cache(character_name, mock_audio_data)
|
||
print(f" 缓存保存结果: {save_success}")
|
||
|
||
# 2. 验证缓存文件
|
||
if os.path.exists(cache_path):
|
||
file_size = os.path.getsize(cache_path)
|
||
print(f" 缓存文件大小: {file_size} 字节")
|
||
|
||
# 3. 模拟缓存加载和播放状态检查
|
||
print(f"\n🎵 模拟缓存音频播放流程...")
|
||
|
||
# 模拟OutputProcess的播放状态
|
||
is_playing = False
|
||
preload_buffer = []
|
||
playback_buffer = []
|
||
preload_size = 3
|
||
|
||
# 模拟加载缓存音频
|
||
cached_audio = load_cached_audio(character_name)
|
||
if cached_audio:
|
||
print(f" ✅ 缓存音频加载成功: {len(cached_audio)} 字节")
|
||
|
||
# 模拟添加到预加载缓冲区
|
||
preload_buffer.append(cached_audio)
|
||
print(f" 📦 已添加到预加载缓冲区,当前大小: {len(preload_buffer)}")
|
||
|
||
# 检查播放触发条件(修复后的逻辑)
|
||
if (not is_playing and len(preload_buffer) >= preload_size):
|
||
print(f" 🎵 条件1:预加载完成,开始播放")
|
||
playback_buffer.extend(preload_buffer)
|
||
preload_buffer.clear()
|
||
is_playing = True
|
||
print(f" 🎵 播放缓冲区大小: {len(playback_buffer)}")
|
||
elif (not is_playing and len(preload_buffer) > 0):
|
||
print(f" 🎵 条件2:强制播放缓存音频")
|
||
playback_buffer.extend(preload_buffer)
|
||
preload_buffer.clear()
|
||
is_playing = True
|
||
print(f" 🎵 播放缓冲区大小: {len(playback_buffer)}")
|
||
else:
|
||
print(f" ⚠️ 未满足播放条件")
|
||
print(f" is_playing: {is_playing}")
|
||
print(f" preload_buffer大小: {len(preload_buffer)}")
|
||
print(f" preload_size: {preload_size}")
|
||
else:
|
||
print(f" ❌ 缓存音频加载失败")
|
||
|
||
# 4. 模拟播放完成检测
|
||
if is_playing and len(playback_buffer) > 0:
|
||
print(f"\n🎵 模拟播放过程...")
|
||
print(f" 🎧 正在播放音频...")
|
||
|
||
# 模拟播放缓冲区清空
|
||
playback_buffer.clear()
|
||
is_playing = False
|
||
print(f" ✅ 播放完成")
|
||
|
||
print(f"\n✅ 缓存音频播放测试完成")
|
||
|
||
def test_different_audio_sizes():
|
||
"""测试不同大小的音频文件"""
|
||
print("\n🎵 测试不同大小的音频文件")
|
||
print("=" * 40)
|
||
|
||
test_cases = [
|
||
{"name": "小音频", "size": 1}, # 1个音频块
|
||
{"name": "中等音频", "size": 5}, # 5个音频块
|
||
{"name": "大音频", "size": 10}, # 10个音频块
|
||
]
|
||
|
||
preload_size = 3
|
||
|
||
for case in test_cases:
|
||
print(f"\n📝 测试{case['name']} ({case['size']}个音频块)")
|
||
|
||
# 模拟音频块
|
||
audio_chunks = [f"chunk_{i}".encode() for i in range(case['size'])]
|
||
|
||
# 模拟播放状态
|
||
is_playing = False
|
||
preload_buffer = []
|
||
playback_buffer = []
|
||
|
||
# 添加音频到预加载缓冲区
|
||
preload_buffer.extend(audio_chunks)
|
||
print(f" 📦 添加到预加载缓冲区: {len(preload_buffer)} 块")
|
||
|
||
# 检查播放触发条件
|
||
if (not is_playing and len(preload_buffer) >= preload_size):
|
||
print(f" 🎵 预加载完成,开始播放")
|
||
playback_buffer.extend(preload_buffer)
|
||
preload_buffer.clear()
|
||
is_playing = True
|
||
elif (not is_playing and len(preload_buffer) > 0):
|
||
print(f" 🎵 强制播放缓存音频")
|
||
playback_buffer.extend(preload_buffer)
|
||
preload_buffer.clear()
|
||
is_playing = True
|
||
else:
|
||
print(f" ⚠️ 未满足播放条件")
|
||
|
||
print(f" 📊 播放状态: is_playing={is_playing}, playback_buffer={len(playback_buffer)}, preload_buffer={len(preload_buffer)}")
|
||
|
||
def cleanup_test_files():
|
||
"""清理测试文件"""
|
||
print("\n🧹 清理测试文件")
|
||
|
||
cache_path = get_greeting_cache_path("测试角色")
|
||
if os.path.exists(cache_path):
|
||
try:
|
||
os.remove(cache_path)
|
||
print(f" 已删除: {cache_path}")
|
||
except Exception as e:
|
||
print(f" 删除失败: {e}")
|
||
|
||
if __name__ == "__main__":
|
||
print("🚀 开始测试缓存音频播放功能")
|
||
|
||
try:
|
||
# 测试缓存音频播放
|
||
test_cached_audio_playback()
|
||
|
||
# 测试不同大小的音频
|
||
test_different_audio_sizes()
|
||
|
||
finally:
|
||
# 清理测试文件
|
||
cleanup_test_files()
|
||
|
||
print("\n🎉 所有测试完成!") |