File size: 5,198 Bytes
24437ee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
"""
依赖检测和测试脚本
用于诊断 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()