From 02b85737f9dffa18f7d05d7be62014e40660e917 Mon Sep 17 00:00:00 2001 From: baxtree Date: Mon, 12 Jul 2021 09:34:21 +0100 Subject: [PATCH] improve installations on optional packages --- .github/workflows/ci-pipeline.yml | 3 +- Makefile | 38 +++++++++--- README.md | 58 ++++++++++++------- docker/Dockerfile-ArchLinux | 2 +- docker/Dockerfile-CentOS7 | 2 +- docker/Dockerfile-CentOS8 | 2 +- docker/Dockerfile-Debian10 | 2 +- docker/Dockerfile-Fedora31 | 2 +- docker/Dockerfile-Ubuntu18 | 2 +- docker/Dockerfile-Ubuntu20 | 2 +- misc/profiler.py | 2 +- ...ents-extra.txt => requirements-stretch.txt | 0 requirements-translation.txt | 5 ++ requirements.txt | 5 -- setup.py | 13 +++-- site/source/installation.rst | 42 +++++++++----- site/source/usage.rst | 7 ++- subaligner/__main__.py | 35 ++++++----- subaligner/_version.py | 2 +- subaligner/exception.py | 4 -- subaligner/predictor.py | 9 +-- subaligner/subaligner_1pass/__main__.py | 29 ++++++---- subaligner/subaligner_2pass/__main__.py | 33 +++++++---- subaligner/subaligner_batch/__main__.py | 31 +++++----- subaligner/subaligner_convert/__main__.py | 23 +++++--- subaligner/subaligner_train/__main__.py | 18 +++--- subaligner/subaligner_tune/__main__.py | 16 ++--- subaligner/translator.py | 2 + 28 files changed, 240 insertions(+), 149 deletions(-) rename requirements-extra.txt => requirements-stretch.txt (100%) create mode 100644 requirements-translation.txt diff --git a/.github/workflows/ci-pipeline.yml b/.github/workflows/ci-pipeline.yml index 5ab9ec1..ae39328 100644 --- a/.github/workflows/ci-pipeline.yml +++ b/.github/workflows/ci-pipeline.yml @@ -26,7 +26,8 @@ jobs: sudo apt-get -y install libsndfile-dev python -m pip install --upgrade pip cat requirements.txt | xargs -L 1 pip install - cat requirements-extra.txt | xargs -L 1 pip install + cat requirements-stretch.txt | xargs -L 1 pip install + cat requirements-translation.txt | xargs -L 1 pip install cat requirements-dev.txt | xargs -L 1 pip install pip install -e . --ignore-installed - name: Linting diff --git a/Makefile b/Makefile index 98c4678..3bf1626 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,8 @@ install: if [ ! -e ".$(PYTHON)" ]; then ~/.pyenv/versions/$(PYTHON)/bin/python3 -m venv .$(PYTHON); fi .$(PYTHON)/bin/pip install --upgrade pip setuptools wheel; \ cat requirements.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ - cat requirements-extra.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ + cat requirements-stretch.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ + cat requirements-translation.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ cat requirements-dev.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ .$(PYTHON)/bin/pip install -e . --ignore-installed cp ./bin/subaligner_1pass .$(PYTHON)/bin/subaligner_1pass @@ -50,6 +51,24 @@ uninstall: rm -f .$(PYTHON)/bin/subaligner_train rm -f .$(PYTHON)/bin/subaligner_tune +install-basic: + .$(PYTHON)/bin/pip install -e '.' --no-cache-dir + +install-translation: + .$(PYTHON)/bin/pip install -e '.[translation]' --no-cache-dir + +install-stretch: + .$(PYTHON)/bin/pip install -e '.[stretch]' --no-cache-dir + +install-dev: + .$(PYTHON)/bin/pip install -e '.[dev]' --no-cache-dir + +install-docs: + .$(PYTHON)/bin/pip install -e '.[docs]' --no-cache-dir + +install-harmony: + .$(PYTHON)/bin/pip install -e '.[harmony]' --no-cache-dir + build-gzip: mkdir -p dist tar -czf dist/subligner.tar.gz subaligner bin requirements.txt setup.py README.md LICENCE @@ -62,7 +81,8 @@ test: if [ ! -e ".$(PYTHON)" ]; then ~/.pyenv/versions/$(PYTHON)/bin/python3 -m venv .$(PYTHON); fi .$(PYTHON)/bin/pip install --upgrade pip setuptools wheel; \ cat requirements.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ - cat requirements-extra.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ + cat requirements-stretch.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ + cat requirements-translation.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ cat requirements-dev.txt | xargs -L 1 .$(PYTHON)/bin/pip install PYTHONPATH=. .$(PYTHON)/bin/python -m unittest discover -.$(PYTHON)/bin/pycodestyle subaligner tests examples misc bin/subaligner bin/subaligner_1pass bin/subaligner_2pass bin/subaligner_batch bin/subaligner_convert bin/subaligner_train bin/subaligner_tune setup.py --ignore=E203,E501,W503 --exclude="subaligner/lib" @@ -74,7 +94,8 @@ test-int: ## integration test if [ ! -e ".$(PYTHON)" ]; then ~/.pyenv/versions/$(PYTHON)/bin/python3 -m venv .$(PYTHON); fi .$(PYTHON)/bin/pip install --upgrade pip setuptools wheel; \ cat requirements.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ - cat requirements-extra.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ + cat requirements-stretch.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ + cat requirements-translation.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ cat requirements-dev.txt | xargs -L 1 .$(PYTHON)/bin/pip install .$(PYTHON)/bin/pip install -e . --ignore-installed ( \ @@ -86,7 +107,8 @@ pydoc: clean-doc ## generate pydoc HTML documentation based on docstrings if [ ! -e ".$(PYTHON)" ]; then ~/.pyenv/versions/$(PYTHON)/bin/python3 -m venv .$(PYTHON); fi .$(PYTHON)/bin/pip install --upgrade pip setuptools wheel; \ cat requirements.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ - cat requirements-extra.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ + cat requirements-stretch.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ + cat requirements-translation.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ .$(PYTHON)/bin/python -m pydoc -w subaligner; mv subaligner.html docs/index.html .$(PYTHON)/bin/python -m pydoc -w subaligner.embedder; mv subaligner.embedder.html docs .$(PYTHON)/bin/python -m pydoc -w subaligner.exception; mv subaligner.exception.html docs @@ -108,7 +130,8 @@ coverage: ## check code coverage quickly with the default Python if [ ! -e ".$(PYTHON)" ]; then ~/.pyenv/versions/$(PYTHON)/bin/python3 -m venv .$(PYTHON); fi .$(PYTHON)/bin/pip install --upgrade pip setuptools wheel; \ cat requirements.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ - cat requirements-extra.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ + cat requirements-stretch.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ + cat requirements-translation.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ cat requirements-dev.txt | xargs -L 1 .$(PYTHON)/bin/pip install .$(PYTHON)/bin/coverage run --source subaligner -m unittest discover .$(PYTHON)/bin/coverage report @@ -143,7 +166,8 @@ profile: if [ ! -e ".$(PYTHON)" ]; then ~/.pyenv/versions/$(PYTHON)/bin/python3 -m venv .$(PYTHON); fi .$(PYTHON)/bin/pip install --upgrade pip setuptools wheel; \ cat requirements.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ - cat requirements-extra.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ + cat requirements-stretch.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ + cat requirements-translation.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ cat requirements-dev.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ .$(PYTHON)/bin/python -c "import misc.profiler; misc.profiler.generate_profiles()" .$(PYTHON)/bin/kernprof -v -l ./misc/profiler.py @@ -152,7 +176,7 @@ app: clean-wheels if [ ! -e ".$(PYTHON)" ]; then ~/.pyenv/versions/$(PYTHON)/bin/python3 -m venv .$(PYTHON); fi .$(PYTHON)/bin/pip install --upgrade pip setuptools wheel; \ cat requirements-dev.txt | xargs -L 1 .$(PYTHON)/bin/pip install; \ - .$(PYTHON)/bin/pip wheel --no-cache-dir --wheel-dir=./wheels -r requirements.txt -r requirements-extra.txt; \ + .$(PYTHON)/bin/pip wheel --no-cache-dir --wheel-dir=./wheels -r requirements.txt -r requirements-stretch.txt -r requirements-translation.txt; \ STRETCH_OFF=True .$(PYTHON)/bin/python setup.py bdist_wheel -d ./wheels; \ .$(PYTHON)/bin/pex subaligner==$(SUBALIGNER_VERSION) --repo=./wheels --platform $(PLATFORM) --no-pypi --no-build --python-shebang="/usr/bin/env python3" -e subaligner -o subaligner-$(PLATFORM).app; \ diff --git a/README.md b/README.md index 5b48343..5286ba4 100644 --- a/README.md +++ b/README.md @@ -10,23 +10,52 @@ ## Dependencies -[FFmpeg](https://www.ffmpeg.org/) and [eSpeak](http://espeak.sourceforge.net/index.html) +Required by basic: [FFmpeg](https://www.ffmpeg.org/) ``` -$ apt-get install ffmpeg espeak libespeak1 libespeak-dev espeak-data +$ apt-get install ffmpeg ``` or ``` -$ brew install ffmpeg espeak +$ brew install ffmpeg ``` -## Installation +## Basic Installation ``` -# Install from PyPI $ pip install -U pip $ pip install subaligner ``` + +## Installation with Optional Packages Supporting Additional Features +``` +# Install dependencies for enabling translation + +$ pip install 'subaligner[translation]' +``` +``` +# Install dependencies for enabling forced alignment + +$ pip install 'subaligner[stretch]' +``` +``` +# Install dependencies for enabling the development environment + +$ pip install 'subaligner[dev]' +``` +Note that both `subaligner[stretch]` and `subaligner[dev]` require additional dependencies to be installed: +``` +$ apt-get install espeak libespeak1 libespeak-dev espeak-data +``` or ``` +$ brew install espeak +``` +To install all supported features: +``` +$ pip install 'subaligner[harmony]' +``` + +## Alternative Installations +``` # Install via pipx $ pip install -U pip pipx $ pipx install subaligner @@ -34,10 +63,9 @@ $ pipx install subaligner or ``` # Install from GitHub via Pipenv -... -[packages] -subaligner = {git = "ssh://git@github.com/baxtree/subaligner.git", ref = ""} -... +$ pipenv install subaligner +$ pipenv install 'subaligner[stretch]' +$ pipenv install 'subaligner[dev]' ``` or ``` @@ -49,18 +77,6 @@ $ python setup.py install ``` or ``` -# Install dependencies for enabling extra features - -$ pip install subaligner[extra] -``` -or -``` -# Install dependencies for enabling the development environment - -$ pip install subaligner[dev] -``` -or -``` # Use dockerised installation $ docker run -v `pwd`:`pwd` -w `pwd` -it baxtree/subaligner bash diff --git a/docker/Dockerfile-ArchLinux b/docker/Dockerfile-ArchLinux index 2aea85d..540aa54 100644 --- a/docker/Dockerfile-ArchLinux +++ b/docker/Dockerfile-ArchLinux @@ -16,4 +16,4 @@ RUN ["/bin/bash", "-c", "pacman --noconfirm -Sy gcc ffmpeg espeak &&\ pacman --noconfirm -Syu python python-pip &&\ ln -s /usr/lib/libffi.so.7 /usr/lib/libffi.so.6 &&\ python -m pip install wheel &&\ - python -m pip install subaligner[extra]==${RELEASE_VERSION:1}"] \ No newline at end of file + python -m pip install 'subaligner[harmony]==${RELEASE_VERSION:1}'"] \ No newline at end of file diff --git a/docker/Dockerfile-CentOS7 b/docker/Dockerfile-CentOS7 index c194062..631a34a 100644 --- a/docker/Dockerfile-CentOS7 +++ b/docker/Dockerfile-CentOS7 @@ -16,4 +16,4 @@ RUN ["/bin/bash", "-c", "yum update -y &&\ yum install -y python36-setuptools &&\ easy_install-3.6 pip &&\ pip install --upgrade pip &&\ - python3 -m pip install subaligner[extra]==${RELEASE_VERSION:1}"] + python3 -m pip install 'subaligner[harmony]==${RELEASE_VERSION:1}'"] diff --git a/docker/Dockerfile-CentOS8 b/docker/Dockerfile-CentOS8 index f5355b8..4e55f48 100644 --- a/docker/Dockerfile-CentOS8 +++ b/docker/Dockerfile-CentOS8 @@ -18,4 +18,4 @@ RUN ["/bin/bash", "-c", "dnf install -y epel-release dnf-utils &&\ dnf install -y python3-devel &&\ dnf install -y python3-pip &&\ pip3 install --upgrade pip &&\ - python3 -m pip install subaligner[extra]==${RELEASE_VERSION:1}"] + python3 -m pip install 'subaligner[harmony]==${RELEASE_VERSION:1}'"] diff --git a/docker/Dockerfile-Debian10 b/docker/Dockerfile-Debian10 index 32c1c6b..2617748 100644 --- a/docker/Dockerfile-Debian10 +++ b/docker/Dockerfile-Debian10 @@ -13,4 +13,4 @@ RUN ["/bin/bash", "-c", "apt-get -y update &&\ apt-get -y install python3-tk &&\ apt-get -y install python3-pip &&\ python3 -m pip install --upgrade pip &&\ - python3 -m pip install subaligner[extra]==${RELEASE_VERSION:1}"] + python3 -m pip install 'subaligner[harmony]==${RELEASE_VERSION:1}'"] diff --git a/docker/Dockerfile-Fedora31 b/docker/Dockerfile-Fedora31 index 46f0042..4c0a468 100644 --- a/docker/Dockerfile-Fedora31 +++ b/docker/Dockerfile-Fedora31 @@ -19,4 +19,4 @@ RUN ["/bin/bash", "-c", "dnf install -y dnf-utils &&\ dnf install -y python3-devel &&\ dnf install -y python3-pip &&\ pip3 install --upgrade pip &&\ - python3 -m pip install subaligner[extra]==${RELEASE_VERSION:1}"] + python3 -m pip install 'subaligner[harmony]==${RELEASE_VERSION:1}'"] diff --git a/docker/Dockerfile-Ubuntu18 b/docker/Dockerfile-Ubuntu18 index 537b71b..fd61353 100644 --- a/docker/Dockerfile-Ubuntu18 +++ b/docker/Dockerfile-Ubuntu18 @@ -13,4 +13,4 @@ RUN ["/bin/bash", "-c", "apt-get -y update &&\ apt-get -y install python3-tk &&\ apt-get -y install python3-pip &&\ python3 -m pip install --upgrade pip &&\ - python3 -m pip install subaligner[extra]==${RELEASE_VERSION:1}"] + python3 -m pip install 'subaligner[harmony]==${RELEASE_VERSION:1}'"] diff --git a/docker/Dockerfile-Ubuntu20 b/docker/Dockerfile-Ubuntu20 index daf42e5..2e1a27b 100644 --- a/docker/Dockerfile-Ubuntu20 +++ b/docker/Dockerfile-Ubuntu20 @@ -13,4 +13,4 @@ RUN ["/bin/bash", "-c", "apt-get -y update &&\ apt-get -y install python3-tk &&\ apt-get -y install python3-pip &&\ python3 -m pip install --upgrade pip &&\ - python3 -m pip install subaligner[extra]==${RELEASE_VERSION:1}"] + python3 -m pip install 'subaligner[harmony]==${RELEASE_VERSION:1}'"] diff --git a/misc/profiler.py b/misc/profiler.py index 9869913..b427f1f 100644 --- a/misc/profiler.py +++ b/misc/profiler.py @@ -36,7 +36,7 @@ def kernprof_target(): output_dir = os.path.join(examples_dir, "tmp") os.makedirs(output_dir, exist_ok=True) video_file_path = os.path.join(examples_dir, "..", "video.mp4") - srt_file_path = os.path.join(examples_dir, "..", "subtitle.srt") + srt_file_path = os.path.join(examples_dir, "..", "video.srt") predictor = Predictor() predictor.predict_dual_pass(video_file_path, srt_file_path) diff --git a/requirements-extra.txt b/requirements-stretch.txt similarity index 100% rename from requirements-extra.txt rename to requirements-stretch.txt diff --git a/requirements-translation.txt b/requirements-translation.txt new file mode 100644 index 0000000..5a68969 --- /dev/null +++ b/requirements-translation.txt @@ -0,0 +1,5 @@ +pycountry~=20.7.3 +sentencepiece~=0.1.95 +six~=1.15.0 +torch~=1.8.1 +transformers~=4.5.1 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index f0e74b0..511c493 100644 --- a/requirements.txt +++ b/requirements.txt @@ -45,7 +45,6 @@ psutil==5.6.7 py==1.10.0 pyasn1==0.4.8 pyasn1-modules==0.2.7 -pycountry~=20.7.3 pydot==1.2.4 pydot-ng==1.0.0 pydotplus==2.0.2 @@ -60,17 +59,13 @@ requests-oauthlib==1.3.0 rsa==4.7 scipy~=1.5.4 scikit-learn>=0.19.1 -sentencepiece~=0.1.95 setuptools>=41.0.0 -six~=1.15.0 tblib==1.3.2 tensorflow>=1.15.5,<2.6 termcolor==1.1.0 toml==0.10.0 toolz==0.9.0 -torch~=1.8.1 tornado==5.1.0 -transformers~=4.5.1 typing-extensions~=3.7.0 urllib3~=1.26.5 Werkzeug>=0.15.3 diff --git a/setup.py b/setup.py index 1273ba2..07f35ab 100644 --- a/setup.py +++ b/setup.py @@ -14,19 +14,24 @@ with open("requirements.txt") as requirements_file: requirements = requirements_file.read().splitlines()[::-1] -with open("requirements-extra.txt") as extra_requirements_file: - extra_requirements = extra_requirements_file.read().splitlines()[::-1] +with open("requirements-stretch.txt") as stretch_requirements_file: + stretch_requirements = stretch_requirements_file.read().splitlines()[::-1] with open("requirements-site.txt") as docs_requirements_file: docs_requirements = docs_requirements_file.read().splitlines()[::-1] +with open("requirements-translation.txt") as translate_requirements_file: + translate_requirements = translate_requirements_file.read().splitlines()[::-1] + with open("requirements-dev.txt") as dev_requirements_file: dev_requirements = dev_requirements_file.read().splitlines()[::-1] EXTRA_DEPENDENCIES = { - "extra": extra_requirements, + "harmony": stretch_requirements + translate_requirements, + "dev": dev_requirements + stretch_requirements + translate_requirements + docs_requirements, "docs": docs_requirements, - "dev": extra_requirements + dev_requirements, + "stretch": stretch_requirements, + "translation": translate_requirements, } setup(name="subaligner", diff --git a/site/source/installation.rst b/site/source/installation.rst index 490e9da..612f982 100644 --- a/site/source/installation.rst +++ b/site/source/installation.rst @@ -5,11 +5,10 @@ Installation **Install necessary dependencies**:: $ apt-get install ffmpeg - $ apt-get install espeak libespeak1 libespeak-dev espeak-data **or**:: - $ brew install ffmpeg espeak + $ brew install ffmpeg ยง You may also need to install `HomeBrew `_. @@ -18,24 +17,41 @@ Installation $ pip install -U pip $ pip install subaligner -**Install Subaligner via pipx**:: +**Install dependencies for enabling translation**:: - $ pip install -U pip pipx - $ pipx install subaligner + $ pip install 'subaligner[translation]' -**Install from GitHub via Pipenv**:: +**Install additional required dependencies before installing subaligner[stretch] or subaligner[dev]**:: - ... - [packages] - subaligner = {git = "ssh://git@github.com/baxtree/subaligner.git", ref = ""} - ... + $ apt-get install espeak libespeak1 libespeak-dev espeak-data -**Install dependencies for enabling extra features:: +**or**:: + + $ brew install espeak - $ pip install subaligner[extra] +**Install dependencies for enabling forced alignment**:: + + $ pip install 'subaligner[stretch]' **Install dependencies for enabling the development environment**:: - $ pip install subaligner[dev] + + $ pip install 'subaligner[dev]' + +**Install all supported features**:: + + $ pip install 'subaligner[harmony]' + +**Install Subaligner via pipx**:: + + $ pipx install subaligner + $ pipx install 'subaligner[stretch]' + $ pipx install 'subaligner[dev]' + +**Install from GitHub via Pipenv**:: + + $ pipenv install subaligner + $ pipenv install 'subaligner[stretch]' + $ pipenv install 'subaligner[dev]' **Use dockerised installation**:: diff --git a/site/source/usage.rst b/site/source/usage.rst index 5e1dd2f..45b453f 100644 --- a/site/source/usage.rst +++ b/site/source/usage.rst @@ -61,15 +61,16 @@ Make sure you have got the virtual environment activated upfront. $ python -m subaligner.subaligner_1pass -v video.mp4 -s subtitle.srt $ python -m subaligner.subaligner_2pass -v video.mp4 -s subtitle.srt -Currently the stretching is experimental and make sure subaligner[extra] is installed before switching it on as shown below. +Currently the stretching is experimental and make sure subaligner[stretch] is installed before switching it on with `-so` +or `--stretch_on` as shown below. -**Use flag "-so" to switch on stretching when aligning subtitles**:: +**Switch on stretching when aligning subtitles**:: (.venv) $ subaligner_2pass -v video.mp4 -s subtitle.srt -so or (.venv) $ subaligner -m dual -v video.mp4 -s subtitle.srt -so -**Use flag "-o" to save the aligned subtitle to a specific location**:: +**Save the aligned subtitle to a specific location**:: (.venv) $ subaligner_2pass -v video.mp4 -s subtitle.srt -o /path/to/the/output/subtitle.srt or diff --git a/subaligner/__main__.py b/subaligner/__main__.py index e0f6741..803afb9 100755 --- a/subaligner/__main__.py +++ b/subaligner/__main__.py @@ -40,16 +40,17 @@ import traceback import os import tempfile +import pkg_resources def main(): if sys.version_info.major != 3: - print("Cannot find Python 3") + print("ERROR: Cannot find Python 3") sys.exit(20) try: import subaligner except ModuleNotFoundError: - print("Subaligner is not installed") + print("ERROR: Subaligner is not installed") sys.exit(20) from subaligner._version import __version__ @@ -139,25 +140,33 @@ def main(): print("\n".join(Utils.get_language_table())) sys.exit(0) if FLAGS.mode == "": - print("--mode was not passed in") + print("ERROR: --mode was not passed in") parser.print_usage() sys.exit(21) if FLAGS.video_path == "": - print("--video_path was not passed in") + print("ERROR: --video_path was not passed in") parser.print_usage() sys.exit(21) if FLAGS.subtitle_path == "": - print("--subtitle_path was not passed in") + print("ERROR: --subtitle_path was not passed in") parser.print_usage() sys.exit(21) if FLAGS.subtitle_path.lower().startswith("http") and FLAGS.output == "": - print("--output was not passed in for alignment on a remote subtitle file") + print("ERROR: --output was not passed in for alignment on a remote subtitle file") parser.print_usage() sys.exit(21) if FLAGS.subtitle_path.lower().startswith("teletext:") and FLAGS.output == "": - print("--output was not passed in for alignment on embedded subtitles") + print("ERROR: --output was not passed in for alignment on embedded subtitles") parser.print_usage() sys.exit(21) + if FLAGS.translate is not None: + if "transformers" not in {pkg.key for pkg in pkg_resources.working_set}: + print('ERROR: Alignment has been configured to perform translation. Please install "subaligner[translation]" and run your command again.') + sys.exit(21) + if FLAGS.stretch_on: + if "aeneas" not in {pkg.key for pkg in pkg_resources.working_set}: + print('ERROR: Alignment has been configured to use extra features. Please install "subaligner[stretch]" and run your command again.') + sys.exit(21) local_video_path = FLAGS.video_path local_subtitle_path = FLAGS.subtitle_path @@ -169,7 +178,6 @@ def main(): Logger.VERBOSE = FLAGS.debug Logger.QUIET = FLAGS.quiet from subaligner.predictor import Predictor - from subaligner.translator import Translator from subaligner.exception import UnsupportedFormatException from subaligner.exception import TerminalException @@ -198,7 +206,7 @@ def main(): elif "stream_index" in params: Utils.extract_matroska_subtitle(local_video_path, int(params["stream_index"]), local_subtitle_path) else: - print("Embedded subtitle selector cannot be empty") + print("ERROR: Embedded subtitle selector cannot be empty") parser.print_usage() sys.exit(21) @@ -223,6 +231,7 @@ def main(): FLAGS.subtitle_path.rsplit(".", 1)).replace(".stl", ".srt") if FLAGS.output == "" else FLAGS.output if FLAGS.translate is not None: + from subaligner.translator import Translator source, target = FLAGS.translate.split(",") translator = Translator(source, target) aligned_subs = translator.translate(aligned_subs) @@ -233,7 +242,7 @@ def main(): log_loss = predictor.get_log_loss(voice_probabilities, aligned_subs) if log_loss is None or log_loss > FLAGS.max_logloss: print( - "Alignment failed with a too high loss value: {}".format(log_loss) + "ERROR: Alignment failed with a too high loss value: {}".format(log_loss) ) _remove_tmp_files(FLAGS, local_video_path, local_subtitle_path) sys.exit(22) @@ -241,21 +250,21 @@ def main(): print("Aligned subtitle saved to: {}".format(aligned_subtitle_path)) except UnsupportedFormatException as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) _remove_tmp_files(FLAGS, local_video_path, local_subtitle_path) sys.exit(23) except TerminalException as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) _remove_tmp_files(FLAGS, local_video_path, local_subtitle_path) sys.exit(24) except Exception as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) _remove_tmp_files(FLAGS, local_video_path, local_subtitle_path) diff --git a/subaligner/_version.py b/subaligner/_version.py index faeac7d..b9ad356 100644 --- a/subaligner/_version.py +++ b/subaligner/_version.py @@ -1,2 +1,2 @@ """The semver for the current release.""" -__version__ = "0.1.16" +__version__ = "0.1.17" diff --git a/subaligner/exception.py b/subaligner/exception.py index 64e484d..7e0acc3 100644 --- a/subaligner/exception.py +++ b/subaligner/exception.py @@ -8,7 +8,3 @@ class TerminalException(Exception): class NoFrameRateException(Exception): """ An exception raised due to frame rate not found.""" - - -class DependencyMissingException(Exception): - """ An exception raised due to missing dependencies.""" diff --git a/subaligner/predictor.py b/subaligner/predictor.py index b6306da..d3ea1f6 100644 --- a/subaligner/predictor.py +++ b/subaligner/predictor.py @@ -458,9 +458,6 @@ def __initialise_network(self, weights_dir: str) -> None: self.__network = Network.get_from_model(model_path, hyperparams) def __adjust_durations(self, subs: List[SubRipItem], audio_file_path: str, stretch_in_lang: str) -> List[SubRipItem]: - if "aeneas" not in {pkg.key for pkg in pkg_resources.working_set}: - raise DependencyMissingException('Alignment has been configured to use extra features. Please install "subaligner[extra]" and try again.') - from aeneas.executetask import ExecuteTask from aeneas.task import Task from aeneas.runtimeconfiguration import RuntimeConfiguration @@ -613,7 +610,7 @@ def __predict( else: if os.path.exists(audio_file_path): os.remove(audio_file_path) - raise TerminalException("Error: No subtitles passed in") + raise TerminalException("ERROR: No subtitles passed in") with self.__lock: try: train_data, labels = self.__feature_embedder.extract_data_and_label_from_audio( @@ -652,7 +649,7 @@ def __predict( if os.path.exists(audio_file_path): os.remove(audio_file_path) raise TerminalException( - "Error: Audio is too short and no voice was detected" + "ERROR: Audio is too short and no voice was detected" ) result["time_predictions"] = str(datetime.datetime.now() - pred_start) @@ -685,7 +682,7 @@ def __predict( else: if os.path.exists(audio_file_path): os.remove(audio_file_path) - raise ValueError("Error: No subtitles passed in") + raise ValueError("ERROR: No subtitles passed in") if abs(seconds_to_shift) > Predictor.__MAX_SHIFT_IN_SECS: if os.path.exists(audio_file_path): diff --git a/subaligner/subaligner_1pass/__main__.py b/subaligner/subaligner_1pass/__main__.py index 9fbec7c..48dbcef 100755 --- a/subaligner/subaligner_1pass/__main__.py +++ b/subaligner/subaligner_1pass/__main__.py @@ -31,16 +31,17 @@ import traceback import os import tempfile +import pkg_resources def main(): if sys.version_info.major != 3: - print("Cannot find Python 3") + print("ERROR: Cannot find Python 3") sys.exit(20) try: import subaligner except ModuleNotFoundError: - print("Subaligner is not installed") + print("ERROR: Subaligner is not installed") sys.exit(20) from subaligner._version import __version__ @@ -102,21 +103,25 @@ def main(): print("\n".join(Utils.get_language_table())) sys.exit(0) if FLAGS.video_path == "": - print("--video_path was not passed in") + print("ERROR: --video_path was not passed in") parser.print_usage() sys.exit(21) if FLAGS.subtitle_path == "": - print("--subtitle_path was not passed in") + print("ERROR: --subtitle_path was not passed in") parser.print_usage() sys.exit(21) if FLAGS.subtitle_path.lower().startswith("http") and FLAGS.output == "": - print("--output was not passed in for alignment on a remote subtitle file") + print("ERROR: --output was not passed in for alignment on a remote subtitle file") parser.print_usage() sys.exit(21) if FLAGS.subtitle_path.lower().startswith("teletext:") and FLAGS.output == "": - print("--output was not passed in for alignment on embedded subtitles") + print("ERROR: --output was not passed in for alignment on embedded subtitles") parser.print_usage() sys.exit(21) + if FLAGS.translate is not None: + if "transformers" not in {pkg.key for pkg in pkg_resources.working_set}: + print('ERROR: Alignment has been configured to perform translation. Please install "subaligner[translation]" and run your command again.') + sys.exit(21) local_video_path = FLAGS.video_path local_subtitle_path = FLAGS.subtitle_path @@ -125,7 +130,6 @@ def main(): Logger.VERBOSE = FLAGS.debug Logger.QUIET = FLAGS.quiet from subaligner.predictor import Predictor - from subaligner.translator import Translator from subaligner.exception import UnsupportedFormatException from subaligner.exception import TerminalException @@ -154,7 +158,7 @@ def main(): elif "stream_index" in params: Utils.extract_matroska_subtitle(local_video_path, int(params["stream_index"]), local_subtitle_path) else: - print("Embedded subtitle selector cannot be empty") + print("ERROR: Embedded subtitle selector cannot be empty") parser.print_usage() sys.exit(21) @@ -169,6 +173,7 @@ def main(): FLAGS.subtitle_path.rsplit(".", 1)).replace(".stl", ".srt") if FLAGS.output == "" else FLAGS.output if FLAGS.translate is not None: + from subaligner.translator import Translator source, target = FLAGS.translate.split(",") translator = Translator(source, target) subs = translator.translate(subs) @@ -179,7 +184,7 @@ def main(): log_loss = predictor.get_log_loss(voice_probabilities, subs) if log_loss is None or log_loss > FLAGS.max_logloss: print( - "Alignment failed with a too high loss value: {}".format(log_loss) + "ERROR: Alignment failed with a too high loss value: {}".format(log_loss) ) _remove_tmp_files(FLAGS, local_video_path, local_subtitle_path) sys.exit(22) @@ -187,21 +192,21 @@ def main(): print("Aligned subtitle saved to: {}".format(aligned_subtitle_path)) except UnsupportedFormatException as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) _remove_tmp_files(FLAGS, local_video_path, local_subtitle_path) sys.exit(23) except TerminalException as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) _remove_tmp_files(FLAGS, local_video_path, local_subtitle_path) sys.exit(24) except Exception as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) _remove_tmp_files(FLAGS, local_video_path, local_subtitle_path) diff --git a/subaligner/subaligner_2pass/__main__.py b/subaligner/subaligner_2pass/__main__.py index 5b152b0..d929684 100755 --- a/subaligner/subaligner_2pass/__main__.py +++ b/subaligner/subaligner_2pass/__main__.py @@ -38,16 +38,17 @@ import traceback import os import tempfile +import pkg_resources def main(): if sys.version_info.major != 3: - print("Cannot find Python 3") + print("ERROR: Cannot find Python 3") sys.exit(20) try: import subaligner except ModuleNotFoundError: - print("Subaligner is not installed") + print("ERROR: Subaligner is not installed") sys.exit(20) from subaligner._version import __version__ @@ -129,21 +130,29 @@ def main(): print("\n".join(Utils.get_language_table())) sys.exit(0) if FLAGS.video_path == "": - print("--video_path was not passed in") + print("ERROR: --video_path was not passed in") parser.print_usage() sys.exit(21) if FLAGS.subtitle_path == "": - print("--subtitle_path was not passed in") + print("ERROR: --subtitle_path was not passed in") parser.print_usage() sys.exit(21) if FLAGS.subtitle_path.lower().startswith("http") and FLAGS.output == "": - print("--output was not passed in for alignment on a remote subtitle file") + print("ERROR: --output was not passed in for alignment on a remote subtitle file") parser.print_usage() sys.exit(21) if FLAGS.subtitle_path.lower().startswith("teletext:") and FLAGS.output == "": - print("--output was not passed in for alignment on embedded subtitles") + print("ERROR: --output was not passed in for alignment on embedded subtitles") parser.print_usage() sys.exit(21) + if FLAGS.translate is not None: + if "transformers" not in {pkg.key for pkg in pkg_resources.working_set}: + print('ERROR: Alignment has been configured to perform translation. Please install "subaligner[translation]" and run your command again.') + sys.exit(21) + if FLAGS.stretch_on: + if "aeneas" not in {pkg.key for pkg in pkg_resources.working_set}: + print('ERROR: Alignment has been configured to use extra features. Please install "subaligner[stretch]" and run your command again.') + sys.exit(21) local_video_path = FLAGS.video_path local_subtitle_path = FLAGS.subtitle_path @@ -155,7 +164,6 @@ def main(): Logger.VERBOSE = FLAGS.debug Logger.QUIET = FLAGS.quiet from subaligner.predictor import Predictor - from subaligner.translator import Translator from subaligner.exception import UnsupportedFormatException from subaligner.exception import TerminalException @@ -184,7 +192,7 @@ def main(): elif "stream_index" in params: Utils.extract_matroska_subtitle(local_video_path, int(params["stream_index"]), local_subtitle_path) else: - print("Embedded subtitle selector cannot be empty") + print("ERROR: Embedded subtitle selector cannot be empty") parser.print_usage() sys.exit(21) @@ -202,6 +210,7 @@ def main(): FLAGS.subtitle_path.rsplit(".", 1)).replace(".stl", ".srt") if FLAGS.output == "" else FLAGS.output if FLAGS.translate is not None: + from subaligner.translator import Translator source, target = FLAGS.translate.split(",") translator = Translator(source, target) subs_list = translator.translate(subs) @@ -212,7 +221,7 @@ def main(): log_loss = predictor.get_log_loss(voice_probabilities, subs_list) if log_loss is None or log_loss > FLAGS.max_logloss: print( - "Alignment failed with a too high loss value: {}".format(log_loss) + "ERROR: Alignment failed with a too high loss value: {}".format(log_loss) ) _remove_tmp_files(FLAGS, local_video_path, local_subtitle_path) sys.exit(22) @@ -220,21 +229,21 @@ def main(): print("Aligned subtitle saved to: {}".format(aligned_subtitle_path)) except UnsupportedFormatException as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) _remove_tmp_files(FLAGS, local_video_path, local_subtitle_path) sys.exit(23) except TerminalException as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) _remove_tmp_files(FLAGS, local_video_path, local_subtitle_path) sys.exit(24) except Exception as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) _remove_tmp_files(FLAGS, local_video_path, local_subtitle_path) diff --git a/subaligner/subaligner_batch/__main__.py b/subaligner/subaligner_batch/__main__.py index e3db6ad..92f16b7 100755 --- a/subaligner/subaligner_batch/__main__.py +++ b/subaligner/subaligner_batch/__main__.py @@ -42,16 +42,17 @@ import sys import traceback import os +import pkg_resources def main(): if sys.version_info.major != 3: - print("Cannot find Python 3") + print("ERROR: Cannot find Python 3") sys.exit(20) try: import subaligner except ModuleNotFoundError: - print("Subaligner is not installed") + print("ERROR: Subaligner is not installed") sys.exit(20) from subaligner._version import __version__ @@ -142,32 +143,36 @@ def main(): print("\n".join(Utils.get_language_table())) sys.exit(0) if FLAGS.mode == "": - print("--mode was not passed in") + print("ERROR: --mode was not passed in") parser.print_usage() sys.exit(21) if FLAGS.video_directory == "": - print("--video_directory was not passed in") + print("ERROR: --video_directory was not passed in") parser.print_usage() sys.exit(21) if FLAGS.subtitle_directory == "": - print("--subtitle_directory was not passed in") + print("ERROR: --subtitle_directory was not passed in") parser.print_usage() sys.exit(21) if FLAGS.output_directory == "": - print("--output_directory was not passed in") + print("ERROR: --output_directory was not passed in") parser.print_usage() sys.exit(21) if os.path.abspath(FLAGS.subtitle_directory) == os.path.abspath(FLAGS.output_directory): - print("The output directory cannot be set to the same as the input subtitle directory") + print("ERROR: The output directory cannot be set to the same as the input subtitle directory") parser.print_usage() sys.exit(21) + if FLAGS.translate is not None: + if "transformers" not in {pkg.key for pkg in pkg_resources.working_set}: + print('ERROR: Alignment has been configured to perform translation. Please install "subaligner[translation]" and run your command again.') + sys.exit(21) video_file_paths = [os.path.abspath(os.path.join(path, p)) for path, _, files in os.walk(FLAGS.video_directory) for p in files if not p.startswith(".")] subtitle_file_paths = [os.path.abspath(os.path.join(path, p)) for path, _, files in os.walk(FLAGS.subtitle_directory) for p in files if not p.startswith(".")] if len(video_file_paths) != len(subtitle_file_paths): - print("The numbers of input videos and subtitles do not match") + print("ERROR: The numbers of input videos and subtitles do not match") parser.print_usage() sys.exit(21) @@ -183,7 +188,6 @@ def main(): Logger.VERBOSE = FLAGS.debug Logger.QUIET = FLAGS.quiet from subaligner.predictor import Predictor - from subaligner.translator import Translator from subaligner.subtitle import Subtitle from subaligner.exception import UnsupportedFormatException from subaligner.exception import TerminalException @@ -216,6 +220,7 @@ def main(): ".".join(os.path.basename(local_subtitle_path).rsplit(".", 1)).replace(".stl", ".srt"))) if FLAGS.translate is not None: + from subaligner.translator import Translator source, target = FLAGS.translate.split(",") translator = Translator(source, target) aligned_subs = translator.translate(aligned_subs) @@ -226,7 +231,7 @@ def main(): log_loss = predictor.get_log_loss(voice_probabilities, aligned_subs) if log_loss is None or log_loss > FLAGS.max_logloss: print( - "Alignment failed with a too high loss value: {} for {} and {}".format(log_loss, local_video_path, local_subtitle_path) + "ERROR: Alignment failed with a too high loss value: {} for {} and {}".format(log_loss, local_video_path, local_subtitle_path) ) failures.append((local_video_path, local_subtitle_path)) continue @@ -234,21 +239,21 @@ def main(): print("Aligned subtitle saved to: {}".format(aligned_subtitle_path)) except UnsupportedFormatException as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) failures.append((local_video_path, local_subtitle_path)) continue except TerminalException as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) failures.append((local_video_path, local_subtitle_path)) continue except Exception as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) failures.append((local_video_path, local_subtitle_path)) diff --git a/subaligner/subaligner_convert/__main__.py b/subaligner/subaligner_convert/__main__.py index b0dd741..a720d27 100755 --- a/subaligner/subaligner_convert/__main__.py +++ b/subaligner/subaligner_convert/__main__.py @@ -27,17 +27,18 @@ import sys import tempfile import traceback +import pkg_resources def main(): if sys.version_info.major != 3: - print("Cannot find Python 3") + print("ERROR: Cannot find Python 3") sys.exit(20) try: import subaligner del subaligner except ModuleNotFoundError: - print("Subaligner is not installed") + print("ERROR: Subaligner is not installed") sys.exit(20) from subaligner._version import __version__ @@ -85,17 +86,21 @@ def main(): print("\n".join(Utils.get_language_table())) sys.exit(0) if FLAGS.input_subtitle_path == "": - print("--input_subtitle_path was not passed in") + print("ERROR: --input_subtitle_path was not passed in") parser.print_usage() sys.exit(21) if FLAGS.output_subtitle_path == "": - print("--output_subtitle_path was not passed in") + print("ERROR: --output_subtitle_path was not passed in") parser.print_usage() sys.exit(21) if FLAGS.output_subtitle_path.endswith(".sub") and FLAGS.frame_rate is None: - print("--frame_rate was not passed in for conversion to MicroDVD") + print("ERROR: --frame_rate was not passed in for conversion to MicroDVD") parser.print_usage() sys.exit(21) + if FLAGS.translate is not None: + if "transformers" not in {pkg.key for pkg in pkg_resources.working_set}: + print('ERROR: Alignment has been configured to perform translation. Please install "subaligner[translation]" and run your command again.') + sys.exit(21) local_subtitle_path = FLAGS.input_subtitle_path @@ -103,7 +108,6 @@ def main(): Logger.VERBOSE = FLAGS.debug Logger.QUIET = FLAGS.quiet from subaligner.subtitle import Subtitle - from subaligner.translator import Translator from subaligner.exception import UnsupportedFormatException, TerminalException try: @@ -116,6 +120,7 @@ def main(): subtitle = Subtitle.load(local_subtitle_path) if FLAGS.translate is not None: + from subaligner.translator import Translator source, target = FLAGS.translate.split(",") translator = Translator(source, target) subs_list = translator.translate(subtitle.subs) @@ -127,21 +132,21 @@ def main(): print("Subtitle converted and saved to: {}".format(FLAGS.output_subtitle_path)) except UnsupportedFormatException as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) _remove_tmp_files(FLAGS, local_subtitle_path) sys.exit(23) except TerminalException as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) _remove_tmp_files(FLAGS, local_subtitle_path) sys.exit(24) except Exception as e: print( - "{}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") + "ERROR: {}\n{}".format(str(e), "".join(traceback.format_stack()) if FLAGS.debug else "") ) traceback.print_tb(e.__traceback__) _remove_tmp_files(FLAGS, local_subtitle_path) diff --git a/subaligner/subaligner_train/__main__.py b/subaligner/subaligner_train/__main__.py index 7b25043..546e93d 100755 --- a/subaligner/subaligner_train/__main__.py +++ b/subaligner/subaligner_train/__main__.py @@ -62,13 +62,13 @@ def main(): if sys.version_info.major != 3: - print("Cannot find Python 3") + print("ERROR: Cannot find Python 3") sys.exit(20) try: import subaligner del subaligner except ModuleNotFoundError: - print("Subaligner is not installed") + print("ERROR: Subaligner is not installed") sys.exit(20) from subaligner._version import __version__ @@ -208,11 +208,11 @@ def main(): FLAGS, unparsed = parser.parse_known_args() if FLAGS.training_output_directory == "": - print("--training_output_directory was not passed in") + print("ERROR: --training_output_directory was not passed in") parser.print_usage() sys.exit(21) if FLAGS.sound_effect_end_marker is not None and FLAGS.sound_effect_start_marker is None: - print("--sound_effect_start_marker was not passed in when --sound_effect_end_marker was in use") + print("ERROR: --sound_effect_start_marker was not passed in when --sound_effect_end_marker was in use") parser.print_usage() sys.exit(21) @@ -244,11 +244,11 @@ def main(): video_file_paths = subtitle_file_paths = None if not FLAGS.resume: if FLAGS.video_directory == "": - print("--video_directory was not passed in") + print("ERROR: --video_directory was not passed in") parser.print_usage() sys.exit(21) if FLAGS.subtitle_directory == "": - print("--subtitle_directory was not passed in") + print("ERROR: --subtitle_directory was not passed in") parser.print_usage() sys.exit(21) video_file_paths = [os.path.abspath(os.path.join(path, p)) for path, _, files in @@ -288,19 +288,19 @@ def main(): FLAGS.sound_effect_end_marker) except UnsupportedFormatException as e: print( - "{}\n{}".format(str(e), traceback.format_stack() if verbose else "") + "ERROR: {}\n{}".format(str(e), traceback.format_stack() if verbose else "") ) traceback.print_tb(e.__traceback__) sys.exit(23) except TerminalException as e: print( - "{}\n{}".format(str(e), traceback.format_stack() if verbose else "") + "ERROR: {}\n{}".format(str(e), traceback.format_stack() if verbose else "") ) traceback.print_tb(e.__traceback__) sys.exit(24) except Exception as e: print( - "{}\n{}".format(str(e), traceback.format_stack() if verbose else "") + "ERROR: {}\n{}".format(str(e), traceback.format_stack() if verbose else "") ) traceback.print_tb(e.__traceback__) sys.exit(1) diff --git a/subaligner/subaligner_tune/__main__.py b/subaligner/subaligner_tune/__main__.py index ee124d5..fc49959 100755 --- a/subaligner/subaligner_tune/__main__.py +++ b/subaligner/subaligner_tune/__main__.py @@ -35,13 +35,13 @@ def main(): if sys.version_info.major != 3: - print("Cannot find Python 3") + print("ERROR: Cannot find Python 3") sys.exit(20) try: import subaligner del subaligner except ModuleNotFoundError: - print("Subaligner is not installed") + print("ERROR: Subaligner is not installed") sys.exit(20) from subaligner._version import __version__ @@ -103,15 +103,15 @@ def main(): FLAGS, unparsed = parser.parse_known_args() if FLAGS.video_directory == "": - print("--video_directory was not passed in") + print("ERROR: --video_directory was not passed in") parser.print_usage() sys.exit(21) if FLAGS.subtitle_directory == "": - print("--subtitle_directory was not passed in") + print("ERROR: --subtitle_directory was not passed in") parser.print_usage() sys.exit(21) if FLAGS.training_output_directory == "": - print("--training_output_directory was not passed in") + print("ERROR: --training_output_directory was not passed in") parser.print_usage() sys.exit(21) @@ -144,17 +144,17 @@ def main(): print(hparam_tuner.hyperparameters.to_json()) except UnsupportedFormatException as e: print( - "{}\n{}".format(str(e), traceback.format_stack() if verbose else "") + "ERROR: {}\n{}".format(str(e), traceback.format_stack() if verbose else "") ) sys.exit(23) except TerminalException as e: print( - "{}\n{}".format(str(e), traceback.format_stack() if verbose else "") + "ERROR: {}\n{}".format(str(e), traceback.format_stack() if verbose else "") ) sys.exit(24) except Exception as e: print( - "{}\n{}".format(str(e), traceback.format_stack() if verbose else "") + "ERROR: {}\n{}".format(str(e), traceback.format_stack() if verbose else "") ) sys.exit(1) else: diff --git a/subaligner/translator.py b/subaligner/translator.py index 645101f..10e2eb8 100644 --- a/subaligner/translator.py +++ b/subaligner/translator.py @@ -8,6 +8,7 @@ from typing import List, Generator from .singleton import Singleton from .logger import Logger +from .exception import DependencyMissingException class Translator(Singleton): @@ -56,6 +57,7 @@ def __init__(self, src_language, tgt_language) -> None: Raises: NotImplementedError -- Thrown when the model of the specified language pair is not found. """ + self.__initialise_model(src_language, tgt_language) @staticmethod