""" 依赖检测和测试脚本 用于诊断 Genie TTS 的依赖问题 """ import sys import importlib import logging logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s') logger = logging.getLogger(__name__) def test_critical_dependencies(): """测试关键依赖""" critical_deps = [ ("onnxruntime", "ONNX Runtime - TTS推理引擎"), ("numpy", "NumPy - 数值计算基础"), ("soundfile", "SoundFile - 音频I/O"), ("huggingface_hub", "Hugging Face Hub - 模型下载"), ] results = {} logger.info("=== 检测关键依赖 ===") for module_name, description in critical_deps: try: module = importlib.import_module(module_name) version = getattr(module, '__version__', 'Unknown') logger.info(f"✅ {description}: v{version}") results[module_name] = {"status": "OK", "version": version} except ImportError as e: logger.error(f"❌ {description}: 未安装 - {e}") results[module_name] = {"status": "MISSING", "error": str(e)} return results def test_optional_dependencies(): """测试可选依赖""" optional_deps = [ ("scipy", "SciPy - 科学计算"), ("librosa", "Librosa - 音频分析"), ("rich", "Rich - 终端美化"), ("gradio", "Gradio - Web界面"), ("pyopenjtalk", "PyOpenJTalk - 日语处理"), ] results = {} logger.info("\n=== 检测可选依赖 ===") for module_name, description in optional_deps: try: module = importlib.import_module(module_name) version = getattr(module, '__version__', 'Unknown') logger.info(f"✅ {description}: v{version}") results[module_name] = {"status": "OK", "version": version} except ImportError as e: logger.warning(f"⚠️ {description}: 未安装 - {e}") results[module_name] = {"status": "MISSING", "error": str(e)} return results def test_genie_tts(): """测试 Genie TTS""" logger.info("\n=== 检测 Genie TTS ===") try: import genie_tts version = getattr(genie_tts, '__version__', 'Unknown') logger.info(f"✅ Genie TTS: v{version}") # 测试基本功能 try: # 尝试访问预定义角色列表 logger.info("🔍 测试预定义角色功能...") # 这不会实际下载,只是测试API logger.info("✅ Genie TTS API 可访问") return {"status": "OK", "version": version} except Exception as e: logger.warning(f"⚠️ Genie TTS API 测试失败: {e}") return {"status": "PARTIAL", "version": version, "error": str(e)} except ImportError as e: logger.error(f"❌ Genie TTS: 未安装 - {e}") return {"status": "MISSING", "error": str(e)} def test_onnx_runtime_providers(): """测试 ONNX Runtime 提供程序""" logger.info("\n=== 检测 ONNX Runtime 提供程序 ===") try: import onnxruntime as ort providers = ort.get_available_providers() logger.info(f"可用提供程序: {providers}") # 检查CPU提供程序 if 'CPUExecutionProvider' in providers: logger.info("✅ CPU执行提供程序可用") else: logger.error("❌ CPU执行提供程序不可用") return {"providers": providers} except Exception as e: logger.error(f"❌ ONNX Runtime 提供程序检测失败: {e}") return {"error": str(e)} def main(): """主函数""" logger.info("Genie TTS 依赖检测工具") logger.info("=" * 50) # 系统信息 logger.info(f"Python 版本: {sys.version}") logger.info(f"平台: {sys.platform}") # 测试依赖 critical_results = test_critical_dependencies() optional_results = test_optional_dependencies() genie_results = test_genie_tts() onnx_results = test_onnx_runtime_providers() # 总结 logger.info("\n=== 检测总结 ===") critical_missing = [k for k, v in critical_results.items() if v["status"] != "OK"] if critical_missing: logger.error(f"❌ 缺少关键依赖: {', '.join(critical_missing)}") logger.error("🚨 没有这些依赖,Genie TTS 无法正常工作!") else: logger.info("✅ 所有关键依赖都已安装") optional_missing = [k for k, v in optional_results.items() if v["status"] != "OK"] if optional_missing: logger.info(f"ℹ️ 缺少可选依赖: {', '.join(optional_missing)}") logger.info("💡 这些依赖缺失可能影响部分功能,但不会阻止基本运行") if genie_results["status"] == "OK": logger.info("🎉 Genie TTS 已准备就绪!") elif genie_results["status"] == "PARTIAL": logger.warning("⚠️ Genie TTS 已安装但功能可能受限") else: logger.error("❌ Genie TTS 未安装或无法导入") return critical_missing, optional_missing, genie_results if __name__ == "__main__": main()