diff --git a/.github/workflows/aux_tests.yml b/.github/workflows/aux_tests.yml index d5fe1bb3..59ba572d 100644 --- a/.github/workflows/aux_tests.yml +++ b/.github/workflows/aux_tests.yml @@ -22,25 +22,22 @@ jobs: experimental: [false] steps: - uses: actions/checkout@v2 - - uses: actions/cache@v1 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('**/setup.py') }} - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: coqui-ai/setup-python@pip-cache-key-py-ver with: python-version: ${{ matrix.python-version }} architecture: x64 + cache: 'pip' + cache-dependency-path: 'requirements*' - name: check OS run: cat /etc/os-release - name: Install dependencies run: | - sudo apt update - sudo apt install -y git make - sudo apt install -y python3-wheel gcc + sudo apt-get update + sudo apt-get install -y git make gcc make system-deps - - name: Upgrade pip - run: python3 -m pip install --upgrade pip + - name: Install/upgrade Python setup deps + run: python3 -m pip install --upgrade pip setuptools wheel - name: Install TTS run: | python3 -m pip install .[all] diff --git a/.github/workflows/pypi-release.yml b/.github/workflows/pypi-release.yml index d31e71cf..02faa7f6 100644 --- a/.github/workflows/pypi-release.yml +++ b/.github/workflows/pypi-release.yml @@ -7,7 +7,7 @@ defaults: shell: bash jobs: - build-package: + build-sdist: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 @@ -23,10 +23,63 @@ jobs: with: python-version: 3.8 - run: | - python -m pip install -U pip setuptools twine toml - python -c 'import toml; c = toml.load("pyproject.toml"); print("\n".join(c["build-system"]["requires"]))' | pip install -r /dev/stdin + python -m pip install -U pip setuptools wheel build - run: | - python setup.py sdist + python -m build + - run: | + pip install dist/*.tar.gz + - uses: actions/upload-artifact@v2 + with: + name: sdist + path: dist/*.tar.gz + build-wheels: + runs-on: ubuntu-20.04 + strategy: + matrix: + python-version: ["3.6", "3.7", "3.8", "3.9"] + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - run: | + python -m pip install -U pip setuptools wheel build + - run: | + python -m build + - run: | + python -m pip install dist/*.whl + - uses: actions/upload-artifact@v2 + with: + name: wheel-${{ matrix.python-version }} + path: dist/*.whl + publish-artifacts: + runs-on: ubuntu-20.04 + needs: [build-sdist, build-wheels] + steps: + - run: | + mkdir dist + - uses: actions/download-artifact@v2 + with: + name: "sdist" + path: "dist/" + - uses: actions/download-artifact@v2 + with: + name: "wheel-3.6" + path: "dist/" + - uses: actions/download-artifact@v2 + with: + name: "wheel-3.7" + path: "dist/" + - uses: actions/download-artifact@v2 + with: + name: "wheel-3.8" + path: "dist/" + - uses: actions/download-artifact@v2 + with: + name: "wheel-3.9" + path: "dist/" + - run: | + ls -lh dist/ - name: Setup PyPI config run: | cat << EOF > ~/.pypirc @@ -34,5 +87,10 @@ jobs: username=__token__ password=${{ secrets.PYPI_TOKEN }} EOF + - uses: actions/setup-python@v2 + with: + python-version: 3.8 - run: | - twine upload --repository pypi dist/*.tar.gz + python -m pip install twine + - run: | + twine upload --repository pypi dist/* diff --git a/.github/workflows/style_check.yml b/.github/workflows/style_check.yml index 4a30c26d..8d1e1af4 100644 --- a/.github/workflows/style_check.yml +++ b/.github/workflows/style_check.yml @@ -22,25 +22,22 @@ jobs: experimental: [false] steps: - uses: actions/checkout@v2 - - uses: actions/cache@v1 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('**/setup.py') }} - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: coqui-ai/setup-python@pip-cache-key-py-ver with: python-version: ${{ matrix.python-version }} architecture: x64 + cache: 'pip' + cache-dependency-path: 'requirements*' - name: check OS run: cat /etc/os-release - name: Install dependencies run: | - sudo apt update - sudo apt install -y git make - sudo apt install -y python3-wheel gcc + sudo apt-get update + sudo apt-get install -y git make gcc make system-deps - - name: Upgrade pip - run: python3 -m pip install --upgrade pip + - name: Install/upgrade Python setup deps + run: python3 -m pip install --upgrade pip setuptools wheel - name: Install TTS run: | python3 -m pip install .[all] diff --git a/.github/workflows/tts_tests.yml b/.github/workflows/tts_tests.yml index d05dca90..e352a117 100644 --- a/.github/workflows/tts_tests.yml +++ b/.github/workflows/tts_tests.yml @@ -22,25 +22,22 @@ jobs: experimental: [false] steps: - uses: actions/checkout@v2 - - uses: actions/cache@v1 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('**/setup.py') }} - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: coqui-ai/setup-python@pip-cache-key-py-ver with: python-version: ${{ matrix.python-version }} architecture: x64 + cache: 'pip' + cache-dependency-path: 'requirements*' - name: check OS run: cat /etc/os-release - name: Install dependencies run: | - sudo apt update - sudo apt install -y git make - sudo apt install -y python3-wheel gcc + sudo apt-get update + sudo apt-get install -y --no-install-recommends git make gcc make system-deps - - name: Upgrade pip - run: python3 -m pip install --upgrade pip + - name: Install/upgrade Python setup deps + run: python3 -m pip install --upgrade pip setuptools wheel - name: Install TTS run: | python3 -m pip install .[all] diff --git a/.github/workflows/vocoder_tests.yml b/.github/workflows/vocoder_tests.yml index 69e74dbf..24ae9e3f 100644 --- a/.github/workflows/vocoder_tests.yml +++ b/.github/workflows/vocoder_tests.yml @@ -22,25 +22,22 @@ jobs: experimental: [false] steps: - uses: actions/checkout@v2 - - uses: actions/cache@v1 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('**/setup.py') }} - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: coqui-ai/setup-python@pip-cache-key-py-ver with: python-version: ${{ matrix.python-version }} architecture: x64 + cache: 'pip' + cache-dependency-path: 'requirements*' - name: check OS run: cat /etc/os-release - name: Install dependencies run: | - sudo apt update - sudo apt install -y git make - sudo apt install -y python3-wheel gcc + sudo apt-get update + sudo apt-get install -y git make gcc make system-deps - - name: Upgrade pip - run: python3 -m pip install --upgrade pip + - name: Install/upgrade Python setup deps + run: python3 -m pip install --upgrade pip setuptools wheel - name: Install TTS run: | python3 -m pip install .[all] diff --git a/.github/workflows/zoo_tests.yml b/.github/workflows/zoo_tests.yml index 0dc4457b..f973dd0e 100644 --- a/.github/workflows/zoo_tests.yml +++ b/.github/workflows/zoo_tests.yml @@ -22,25 +22,22 @@ jobs: experimental: [false] steps: - uses: actions/checkout@v2 - - uses: actions/cache@v1 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('**/setup.py') }} - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: coqui-ai/setup-python@pip-cache-key-py-ver with: python-version: ${{ matrix.python-version }} architecture: x64 + cache: 'pip' + cache-dependency-path: 'requirements*' - name: check OS run: cat /etc/os-release - name: Install dependencies run: | - sudo apt update - sudo apt install -y git make - sudo apt install -y python3-wheel gcc + sudo apt-get update + sudo apt-get install -y git make gcc make system-deps - - name: Upgrade pip - run: python3 -m pip install --upgrade pip + - name: Install/upgrade Python setup deps + run: python3 -m pip install --upgrade pip setuptools wheel - name: Install TTS run: | python3 -m pip install .[all] diff --git a/README.md b/README.md index fd9cd27c..4686ac67 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # 🐸TTS is a library for advanced Text-to-Speech generation. It's built on the latest research, was designed to achieve the best trade-off among ease-of-training, speed and quality. -🐸TTS comes with [pretrained models](https://github.com/coqui-ai/TTS/wiki/Released-Models), tools for measuring dataset quality and already used in **20+ languages** for products and research projects. +🐸TTS comes with pretrained models, tools for measuring dataset quality and already used in **20+ languages** for products and research projects. [![GithubActions](https://github.com/coqui-ai/TTS/actions/workflows/main.yml/badge.svg)](https://github.com/coqui-ai/TTS/actions) [![PyPI version](https://badge.fury.io/py/TTS.svg)](https://badge.fury.io/py/TTS) @@ -135,6 +135,66 @@ $ make install If you are on Windows, 👑@GuyPaddock wrote installation instructions [here](https://stackoverflow.com/questions/66726331/how-can-i-run-mozilla-tts-coqui-tts-training-with-cuda-on-a-windows-system). +## Use TTS + +### Single Speaker Models + +- List provided models: + + ``` + $ tts --list_models + ``` + +- Run TTS with default models: + + ``` + $ tts --text "Text for TTS" + ``` + +- Run a TTS model with its default vocoder model: + + ``` + $ tts --text "Text for TTS" --model_name "// + ``` + +- Run with specific TTS and vocoder models from the list: + + ``` + $ tts --text "Text for TTS" --model_name "//" --vocoder_name "//" --output_path + ``` + +- Run your own TTS model (Using Griffin-Lim Vocoder): + + ``` + $ tts --text "Text for TTS" --model_path path/to/model.pth.tar --config_path path/to/config.json --out_path output/path/speech.wav + ``` + +- Run your own TTS and Vocoder models: + ``` + $ tts --text "Text for TTS" --model_path path/to/config.json --config_path path/to/model.pth.tar --out_path output/path/speech.wav + --vocoder_path path/to/vocoder.pth.tar --vocoder_config_path path/to/vocoder_config.json + ``` + +### Multi-speaker Models + +- List the available speakers and choose as among them: + + ``` + $ tts --model_name "//" --list_speaker_idxs + ``` + +- Run the multi-speaker TTS model with the target speaker ID: + + ``` + $ tts --text "Text for TTS." --out_path output/path/speech.wav --model_name "//" --speaker_idx + ``` + +- Run your own multi-speaker TTS model: + + ``` + $ tts --text "Text for TTS" --out_path output/path/speech.wav --model_path path/to/config.json --config_path path/to/model.pth.tar --speakers_file_path path/to/speaker.json --speaker_idx + ``` + ## Directory Structure ``` |- notebooks/ (Jupyter Notebooks for model evaluation, parameter selection and data analysis.) diff --git a/TTS/bin/synthesize.py b/TTS/bin/synthesize.py index fb2e41b4..bf7de798 100755 --- a/TTS/bin/synthesize.py +++ b/TTS/bin/synthesize.py @@ -23,72 +23,76 @@ def str2bool(v): def main(): - # pylint: disable=bad-option-value - parser = argparse.ArgumentParser( - description="""Synthesize speech on command line.\n\n""" - """You can either use your trained model or choose a model from the provided list.\n\n""" - """If you don't specify any models, then it uses LJSpeech based English model.\n\n""" - """ - # Example Runs: + description = """Synthesize speech on command line. - ## Single Speaker Models +You can either use your trained model or choose a model from the provided list. - - list provided models +If you don't specify any models, then it uses LJSpeech based English model. + +## Example Runs + +### Single Speaker Models + +- List provided models: ``` - $ ./TTS/bin/synthesize.py --list_models + $ tts --list_models ``` - - run tts with default models. +- Run TTS with default models: ``` - $ ./TTS/bin synthesize.py --text "Text for TTS" + $ tts --text "Text for TTS" ``` - - run a tts model with its default vocoder model. +- Run a TTS model with its default vocoder model: ``` - $ ./TTS/bin synthesize.py --text "Text for TTS" --model_name "// + $ tts --text "Text for TTS" --model_name "// ``` - - run with specific tts and vocoder models from the list +- Run with specific TTS and vocoder models from the list: ``` - $ ./TTS/bin/synthesize.py --text "Text for TTS" --model_name "//" --vocoder_name "//" --output_path + $ tts --text "Text for TTS" --model_name "//" --vocoder_name "//" --output_path ``` - - run your own TTS model (Using Griffin-Lim Vocoder) +- Run your own TTS model (Using Griffin-Lim Vocoder): ``` - $ ./TTS/bin/synthesize.py --text "Text for TTS" --model_path path/to/model.pth.tar --config_path path/to/config.json --out_path output/path/speech.wav + $ tts --text "Text for TTS" --model_path path/to/model.pth.tar --config_path path/to/config.json --out_path output/path/speech.wav ``` - - run your own TTS and Vocoder models +- Run your own TTS and Vocoder models: ``` - $ ./TTS/bin/synthesize.py --text "Text for TTS" --model_path path/to/config.json --config_path path/to/model.pth.tar --out_path output/path/speech.wav + $ tts --text "Text for TTS" --model_path path/to/config.json --config_path path/to/model.pth.tar --out_path output/path/speech.wav --vocoder_path path/to/vocoder.pth.tar --vocoder_config_path path/to/vocoder_config.json ``` - ## MULTI-SPEAKER MODELS +### Multi-speaker Models - - list the available speakers and choose as among them. +- List the available speakers and choose as among them: ``` - $ ./TTS/bin/synthesize.py --model_name "//" --list_speaker_idxs + $ tts --model_name "//" --list_speaker_idxs ``` - - run the multi-speaker TTS model with the target speaker ID. +- Run the multi-speaker TTS model with the target speaker ID: ``` - $ ./TTS/bin/synthesize.py --text "Text for TTS." --out_path output/path/speech.wav --model_name "//" --speaker_idx + $ tts --text "Text for TTS." --out_path output/path/speech.wav --model_name "//" --speaker_idx ``` - - run your own multi-speaker TTS model. +- Run your own multi-speaker TTS model: ``` - $ ./TTS/bin/synthesize.py --text "Text for TTS" --out_path output/path/speech.wav --model_path path/to/config.json --config_path path/to/model.pth.tar --speakers_file_path path/to/speaker.json --speaker_idx + $ tts --text "Text for TTS" --out_path output/path/speech.wav --model_path path/to/config.json --config_path path/to/model.pth.tar --speakers_file_path path/to/speaker.json --speaker_idx ``` - """, + """ + # We remove Markdown code formatting programmatically here to allow us to copy-and-paste from main README to keep + # documentation in sync more easily. + parser = argparse.ArgumentParser( + description=description.replace(" ```\n", ""), formatter_class=RawTextHelpFormatter, ) @@ -98,7 +102,7 @@ def main(): nargs="?", const=True, default=False, - help="list available pre-trained tts and vocoder models.", + help="list available pre-trained TTS and vocoder models.", ) parser.add_argument("--text", type=str, default=None, help="Text to generate speech.") @@ -107,7 +111,7 @@ def main(): "--model_name", type=str, default="tts_models/en/ljspeech/tacotron2-DDC", - help="Name of one of the pre-trained tts models in format //", + help="Name of one of the pre-trained TTS models in format //", ) parser.add_argument( "--vocoder_name",