diff --git a/.github/workflows/style_check.yml b/.github/workflows/style_check.yml index c913c233..a146213f 100644 --- a/.github/workflows/style_check.yml +++ b/.github/workflows/style_check.yml @@ -13,17 +13,15 @@ jobs: fail-fast: false matrix: python-version: [3.9] - experimental: [false] steps: - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + - name: Install uv + uses: astral-sh/setup-uv@v3 with: - python-version: ${{ matrix.python-version }} - architecture: x64 - cache: 'pip' - cache-dependency-path: 'requirements*' - - name: Install/upgrade dev dependencies - run: python3 -m pip install -r requirements.dev.txt + version: "0.4.27" + enable-cache: true + cache-dependency-glob: "**/pyproject.toml" + - name: Set up Python ${{ matrix.python-version }} + run: uv python install ${{ matrix.python-version }} - name: Lint check run: make lint diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cdb30ea0..be3f1b74 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,17 +16,14 @@ jobs: subset: ["data_tests", "inference_tests", "test_aux", "test_text", "test_tts", "test_tts2", "test_vocoder", "test_xtts", "test_zoo0", "test_zoo1", "test_zoo2"] steps: - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + - name: Install uv + uses: astral-sh/setup-uv@v3 with: - python-version: ${{ matrix.python-version }} - architecture: x64 - cache: 'pip' - cache-dependency-path: 'requirements*' - - name: check OS - run: cat /etc/os-release - - name: set ENV - run: export TRAINER_TELEMETRY=0 + version: "0.4.27" + enable-cache: true + cache-dependency-glob: "**/pyproject.toml" + - name: Set up Python ${{ matrix.python-version }} + run: uv python install ${{ matrix.python-version }} - name: Install Espeak if: contains(fromJSON('["inference_tests", "test_text", "test_tts", "test_tts2", "test_xtts", "test_zoo0", "test_zoo1", "test_zoo2"]'), matrix.subset) run: | @@ -37,21 +34,17 @@ jobs: sudo apt-get update sudo apt-get install -y --no-install-recommends git make gcc make system-deps - - name: Install/upgrade Python setup deps - run: python3 -m pip install --upgrade pip setuptools wheel uv - name: Replace scarf urls if: contains(fromJSON('["data_tests", "inference_tests", "test_aux", "test_tts", "test_tts2", "test_xtts", "test_zoo0", "test_zoo1", "test_zoo2"]'), matrix.subset) run: | sed -i 's/https:\/\/coqui.gateway.scarf.sh\//https:\/\/github.com\/coqui-ai\/TTS\/releases\/download\//g' TTS/.models.json - - name: Install TTS + - name: Unit tests run: | resolution=highest if [ "${{ matrix.python-version }}" == "3.9" ]; then resolution=lowest-direct fi - python3 -m uv pip install --resolution=$resolution --system "coqui-tts[dev,server,languages] @ ." - - name: Unit tests - run: make ${{ matrix.subset }} + uv run --resolution=$resolution --extra server --extra languages make ${{ matrix.subset }} - name: Upload coverage data uses: actions/upload-artifact@v4 with: @@ -65,18 +58,17 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - name: Install uv + uses: astral-sh/setup-uv@v3 with: - python-version: "3.12" + version: "0.4.27" - uses: actions/download-artifact@v4 with: pattern: coverage-data-* merge-multiple: true - name: Combine coverage run: | - python -Im pip install --upgrade coverage[toml] - - python -Im coverage combine - python -Im coverage html --skip-covered --skip-empty - - python -Im coverage report --format=markdown >> $GITHUB_STEP_SUMMARY + uv python install + uvx coverage combine + uvx coverage html --skip-covered --skip-empty + uvx coverage report --format=markdown >> $GITHUB_STEP_SUMMARY diff --git a/.gitignore b/.gitignore index f9708961..d9f99227 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +uv.lock + WadaSNR/ .idea/ *.pyc diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f96f6f38..92f6f3ab 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: "https://github.com/pre-commit/pre-commit-hooks" - rev: v4.5.0 + rev: v5.0.0 hooks: - id: check-yaml - id: end-of-file-fixer @@ -11,14 +11,7 @@ repos: - id: black language_version: python3 - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.3.0 + rev: v0.7.0 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] - - repo: local - hooks: - - id: generate_requirements.py - name: generate_requirements.py - language: system - entry: python scripts/generate_requirements.py - files: "pyproject.toml|requirements.*\\.txt|tools/generate_requirements.py" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e93858f2..d4a8cf00 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,29 +44,37 @@ If you have a new feature, a model to implement, or a bug to squash, go ahead an Please use the following steps to send a โœจ**PR**โœจ. Let us know if you encounter a problem along the way. -The following steps are tested on an Ubuntu system. +The following steps are tested on an Ubuntu system and require +[uv](https://docs.astral.sh/uv/) for virtual environment management. Choose your +preferred [installation +method](https://docs.astral.sh/uv/getting-started/installation/), e.g. the +standalone installer: + +```bash +curl -LsSf https://astral.sh/uv/install.sh | sh +``` 1. Fork ๐ŸธTTS[https://github.com/idiap/coqui-ai-TTS] by clicking the fork button at the top right corner of the project page. 2. Clone ๐ŸธTTS and add the main repo as a new remote named ```upstream```. ```bash - $ git clone git@github.com:/coqui-ai-TTS.git - $ cd coqui-ai-TTS - $ git remote add upstream https://github.com/idiap/coqui-ai-TTS.git + git clone git@github.com:/coqui-ai-TTS.git + cd coqui-ai-TTS + git remote add upstream https://github.com/idiap/coqui-ai-TTS.git ``` 3. Install ๐ŸธTTS for development. ```bash - $ make system-deps # intended to be used on Ubuntu (Debian). Let us know if you have a different OS. - $ make install_dev + make system-deps # intended to be used on Ubuntu (Debian). Let us know if you have a different OS. + make install_dev ``` 4. Create a new branch with an informative name for your goal. ```bash - $ git checkout -b an_informative_name_for_my_branch + git checkout -b an_informative_name_for_my_branch ``` 5. Implement your changes on your new branch. @@ -75,39 +83,42 @@ The following steps are tested on an Ubuntu system. 7. Add your tests to our test suite under ```tests``` folder. It is important to show that your code works, edge cases are considered, and inform others about the intended use. -8. Run the tests to see how your updates work with the rest of the project. You can repeat this step multiple times as you implement your changes to make sure you are on the right direction. +8. Run the tests to see how your updates work with the rest of the project. You + can repeat this step multiple times as you implement your changes to make + sure you are on the right direction. **NB: running all tests takes a long time, + it is better to leave this to the CI.** ```bash - $ make test # stop at the first error - $ make test_all # run all the tests, report all the errors + uv run make test # stop at the first error + uv run make test_all # run all the tests, report all the errors ``` 9. Format your code. We use ```black``` for code formatting. ```bash - $ make style + make style ``` 10. Run the linter and correct the issues raised. We use ```ruff``` for linting. It helps to enforce a coding standard, offers simple refactoring suggestions. ```bash - $ make lint + make lint ``` 11. When things are good, add new files and commit your changes. ```bash - $ git add my_file1.py my_file2.py ... - $ git commit + git add my_file1.py my_file2.py ... + git commit ``` It's a good practice to regularly sync your local copy of the project with the upstream code to keep up with the recent updates. ```bash - $ git fetch upstream - $ git rebase upstream/main + git fetch upstream + git rebase upstream/main # or for the development version - $ git rebase upstream/dev + git rebase upstream/dev ``` 12. Send a PR to ```dev``` branch. @@ -115,7 +126,7 @@ The following steps are tested on an Ubuntu system. Push your branch to your fork. ```bash - $ git push -u origin an_informative_name_for_my_branch + git push -u origin an_informative_name_for_my_branch ``` Then go to your fork's Github page and click on 'Pull request' to send your โœจ**PR**โœจ. @@ -137,9 +148,9 @@ If you prefer working within a Docker container as your development environment, 2. Clone ๐ŸธTTS and add the main repo as a new remote named ```upsteam```. ```bash - $ git clone git@github.com:/coqui-ai-TTS.git - $ cd coqui-ai-TTS - $ git remote add upstream https://github.com/idiap/coqui-ai-TTS.git + git clone git@github.com:/coqui-ai-TTS.git + cd coqui-ai-TTS + git remote add upstream https://github.com/idiap/coqui-ai-TTS.git ``` 3. Build the Docker Image as your development environment (it installs all of the dependencies for you): diff --git a/Dockerfile b/Dockerfile index 05c37d78..e9d331bc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ RUN rm -rf /root/.cache/pip WORKDIR /root COPY . /root -RUN make install +RUN pip3 install -e .[all] ENTRYPOINT ["tts"] CMD ["--help"] diff --git a/Makefile b/Makefile index 077b4b23..1d6867f5 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ .DEFAULT_GOAL := help -.PHONY: test system-deps dev-deps style lint install install_dev help docs +.PHONY: test system-deps style lint install install_dev help docs help: @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' @@ -50,27 +50,24 @@ test_failed: ## only run tests failed the last time. coverage run -m nose2 -F -v -B tests style: ## update code style. - black ${target_dirs} + uv run --only-dev black ${target_dirs} lint: ## run linters. - ruff check ${target_dirs} - black ${target_dirs} --check + uv run --only-dev ruff check ${target_dirs} + uv run --only-dev black ${target_dirs} --check system-deps: ## install linux system deps sudo apt-get install -y libsndfile1-dev -dev-deps: ## install development deps - pip install -r requirements.dev.txt - build-docs: ## build the docs cd docs && make clean && make build install: ## install ๐Ÿธ TTS - pip install -e .[all] + uv sync --all-extras install_dev: ## install ๐Ÿธ TTS for development. - pip install -e .[all,dev] - pre-commit install + uv sync --all-extras + uv run pre-commit install docs: ## build the docs $(MAKE) -C docs clean && $(MAKE) -C docs html diff --git a/README.md b/README.md index c6a1db4f..507cce92 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,13 @@ ## ๐ŸธCoqui TTS News - ๐Ÿ“ฃ Fork of the [original, unmaintained repository](https://github.com/coqui-ai/TTS). New PyPI package: [coqui-tts](https://pypi.org/project/coqui-tts) +- ๐Ÿ“ฃ Prebuilt wheels are now also published for Mac and Windows (in addition to Linux as before) for easier installation across platforms. - ๐Ÿ“ฃ โ“TTSv2 is here with 16 languages and better performance across the board. - ๐Ÿ“ฃ โ“TTS fine-tuning code is out. Check the [example recipes](https://github.com/idiap/coqui-ai-TTS/tree/dev/recipes/ljspeech). - ๐Ÿ“ฃ โ“TTS can now stream with <200ms latency. - ๐Ÿ“ฃ โ“TTS, our production TTS model that can speak 13 languages, is released [Blog Post](https://coqui.ai/blog/tts/open_xtts), [Demo](https://huggingface.co/spaces/coqui/xtts), [Docs](https://coqui-tts.readthedocs.io/en/latest/models/xtts.html) - ๐Ÿ“ฃ [๐ŸถBark](https://github.com/suno-ai/bark) is now available for inference with unconstrained voice cloning. [Docs](https://coqui-tts.readthedocs.io/en/latest/models/bark.html) - ๐Ÿ“ฃ You can use [~1100 Fairseq models](https://github.com/facebookresearch/fairseq/tree/main/examples/mms) with ๐ŸธTTS. -- ๐Ÿ“ฃ ๐ŸธTTS now supports ๐ŸขTortoise with faster inference. [Docs](https://coqui-tts.readthedocs.io/en/latest/models/tortoise.html) - -
- ## @@ -27,7 +24,6 @@ ______________________________________________________________________ [![Discord](https://img.shields.io/discord/1037326658807533628?color=%239B59B6&label=chat%20on%20discord)](https://discord.gg/5eXr5seRrv) [![License]()](https://opensource.org/licenses/MPL-2.0) [![PyPI version](https://badge.fury.io/py/coqui-tts.svg)](https://badge.fury.io/py/coqui-tts) -[![Covenant](https://camo.githubusercontent.com/7d620efaa3eac1c5b060ece5d6aacfcc8b81a74a04d05cd0398689c01c4463bb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e7472696275746f72253230436f76656e616e742d76322e3025323061646f707465642d6666363962342e737667)](https://github.com/idiap/coqui-ai-TTS/blob/main/CODE_OF_CONDUCT.md) [![Downloads](https://pepy.tech/badge/coqui-tts)](https://pepy.tech/project/coqui-tts) [![DOI](https://zenodo.org/badge/265612440.svg)](https://zenodo.org/badge/latestdoi/265612440) @@ -43,12 +39,11 @@ ______________________________________________________________________ ## ๐Ÿ’ฌ Where to ask questions Please use our dedicated channels for questions and discussion. Help is much more valuable if it's shared publicly so that more people can benefit from it. -| Type | Platforms | -| ------------------------------- | --------------------------------------- | -| ๐Ÿšจ **Bug Reports** | [GitHub Issue Tracker] | -| ๐ŸŽ **Feature Requests & Ideas** | [GitHub Issue Tracker] | -| ๐Ÿ‘ฉโ€๐Ÿ’ป **Usage Questions** | [GitHub Discussions] | -| ๐Ÿ—ฏ **General Discussion** | [GitHub Discussions] or [Discord] | +| Type | Platforms | +| -------------------------------------------- | ----------------------------------- | +| ๐Ÿšจ **Bug Reports, Feature Requests & Ideas** | [GitHub Issue Tracker] | +| ๐Ÿ‘ฉโ€๐Ÿ’ป **Usage Questions** | [GitHub Discussions] | +| ๐Ÿ—ฏ **General Discussion** | [GitHub Discussions] or [Discord] | [github issue tracker]: https://github.com/idiap/coqui-ai-TTS/issues [github discussions]: https://github.com/idiap/coqui-ai-TTS/discussions @@ -66,15 +61,10 @@ repository are also still a useful source of information. | ๐Ÿ’ผ **Documentation** | [ReadTheDocs](https://coqui-tts.readthedocs.io/en/latest/) | ๐Ÿ’พ **Installation** | [TTS/README.md](https://github.com/idiap/coqui-ai-TTS/tree/dev#installation)| | ๐Ÿ‘ฉโ€๐Ÿ’ป **Contributing** | [CONTRIBUTING.md](https://github.com/idiap/coqui-ai-TTS/blob/main/CONTRIBUTING.md)| -| ๐Ÿ“Œ **Road Map** | [Main Development Plans](https://github.com/coqui-ai/TTS/issues/378) | ๐Ÿš€ **Released Models** | [Standard models](https://github.com/idiap/coqui-ai-TTS/blob/dev/TTS/.models.json) and [Fairseq models in ~1100 languages](https://github.com/idiap/coqui-ai-TTS#example-text-to-speech-using-fairseq-models-in-1100-languages-)| -| ๐Ÿ“ฐ **Papers** | [TTS Papers](https://github.com/erogol/TTS-papers)| ## Features -- High-performance Deep Learning models for Text2Speech tasks. - - Text2Spec models (Tacotron, Tacotron2, Glow-TTS, SpeedySpeech). - - Speaker Encoder to compute speaker embeddings efficiently. - - Vocoder models (MelGAN, Multiband-MelGAN, GAN-TTS, ParallelWaveGAN, WaveGrad, WaveRNN) +- High-performance Deep Learning models for Text2Speech tasks. See lists of models below. - Fast and efficient model training. - Detailed training logs on the terminal and Tensorboard. - Support for Multi-speaker TTS. @@ -180,8 +170,8 @@ pip install -e .[server,ja] If you are on Ubuntu (Debian), you can also run following commands for installation. ```bash -$ make system-deps # intended to be used on Ubuntu (Debian). Let us know if you have a different OS. -$ make install +make system-deps # intended to be used on Ubuntu (Debian). Let us know if you have a different OS. +make install ``` If you are on Windows, ๐Ÿ‘‘@GuyPaddock wrote installation instructions diff --git a/dockerfiles/Dockerfile.dev b/dockerfiles/Dockerfile.dev index af0d3fc0..b61bc4de 100644 --- a/dockerfiles/Dockerfile.dev +++ b/dockerfiles/Dockerfile.dev @@ -20,4 +20,4 @@ RUN rm -rf /root/.cache/pip WORKDIR /root COPY . /root -RUN make install +RUN pip3 install -e .[all,dev] diff --git a/pyproject.toml b/pyproject.toml index 6299bb0d..c3ec0075 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ dependencies = [ "cython>=3.0.0", "scipy>=1.11.2", "torch>=2.1", - "torchaudio", + "torchaudio>=2.1.0", "soundfile>=0.12.0", "librosa>=0.10.1", "inflect>=5.6.0", @@ -77,15 +77,6 @@ dependencies = [ ] [project.optional-dependencies] -# Development dependencies -dev = [ - "black==24.2.0", - "coverage[toml]>=7", - "nose2>=0.15", - "pre-commit>=3", - "ruff==0.4.9", - "tomli>=2; python_version < '3.11'", -] # Dependencies for building the documentation docs = [ "furo>=2023.5.20", @@ -115,6 +106,7 @@ ko = [ "hangul_romanize>=0.1.0", "jamo>=0.4.1", "g2pkk>=0.1.1", + "pip>=22.2", ] # Japanese ja = [ @@ -136,6 +128,15 @@ all = [ "coqui-tts[notebooks,server,bn,ja,ko,zh]", ] +[dependency-groups] +dev = [ + "black==24.2.0", + "coverage[toml]>=7", + "nose2>=0.15", + "pre-commit>=3", + "ruff==0.7.0", +] + [project.urls] Homepage = "https://github.com/idiap/coqui-ai-TTS" Documentation = "https://coqui-tts.readthedocs.io" @@ -151,13 +152,12 @@ tts-server = "TTS.server.server:main" constraint-dependencies = ["numba>0.58.0"] [tool.ruff] -target-version = "py39" line-length = 120 +extend-exclude = ["*.ipynb"] lint.extend-select = [ "B033", # duplicate-value "C416", # unnecessary-comprehension "D419", # empty-docstring - "E999", # syntax-error "F401", # unused-import "F704", # yield-outside-function "F706", # return-outside-function diff --git a/requirements.dev.txt b/requirements.dev.txt deleted file mode 100644 index 74ec0cd8..00000000 --- a/requirements.dev.txt +++ /dev/null @@ -1,8 +0,0 @@ -# Generated via scripts/generate_requirements.py and pre-commit hook. -# Do not edit this file; modify pyproject.toml instead. -black==24.2.0 -coverage[toml]>=7 -nose2>=0.15 -pre-commit>=3 -ruff==0.4.9 -tomli>=2; python_version < '3.11' diff --git a/scripts/generate_requirements.py b/scripts/generate_requirements.py deleted file mode 100644 index bbd32baf..00000000 --- a/scripts/generate_requirements.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python -"""Generate requirements/*.txt files from pyproject.toml. - -Adapted from: -https://github.com/numpy/numpydoc/blob/e7c6baf00f5f73a4a8f8318d0cb4e04949c9a5d1/tools/generate_requirements.py -""" - -import sys -from pathlib import Path - -try: # standard module since Python 3.11 - import tomllib as toml -except ImportError: - try: # available for older Python via pip - import tomli as toml - except ImportError: - sys.exit("Please install `tomli` first: `pip install tomli`") - -script_pth = Path(__file__) -repo_dir = script_pth.parent.parent -script_relpth = script_pth.relative_to(repo_dir) -header = [ - f"# Generated via {script_relpth.as_posix()} and pre-commit hook.", - "# Do not edit this file; modify pyproject.toml instead.", -] - - -def generate_requirement_file(name: str, req_list: list[str]) -> None: - req_fname = repo_dir / f"requirements.{name}.txt" - req_fname.write_text("\n".join(header + req_list) + "\n") - - -def main() -> None: - pyproject = toml.loads((repo_dir / "pyproject.toml").read_text()) - generate_requirement_file("dev", pyproject["project"]["optional-dependencies"]["dev"]) - - -if __name__ == "__main__": - main()