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

172 lines
5.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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🎉 所有测试完成!")