diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4190b11 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,6 @@ +FROM python:3.9 + +WORKDIR /usr/src/app + +COPY environments/requirements-linux.txt ./requirements.txt +RUN pip install --no-cache-dir -r requirements.txt diff --git a/generate_linux_binary.sh b/generate_linux_binary.sh new file mode 100644 index 0000000..185fca3 --- /dev/null +++ b/generate_linux_binary.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +docker buildx build --platform linux/amd64 -t noscribe . +docker run --rm -it --mount type=bind,src=.,dst=/usr/src/app noscribe pyinstaller noScribe-linux.spec \ No newline at end of file diff --git a/noScribe-linux.spec b/noScribe-linux.spec new file mode 100644 index 0000000..f16a319 --- /dev/null +++ b/noScribe-linux.spec @@ -0,0 +1,102 @@ +from PyInstaller.utils.hooks import collect_all +import site + +# noScribe + +noScribe_a = Analysis( + ['noScribe.py'], + pathex=[], + binaries=[], + datas=[('trans', 'trans/'), ('noScribeLogo.png', '.'), ('graphic_sw.png', '.'), ('ffmpeg', '.'), ('models/faster-whisper-small', 'models/faster-whisper-small/'), ('models/faster-whisper-large-v2', 'models/faster-whisper-large-v2/'), ('prompt.yml', '.'), ('LICENSE.txt', '.'), ('README.md', '.')], + hiddenimports=['PIL', 'PIL._imagingtk', 'PIL._tkinter_finder'], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, +) + +noScribe_pyz = PYZ(noScribe_a.pure) + +noScribe_exe = EXE( + noScribe_pyz, + noScribe_a.scripts, + [], + exclude_binaries=True, + name='noScribe', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=False, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, + icon=['noScribeLogo.ico'], +) + +# diarize + +site_packages = site.getsitepackages() +diarize_datas = [('models/pyannote_config.yaml', 'models/.'), (f'{site_packages[0]}/lightning', 'lightning/'), (f'{site_packages[0]}/lightning_fabric', 'lightning_fabric'), (f'{site_packages[0]}/torchaudio', 'torchaudio'), (f'{site_packages[0]}/pyannote', 'pyannote/'), (f'{site_packages[0]}/pytorch_metric_learning', 'pytorch_metric_learning/'), (f'{site_packages[0]}/sklearn', 'sklearn/'), ('models/pytorch_model.bin', 'models/.'), (f'{site_packages[0]}/asteroid_filterbanks', 'asteroid_filterbanks/'), (f'{site_packages[0]}/pytorch_lightning', 'pytorch_lightning/'), ('models/torch', 'models/torch/')] +diarize_binaries = [] +diarize_hiddenimports = [] +diarize_tmp_ret = collect_all('speechbrain') +diarize_datas += diarize_tmp_ret[0]; diarize_binaries += diarize_tmp_ret[1]; diarize_hiddenimports += diarize_tmp_ret[2] + +diarize_a = Analysis( + ['diarize.py'], + pathex=[], + binaries=diarize_binaries, + datas=diarize_datas, + hiddenimports=diarize_hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, +) + +diarize_pyz = PYZ(diarize_a.pure) + +diarize_exe = EXE( + diarize_pyz, + diarize_a.scripts, + [], + exclude_binaries=True, + name='diarize', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) + +# final + +coll = COLLECT( + noScribe_exe, + noScribe_a.binaries, + noScribe_a.datas, + diarize_exe, + diarize_a.binaries, + diarize_a.datas, + strip=False, + upx=True, + upx_exclude=[], + name='noScribe', +) + +app = BUNDLE( + coll, + name='noScribe.app', + icon='noScribeLogo.ico', + bundle_identifier='org.noScribe.noScribe', +) diff --git a/noScribe.py b/noScribe.py index 0040188..2d0ea69 100644 --- a/noScribe.py +++ b/noScribe.py @@ -345,7 +345,10 @@ def __init__(self): if platform.system() in ("Darwin", "Windows"): self.iconbitmap('noScribeLogo.ico') if platform.system() == "Linux": - self.iconphoto(True, tk.PhotoImage(file='noScribeLogo.png')) + if hasattr(sys, "_MEIPASS"): + self.iconphoto(True, tk.PhotoImage(file=os.path.join(sys._MEIPASS, "noScribeLogo.png"))) + else: + self.iconphoto(True, tk.PhotoImage(file='noScribeLogo.png')) # header self.frame_header = ctk.CTkFrame(self, height=100) @@ -563,7 +566,10 @@ def launch_editor(self, file=''): elif platform.system() == "Darwin": # = MAC program = os.path.join(os.sep, 'Applications', 'noScribeEdit.app', 'Contents', 'MacOS', 'noScribeEdit') elif platform.system() == "Linux": - program = os.path.join(app_dir, 'noScribeEdit', "noScribeEdit") + if hasattr(sys, "_MEIPASS"): + program = os.path.join(sys._MEIPASS, 'noScribeEdit', "noScribeEdit") + else: + program = os.path.join(app_dir, 'noScribeEdit', "noScribeEdit") kwargs = {} if platform.system() == 'Windows': # from msdn [1]