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