-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtinyreadaloud.spec
More file actions
148 lines (130 loc) · 4.41 KB
/
tinyreadaloud.spec
File metadata and controls
148 lines (130 loc) · 4.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# -*- mode: python ; coding: utf-8 -*-
"""PyInstaller spec for TinyReadAloud."""
import importlib
import os
block_cipher = None
def get_pkg_dir(pkg_name):
mod = importlib.import_module(pkg_name)
mod_file = getattr(mod, "__file__", None)
if mod_file:
return os.path.dirname(mod_file)
# Namespace packages (e.g. nvidia) may not define __file__.
mod_path = getattr(mod, "__path__", None)
if mod_path:
for p in mod_path:
if p:
return p
raise ImportError(f"Could not resolve package directory for {pkg_name}")
# Locate package data directories
espeakng_dir = get_pkg_dir("espeakng_loader")
langdetect_dir = get_pkg_dir("langdetect")
kokoro_dir = get_pkg_dir("kokoro_onnx")
sounddevice_data_dir = get_pkg_dir("_sounddevice_data")
phonemizer_dir = get_pkg_dir("phonemizer")
language_tags_dir = get_pkg_dir("language_tags")
# GPU build toggle (set TINYREADALOUD_GPU=1 for GPU variant)
gpu_build = os.environ.get("TINYREADALOUD_GPU", "0") == "1"
# Data files that must be bundled
datas = [
# espeak-ng runtime (DLL + data)
(os.path.join(espeakng_dir, "espeak-ng.dll"), "espeakng_loader"),
(os.path.join(espeakng_dir, "espeak-ng-data"), "espeakng_loader/espeak-ng-data"),
# langdetect language profiles
(os.path.join(langdetect_dir, "profiles"), "langdetect/profiles"),
# kokoro_onnx tokenizer config
(os.path.join(kokoro_dir, "config.json"), "kokoro_onnx"),
# phonemizer shared data
(os.path.join(phonemizer_dir, "share"), "phonemizer/share"),
# portaudio DLL for sounddevice
(os.path.join(sounddevice_data_dir, "portaudio-binaries"), "_sounddevice_data/portaudio-binaries"),
# language_tags JSON data (required by csvw -> segments -> phonemizer)
(os.path.join(language_tags_dir, "data"), "language_tags/data"),
]
# For GPU builds, include NVIDIA CUDA DLLs from pip packages
binaries = []
if gpu_build:
try:
nvidia_base = os.path.dirname(get_pkg_dir("nvidia"))
for subpkg in ("cublas", "cuda_runtime", "cudnn", "cufft", "nvjitlink"):
bin_dir = os.path.join(nvidia_base, "nvidia", subpkg, "bin")
if os.path.isdir(bin_dir):
for dll in os.listdir(bin_dir):
if dll.lower().endswith(".dll"):
binaries.append((os.path.join(bin_dir, dll), "."))
except ImportError:
pass
hiddenimports = [
"pystray._win32",
"keyboard._winkeyboard",
"PIL._tkinter_finder",
"phonemizer.backend.espeak",
"phonemizer.backend.espeak.espeak",
"phonemizer.backend.espeak.wrapper",
"phonemizer.backend.espeak.api",
"phonemizer.backend.espeak.mbrola",
"phonemizer.backend.espeak.voice",
"espeakng_loader",
"kokoro_onnx.config",
"kokoro_onnx.tokenizer",
"kokoro_onnx.trim",
"kokoro_onnx.log",
"version",
"updater",
]
a = Analysis(
["app.py"],
pathex=[],
binaries=binaries,
datas=datas,
hiddenimports=hiddenimports,
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[
"matplotlib", "scipy", "pandas", "pytest", "IPython",
"notebook", "sphinx", "docutils",
# Prevent PyInstaller from traversing unrelated heavyweight ML stacks
# that may exist in the local Python environment.
"torch", "torchvision", "torchaudio",
"tensorflow", "keras", "transformers",
"sklearn", "cv2", "numba", "librosa", "soundfile",
"xgboost", "lightgbm", "catboost", "faiss", "openvino",
],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name="TinyReadAloud",
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
icon="assets/app.ico",
uac_admin=False,
)
# For CPU builds, exclude the huge CUDA/TensorRT provider DLLs
# that the onnxruntime hook pulls in automatically (~712MB)
_excluded_binaries = set()
if not gpu_build:
_excluded_binaries = {
"onnxruntime_providers_cuda.dll",
"onnxruntime_providers_tensorrt.dll",
}
# Filter out excluded binaries
_filtered_binaries = [(name, path, typecode) for name, path, typecode in a.binaries
if os.path.basename(path) not in _excluded_binaries]
coll = COLLECT(
exe,
_filtered_binaries,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name="TinyReadAloud",
)