#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 快速验证脚本 验证TTS/ASR模块修复是否正确应用 运行方式: python backend/tests/quick_verify.py """ import os import sys from pathlib import Path # 设置控制台编码 if sys.platform == 'win32': import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') # 确保可以导入backend模块 script_path = Path(__file__).resolve() project_root = script_path.parent.parent.parent sys.path.insert(0, str(project_root)) print(f"项目根目录: {project_root}") print(f"脚本路径: {script_path}") def check_file_exists(filepath: str, description: str) -> bool: """检查文件是否存在""" full_path = project_root / filepath exists = full_path.exists() status = "[OK]" if exists else "[FAIL]" print(f"{status} {description}: {filepath} (完整路径: {full_path})") return exists def check_function_exists(module_name: str, function_name: str) -> bool: """检查函数是否存在""" try: module = __import__(module_name, fromlist=[function_name]) exists = hasattr(module, function_name) status = "[OK]" if exists else "[FAIL]" print(f"{status} 函数存在: {module_name}.{function_name}") return exists except Exception as e: print(f"[FAIL] 导入失败: {module_name} - {e}") return False def check_environment_variable(var_name: str, expected_default: str) -> bool: """检查环境变量默认值""" try: # 清除可能存在的环境变量 original_value = os.environ.get(var_name) if var_name in os.environ: del os.environ[var_name] # 重新导入模块 if 'backend.tts_asr' in sys.modules: del sys.modules['backend.tts_asr'] from backend.tts_asr import ( TTS_ASR_DEVICE, TTS_ASR_MODEL_SIZE, TTS_ASR_QUANTIZE, TTS_ASR_OFFLINE_MODE, TTS_ASR_WARMUP, TTS_ASR_WARMUP_TIMEOUT, TTS_ASR_IDLE_TIMEOUT, TTS_ASR_MPS_MEMORY_LIMIT_MB ) var_map = { 'TTS_ASR_DEVICE': TTS_ASR_DEVICE, 'TTS_ASR_MODEL_SIZE': TTS_ASR_MODEL_SIZE, 'TTS_ASR_QUANTIZE': TTS_ASR_QUANTIZE, 'TTS_ASR_OFFLINE_MODE': TTS_ASR_OFFLINE_MODE, 'TTS_ASR_WARMUP': TTS_ASR_WARMUP, 'TTS_ASR_WARMUP_TIMEOUT': TTS_ASR_WARMUP_TIMEOUT, 'TTS_ASR_IDLE_TIMEOUT': TTS_ASR_IDLE_TIMEOUT, 'TTS_ASR_MPS_MEMORY_LIMIT_MB': TTS_ASR_MPS_MEMORY_LIMIT_MB, } actual_value = var_map.get(var_name) if var_name == 'TTS_ASR_MODEL_SIZE': expected = 'auto' elif var_name == 'TTS_ASR_QUANTIZE': expected = False elif var_name == 'TTS_ASR_OFFLINE_MODE': expected = False elif var_name == 'TTS_ASR_WARMUP': expected = True elif var_name == 'TTS_ASR_WARMUP_TIMEOUT': expected = 120 elif var_name == 'TTS_ASR_IDLE_TIMEOUT': expected = 0 elif var_name == 'TTS_ASR_MPS_MEMORY_LIMIT_MB': expected = 8192 else: expected = expected_default matches = actual_value == expected status = "[OK]" if matches else "[FAIL]" print(f"{status} 环境变量默认值: {var_name} = {actual_value} (预期: {expected})") return matches except Exception as e: print(f"[FAIL] 检查环境变量失败: {var_name} - {e}") return False def main(): print("="*70) print("TTS/ASR模块快速验证") print("="*70) checks = [] # 1. 检查文件 print("\n[1] 文件检查") print("-"*70) checks.append(check_file_exists("backend/tts_asr.py", "主模块文件")) checks.append(check_file_exists("backend/tests/test_tts_asr_unit.py", "单元测试")) checks.append(check_file_exists("backend/tests/test_tts_asr_integration.py", "集成测试")) checks.append(check_file_exists("backend/tests/simulate_macos.py", "macOS模拟工具")) checks.append(check_file_exists("backend/tests/TESTING_GUIDE.md", "测试指南")) checks.append(check_file_exists("backend/TTS_ASR_MACOS_FIX.md", "修复文档")) # 2. 检查核心函数 print("\n[2] 核心函数检查") print("-"*70) checks.append(check_function_exists("backend.tts_asr", "_is_apple_silicon")) checks.append(check_function_exists("backend.tts_asr", "_detect_device_capabilities")) checks.append(check_function_exists("backend.tts_asr", "_get_recommended_model_size")) checks.append(check_function_exists("backend.tts_asr", "_validate_audio_data")) checks.append(check_function_exists("backend.tts_asr", "_resample_audio_robust")) checks.append(check_function_exists("backend.tts_asr", "_check_model_cached")) # 3. 检查数据类 print("\n[3] 数据类检查") print("-"*70) checks.append(check_function_exists("backend.tts_asr", "DeviceCapabilities")) checks.append(check_function_exists("backend.tts_asr", "ModelStatus")) # 4. 检查环境变量 print("\n[4] 环境变量默认值检查") print("-"*70) checks.append(check_environment_variable("TTS_ASR_DEVICE", "auto")) checks.append(check_environment_variable("TTS_ASR_MODEL_SIZE", "auto")) checks.append(check_environment_variable("TTS_ASR_QUANTIZE", "false")) checks.append(check_environment_variable("TTS_ASR_OFFLINE_MODE", "false")) # 5. 检查常量 print("\n[5] 常量检查") print("-"*70) try: from backend.tts_asr import WHISPER_MODEL_SIZES, APPLE_SILICON_DEFAULT_SIZE expected_sizes = ['tiny', 'base', 'small', 'medium', 'large', 'turbo'] sizes_match = list(WHISPER_MODEL_SIZES.keys()) == expected_sizes status = "[OK]" if sizes_match else "[FAIL]" print(f"{status} WHISPER_MODEL_SIZES: {list(WHISPER_MODEL_SIZES.keys())}") checks.append(sizes_match) size_match = APPLE_SILICON_DEFAULT_SIZE == 'small' status = "[OK]" if size_match else "[FAIL]" print(f"{status} APPLE_SILICON_DEFAULT_SIZE: {APPLE_SILICON_DEFAULT_SIZE}") checks.append(size_match) except Exception as e: print(f"[FAIL] 常量检查失败: {e}") checks.extend([False, False]) # 汇总结果 print("\n" + "="*70) print("验证结果") print("="*70) total = len(checks) passed = sum(checks) print(f"通过: {passed}/{total}") if all(checks): print("\n[SUCCESS] 所有验证通过!TTS/ASR模块修复已正确应用。") return 0 else: print("\n[FAILED] 部分验证失败,请检查上述错误。") return 1 if __name__ == '__main__': sys.exit(main())