#!/usr/bin/env python3 """ Build script for creating standalone transcriber executable using PyInstaller. Uses --onedir mode for faster startup compared to --onefile. """ import subprocess import sys import os import shutil def clean_build_cache(script_dir): """Clean old build artifacts that may cause stale spec file issues.""" dirs_to_clean = [ os.path.join(script_dir, "build"), os.path.join(script_dir, "__pycache__"), ] files_to_clean = [ os.path.join(script_dir, "build", "transcriber.spec"), ] for f in files_to_clean: if os.path.exists(f): print(f"Removing old spec file: {f}") os.remove(f) for d in dirs_to_clean: pycache = os.path.join(d) if os.path.exists(pycache) and "__pycache__" in pycache: print(f"Removing cache: {pycache}") shutil.rmtree(pycache) def build(): """Build the transcriber executable.""" script_dir = os.path.dirname(os.path.abspath(__file__)) # Clean old build cache to avoid stale spec file issues clean_build_cache(script_dir) # PyInstaller command with --onedir for faster startup cmd = [ sys.executable, "-m", "PyInstaller", "--onedir", "--clean", # Clean PyInstaller cache before building "--name", "transcriber", "--distpath", "dist", "--workpath", "build", "--specpath", "build", # Core dependencies "--hidden-import", "faster_whisper", "--hidden-import", "opencc", "--hidden-import", "numpy", "--hidden-import", "ctranslate2", "--hidden-import", "huggingface_hub", "--hidden-import", "huggingface_hub.utils", "--hidden-import", "tokenizers", # ONNX Runtime for VAD "--hidden-import", "onnxruntime", # Audio processing "--hidden-import", "wave", # Collect data files "--collect-data", "faster_whisper", "--collect-data", "opencc", "transcriber.py" ] print("Building transcriber executable...") print(f"Command: {' '.join(cmd)}") result = subprocess.run(cmd, cwd=script_dir) if result.returncode == 0: print("\nBuild successful!") print("Executable created at: dist/transcriber/transcriber.exe (Windows) or dist/transcriber/transcriber (Linux)") print("\nNote: The Whisper model will be downloaded on first run if not cached.") else: print("\nBuild failed!") sys.exit(1) if __name__ == "__main__": build()