VoiceDialogue / build /pyinstaller /hooks /hook-voice_dialogue.py
liumaolin
Add `pyaudio` and `silero_vad` as dependencies for PyInstaller hooks
08de414
"""
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}")