#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 修复现有缓存问题的脚本 用于处理文件名中的冒号和索引问题 """ import os import sys import json import shutil from pathlib import Path from greeting_cache_manager import GreetingCacheManager def fix_existing_cache(): """修复现有的缓存问题""" print("🔧 修复现有缓存问题") print("=" * 50) cache_dir = Path("greeting_cache") if not cache_dir.exists(): print("❌ 缓存目录不存在,无需修复") return # 1. 备份当前缓存目录 backup_dir = Path("greeting_cache_backup") if backup_dir.exists(): shutil.rmtree(backup_dir) shutil.copytree(cache_dir, backup_dir) print(f"✅ 已备份当前缓存到: {backup_dir}") # 2. 修复文件名中的冒号问题 print("\n🔍 修复文件名中的冒号问题...") problem_files = list(cache_dir.glob(":*.wav")) fixed_count = 0 for file in problem_files: new_name = file.name[1:] # 移除开头的冒号 new_path = file.parent / new_name try: file.rename(new_path) print(f" ✅ 重命名: {file.name} -> {new_name}") fixed_count += 1 except Exception as e: print(f" ❌ 重命名失败: {file.name} - {e}") print(f"📊 修复了 {fixed_count} 个文件名") # 3. 重建缓存索引 print("\n🔄 重建缓存索引...") cache_manager = GreetingCacheManager() # 清空当前索引 cache_manager.cache_index = {} # 扫描所有wav文件 wav_files = list(cache_dir.glob("*.wav")) print(f"🔍 扫描到 {len(wav_files)} 个wav文件") for wav_file in wav_files: # 尝试从文件名解析角色名和hash name_parts = wav_file.stem.split('_') if len(name_parts) >= 2: character_name = name_parts[0] greeting_hash = name_parts[-1] # 最后一个部分是hash cache_key = f"{character_name}_{greeting_hash}" cache_manager.cache_index[cache_key] = str(wav_file.resolve()) print(f" ✅ 添加到索引: {character_name} -> {wav_file.name}") else: print(f" ❌ 无法解析文件名: {wav_file.name}") # 保存索引 cache_manager._save_cache_index() print(f"✅ 索引重建完成,共 {len(cache_manager.cache_index)} 条记录") # 4. 验证缓存完整性 print(f"\n🔍 验证缓存完整性...") valid_count, invalid_count = cache_manager.validate_cache() print(f" 有效缓存: {valid_count}") print(f" 无效缓存: {invalid_count}") # 5. 测试缓存访问 print(f"\n🧪 测试缓存访问...") # 尝试从角色配置文件获取测试数据 characters_dir = Path("characters") if characters_dir.exists(): char_files = list(characters_dir.glob("*.json")) for char_file in char_files[:3]: # 测试前3个角色 try: with open(char_file, 'r', encoding='utf-8') as f: char_config = json.load(f) character_name = char_file.stem greeting_text = char_config.get("greeting", "") if greeting_text: is_cached = cache_manager.is_cached(character_name, greeting_text) cached_path = cache_manager.get_cached_audio_path(character_name, greeting_text) print(f" {character_name}: {'✅' if is_cached else '❌'} 缓存") if cached_path: print(f" 路径: {Path(cached_path).name}") except Exception as e: print(f" ❌ 测试角色 {char_file.name} 失败: {e}") print(f"\n🎉 缓存修复完成!") # 6. 提供使用建议 print(f"\n💡 使用建议:") print(f" 1. 如果仍有问题,可以删除缓存目录重新生成") print(f" 2. 确保greeting_cache目录有写入权限") print(f" 3. 检查磁盘空间是否充足") print(f" 4. 重启应用程序以应用修复") def clean_cache_directory(): """清理缓存目录""" print("\n🧹 清理缓存目录") print("=" * 50) cache_dir = Path("greeting_cache") if cache_dir.exists(): try: shutil.rmtree(cache_dir) print(f"✅ 已删除缓存目录: {cache_dir}") except Exception as e: print(f"❌ 删除缓存目录失败: {e}") else: print("✅ 缓存目录不存在,无需清理") if __name__ == "__main__": try: if len(sys.argv) > 1 and sys.argv[1] == "clean": clean_cache_directory() else: fix_existing_cache() except Exception as e: print(f"\n❌ 修复失败: {e}") import traceback traceback.print_exc() sys.exit(1)