""" Voice Dialogue PyInstaller Hook 用于配置 Voice Dialogue 应用程序的 PyInstaller 打包规则 """ import pathlib from PyInstaller.utils.hooks import ( collect_submodules, collect_data_files, collect_system_data_files, collect_dynamic_libs ) # ============================================================================ # 路径配置 # ============================================================================ PROJECT_ROOT = pathlib.Path(__file__).parent.parent.parent.parent ASSETS_ROOT = PROJECT_ROOT / "assets" # ============================================================================ # 核心模块收集 # ============================================================================ # 收集主模块的所有子模块 hiddenimports = collect_submodules('voice_dialogue') datas = collect_data_files('moyoyo_tts', include_py_files=True) # 收集系统资源文件 datas += collect_system_data_files(ASSETS_ROOT.as_posix(), "assets") # ============================================================================ # 第三方依赖配置 # ============================================================================ # AI/ML 相关依赖 ML_DEPENDENCIES = [ "llama_cpp", "torch", "transformers", "pytorch_lightning", "huggingface_hub", "einops", ] # 语音处理相关依赖 AUDIO_DEPENDENCIES = [ "librosa", "soundfile", "funasr_onnx", "pywhispercpp", "kokoro_onnx", "playsound", "pyaudio", "silero_vad" ] # 文本处理相关依赖 TEXT_PROCESSING_DEPENDENCIES = [ "jieba", "jieba_fast", "cn2an", "g2p_en", "pypinyin", "misaki", "opencc", "wordsegment", "LangSegment", "en_core_web_sm", "spacy", "spacy_curated_transformers", ] # Web/网络相关依赖 WEB_DEPENDENCIES = [ "fastapi", "uvicorn", "websockets", "langchain", "langchain_community", ] # 系统相关依赖 SYSTEM_DEPENDENCIES = [ "AppKit", # macOS "Foundation", # macOS "ffmpeg", ] # 其他依赖 OTHER_DEPENDENCIES = [ 'loguru' ] # 合并所有隐藏导入 hiddenimports.extend( ML_DEPENDENCIES + AUDIO_DEPENDENCIES + TEXT_PROCESSING_DEPENDENCIES + WEB_DEPENDENCIES + SYSTEM_DEPENDENCIES + OTHER_DEPENDENCIES ) # ============================================================================ # 数据文件收集 # ============================================================================ # 需要收集数据文件的包配置 DATA_PACKAGES = [ ("jieba_fast", {}), ("kokoro_onnx", {}), ("language_tags", {}), ("py3langid", {}), ("inflect", {"include_py_files": True}), ("g2p_en", {}), ("wordsegment", {}), ("espeakng_loader", {}), ("spacy", {"include_py_files": True}), ("misaki", {}), ("silero_vad", {}), ] # 收集数据文件 for package_name, kwargs in DATA_PACKAGES: try: datas += collect_data_files(package_name, **kwargs) except Exception as e: print(f"警告:无法收集包 {package_name} 的数据文件: {e}") # ============================================================================ # 动态库收集 # ============================================================================ # 需要收集动态库的包 BINARY_PACKAGES = [ "llama_cpp", "pyaudio" ] binaries = [] for package_name in BINARY_PACKAGES: try: binaries += collect_dynamic_libs(package_name) except Exception as e: print(f"警告:无法收集包 {package_name} 的动态库: {e}")