"""Explicit offline ASR build inputs; never package user recordings or caches.""" from pathlib import Path def asr_build_inputs(project_root): from voice_transcription import _verified_model_directory from PyInstaller.utils.hooks import ( collect_data_files, collect_dynamic_libs, collect_submodules, collect_delvewheel_libs_directory, copy_metadata, ) model = _verified_model_directory(Path(project_root) / "assets/asr/faster-whisper-base") names = ("config.json", "model.bin", "tokenizer.json", "vocabulary.txt", "README.md", "LICENSE.whisper.txt", "manifest.json") datas = [] for name in names: path = model / name if not path.is_file(): raise FileNotFoundError("Offline ASR build file missing: " + name) datas.append((str(path), "assets/asr/faster-whisper-base")) # The VAD ONNX file must accompany faster_whisper.vad's __file__-based lookup. datas += collect_data_files("faster_whisper") binaries = collect_dynamic_libs("ctranslate2") datas, binaries = collect_delvewheel_libs_directory("av", datas=datas, binaries=binaries) hidden = ["voice_transcription", "pysilk.backends.cython._silk"] hidden += collect_submodules("faster_whisper") + collect_submodules("av") hidden += collect_submodules("pysilk", filter=lambda name: ".cffi" not in name) hidden += collect_submodules("ctranslate2", filter=lambda name: not name.startswith( ("ctranslate2.converters", "ctranslate2.specs"))) for package in ("faster-whisper", "silk-python", "ctranslate2", "av", "tokenizers", "huggingface-hub"): datas += copy_metadata(package) return datas, binaries, sorted(set(hidden))