From 6b716517a204e69e9d0cdd77c86e1693eaa76af2 Mon Sep 17 00:00:00 2001 From: yerfor Date: Thu, 12 May 2022 20:47:59 +0800 Subject: [PATCH] init --- .gitignore | 151 ++++ LICENSE | 21 + README-zh.md | 97 +++ README.md | 104 +++ assets/SyntaSpeech.png | Bin 0 -> 132505 bytes checkpoints/.gitkeep | 0 data/.gitkeep | 0 data_gen/tts/base_binarizer.py | 324 +++++++ data_gen/tts/base_preprocess.py | 251 ++++++ data_gen/tts/runs/align_and_binarize.py | 12 + data_gen/tts/runs/binarize.py | 17 + data_gen/tts/runs/preprocess.py | 17 + data_gen/tts/runs/train_mfa_align.py | 46 + data_gen/tts/txt_processors/__init__.py | 1 + .../tts/txt_processors/base_text_processor.py | 50 ++ data_gen/tts/txt_processors/en.py | 78 ++ data_gen/tts/txt_processors/zh.py | 105 +++ data_gen/tts/wav_processors/__init__.py | 2 + data_gen/tts/wav_processors/base_processor.py | 25 + .../tts/wav_processors/common_processors.py | 86 ++ docs/diffspeech.md | 72 ++ docs/framework.md | 106 +++ docs/portaspeech.md | 80 ++ docs/prepare_data.md | 74 ++ docs/prepare_vocoder.md | 49 ++ docs/zh/framework.md | 96 +++ egs/datasets/audio/biaobei/base_text2mel.yaml | 18 + egs/datasets/audio/biaobei/preprocess.py | 16 + egs/datasets/audio/biaobei/ps_flow.yaml | 3 + egs/datasets/audio/biaobei/synta.yaml | 19 + .../audio/libritts/base_text2mel.yaml | 22 + egs/datasets/audio/libritts/preprocess.py | 13 + egs/datasets/audio/libritts/ps_flow.yaml | 3 + egs/datasets/audio/libritts/synta.yaml | 19 + egs/datasets/audio/lj/base_mel2wav.yaml | 4 + egs/datasets/audio/lj/base_text2mel.yaml | 17 + egs/datasets/audio/lj/ds.yaml | 29 + egs/datasets/audio/lj/fs.yaml | 3 + egs/datasets/audio/lj/fs2_orig.yaml | 4 + egs/datasets/audio/lj/hifigan.yaml | 3 + egs/datasets/audio/lj/preprocess.py | 9 + egs/datasets/audio/lj/ps_flow.yaml | 3 + egs/datasets/audio/lj/ps_flow_nips2021.yaml | 11 + egs/datasets/audio/lj/ps_flow_small.yaml | 3 + .../audio/lj/ps_flow_small_nips2021.yaml | 11 + egs/datasets/audio/lj/synta.yaml | 19 + egs/egs_bases/config_base.yaml | 41 + egs/egs_bases/tts/base.yaml | 56 ++ egs/egs_bases/tts/base_zh.yaml | 5 + egs/egs_bases/tts/dataset_params.yaml | 52 ++ egs/egs_bases/tts/ds.yaml | 33 + egs/egs_bases/tts/fs.yaml | 75 ++ egs/egs_bases/tts/fs2_orig.yaml | 13 + egs/egs_bases/tts/ps.yaml | 63 ++ egs/egs_bases/tts/ps_flow.yaml | 20 + egs/egs_bases/tts/ps_flow_small.yaml | 42 + egs/egs_bases/tts/synta.yaml | 20 + egs/egs_bases/tts/vocoder/base.yaml | 20 + egs/egs_bases/tts/vocoder/hifigan.yaml | 28 + inference/tts/base_tts_infer.py | 114 +++ inference/tts/ds.py | 30 + inference/tts/fs.py | 29 + inference/tts/fs2_orig.py | 17 + inference/tts/gradio/gradio_settings.yaml | 12 + inference/tts/gradio/infer.py | 69 ++ inference/tts/ps_flow.py | 39 + mfa_usr/adapt.py | 201 +++++ mfa_usr/adapt_config.yaml | 17 + mfa_usr/install_mfa.sh | 6 + mfa_usr/mfa.py | 498 +++++++++++ mfa_usr/mfa_train_config.yaml | 74 ++ mfa_usr/run_mfa_align.py | 70 ++ mfa_usr/run_mfa_train_align.sh | 30 + modules/commons/conformer/conformer.py | 72 ++ .../conformer/espnet_positional_embedding.py | 113 +++ .../conformer/espnet_transformer_attn.py | 186 ++++ modules/commons/conformer/layers.py | 260 ++++++ modules/commons/conv.py | 167 ++++ modules/commons/layers.py | 50 ++ modules/commons/nar_tts_modules.py | 138 +++ .../commons/normalizing_flow/glow_modules.py | 362 ++++++++ modules/commons/normalizing_flow/res_flow.py | 61 ++ modules/commons/normalizing_flow/utils.py | 29 + modules/commons/rel_transformer.py | 378 +++++++++ modules/commons/rnn.py | 261 ++++++ modules/commons/transformer.py | 747 ++++++++++++++++ modules/commons/wavenet.py | 97 +++ modules/tts/commons/align_ops.py | 25 + modules/tts/diffspeech/net.py | 110 +++ .../tts/diffspeech/shallow_diffusion_tts.py | 279 ++++++ modules/tts/fs.py | 172 ++++ modules/tts/fs2_orig.py | 102 +++ modules/tts/glow/utils.py | 29 + modules/tts/portaspeech/fvae.py | 203 +++++ modules/tts/portaspeech/portaspeech.py | 225 +++++ modules/tts/portaspeech/portaspeech_flow.py | 75 ++ modules/tts/syntaspeech/multi_window_disc.py | 136 +++ .../tts/syntaspeech/syntactic_graph_buider.py | 291 +++++++ .../syntaspeech/syntactic_graph_encoder.py | 193 +++++ modules/tts/syntaspeech/syntaspeech.py | 251 ++++++ modules/vocoder/hifigan/hifigan.py | 338 ++++++++ modules/vocoder/hifigan/mel_utils.py | 80 ++ modules/vocoder/hifigan/stft_loss.py | 136 +++ modules/vocoder/parallel_wavegan/__init__.py | 0 .../parallel_wavegan/layers/__init__.py | 5 + .../parallel_wavegan/layers/causal_conv.py | 56 ++ .../vocoder/parallel_wavegan/layers/pqmf.py | 132 +++ .../parallel_wavegan/layers/residual_block.py | 129 +++ .../parallel_wavegan/layers/residual_stack.py | 75 ++ .../parallel_wavegan/layers/tf_layers.py | 129 +++ .../parallel_wavegan/layers/upsample.py | 183 ++++ .../parallel_wavegan/losses/__init__.py | 1 + .../parallel_wavegan/losses/stft_loss.py | 154 ++++ .../parallel_wavegan/models/__init__.py | 2 + .../models/freq_discriminator.py | 149 ++++ .../vocoder/parallel_wavegan/models/melgan.py | 458 ++++++++++ .../models/parallel_wavegan.py | 461 ++++++++++ .../vocoder/parallel_wavegan/models/source.py | 538 ++++++++++++ .../parallel_wavegan/optimizers/__init__.py | 2 + .../parallel_wavegan/optimizers/radam.py | 91 ++ modules/vocoder/parallel_wavegan/stft_loss.py | 102 +++ .../parallel_wavegan/utils/__init__.py | 1 + .../vocoder/parallel_wavegan/utils/utils.py | 171 ++++ requirements.txt | 27 + tasks/run.py | 19 + tasks/tts/dataset_utils.py | 195 +++++ tasks/tts/diffspeech.py | 111 +++ tasks/tts/fs.py | 184 ++++ tasks/tts/fs2_orig.py | 138 +++ tasks/tts/ps.py | 194 +++++ tasks/tts/ps_flow.py | 134 +++ tasks/tts/speech_base.py | 373 ++++++++ tasks/tts/synta.py | 272 ++++++ tasks/tts/tts_utils.py | 54 ++ tasks/tts/vocoder_infer/__init__.py | 2 + tasks/tts/vocoder_infer/base_vocoder.py | 63 ++ tasks/tts/vocoder_infer/hifigan.py | 31 + tasks/tts/vocoder_infer/pwg.py | 32 + tasks/vocoder/dataset_utils.py | 130 +++ tasks/vocoder/hifigan.py | 63 ++ tasks/vocoder/vocoder_base.py | 137 +++ utils/audio/__init__.py | 82 ++ utils/audio/align.py | 90 ++ utils/audio/cwt.py | 143 ++++ utils/audio/griffin_lim.py | 85 ++ utils/audio/io.py | 22 + utils/audio/pitch/utils.py | 82 ++ utils/audio/pitch_extractors.py | 40 + utils/audio/rnnoise.py | 48 ++ utils/audio/vad.py | 78 ++ utils/commons/base_task.py | 232 +++++ utils/commons/ckpt_utils.py | 66 ++ utils/commons/dataset_utils.py | 247 ++++++ utils/commons/ddp_utils.py | 137 +++ utils/commons/hparams.py | 131 +++ utils/commons/indexed_datasets.py | 71 ++ utils/commons/meters.py | 42 + utils/commons/multiprocess_utils.py | 130 +++ utils/commons/single_thread_env.py | 5 + utils/commons/tensor_utils.py | 92 ++ utils/commons/trainer.py | 559 ++++++++++++ utils/metrics/diagonal_metrics.py | 74 ++ utils/metrics/dtw.py | 160 ++++ utils/metrics/laplace_var.py | 4 + utils/metrics/pitch_distance.py | 102 +++ utils/metrics/ssim.py | 84 ++ utils/nn/model_utils.py | 14 + utils/nn/schedulers.py | 57 ++ utils/nn/seq_utils.py | 305 +++++++ utils/os_utils.py | 20 + utils/plot/plot.py | 51 ++ utils/text/encoding.py | 9 + utils/text/text_encoder.py | 263 ++++++ utils/text/text_norm.py | 797 ++++++++++++++++++ 174 files changed, 18653 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README-zh.md create mode 100644 README.md create mode 100644 assets/SyntaSpeech.png create mode 100644 checkpoints/.gitkeep create mode 100644 data/.gitkeep create mode 100644 data_gen/tts/base_binarizer.py create mode 100644 data_gen/tts/base_preprocess.py create mode 100644 data_gen/tts/runs/align_and_binarize.py create mode 100644 data_gen/tts/runs/binarize.py create mode 100644 data_gen/tts/runs/preprocess.py create mode 100644 data_gen/tts/runs/train_mfa_align.py create mode 100644 data_gen/tts/txt_processors/__init__.py create mode 100644 data_gen/tts/txt_processors/base_text_processor.py create mode 100644 data_gen/tts/txt_processors/en.py create mode 100644 data_gen/tts/txt_processors/zh.py create mode 100644 data_gen/tts/wav_processors/__init__.py create mode 100644 data_gen/tts/wav_processors/base_processor.py create mode 100644 data_gen/tts/wav_processors/common_processors.py create mode 100644 docs/diffspeech.md create mode 100644 docs/framework.md create mode 100644 docs/portaspeech.md create mode 100644 docs/prepare_data.md create mode 100644 docs/prepare_vocoder.md create mode 100644 docs/zh/framework.md create mode 100644 egs/datasets/audio/biaobei/base_text2mel.yaml create mode 100644 egs/datasets/audio/biaobei/preprocess.py create mode 100644 egs/datasets/audio/biaobei/ps_flow.yaml create mode 100644 egs/datasets/audio/biaobei/synta.yaml create mode 100644 egs/datasets/audio/libritts/base_text2mel.yaml create mode 100644 egs/datasets/audio/libritts/preprocess.py create mode 100644 egs/datasets/audio/libritts/ps_flow.yaml create mode 100644 egs/datasets/audio/libritts/synta.yaml create mode 100644 egs/datasets/audio/lj/base_mel2wav.yaml create mode 100644 egs/datasets/audio/lj/base_text2mel.yaml create mode 100644 egs/datasets/audio/lj/ds.yaml create mode 100644 egs/datasets/audio/lj/fs.yaml create mode 100644 egs/datasets/audio/lj/fs2_orig.yaml create mode 100644 egs/datasets/audio/lj/hifigan.yaml create mode 100644 egs/datasets/audio/lj/preprocess.py create mode 100644 egs/datasets/audio/lj/ps_flow.yaml create mode 100644 egs/datasets/audio/lj/ps_flow_nips2021.yaml create mode 100644 egs/datasets/audio/lj/ps_flow_small.yaml create mode 100644 egs/datasets/audio/lj/ps_flow_small_nips2021.yaml create mode 100644 egs/datasets/audio/lj/synta.yaml create mode 100644 egs/egs_bases/config_base.yaml create mode 100644 egs/egs_bases/tts/base.yaml create mode 100644 egs/egs_bases/tts/base_zh.yaml create mode 100644 egs/egs_bases/tts/dataset_params.yaml create mode 100644 egs/egs_bases/tts/ds.yaml create mode 100644 egs/egs_bases/tts/fs.yaml create mode 100644 egs/egs_bases/tts/fs2_orig.yaml create mode 100644 egs/egs_bases/tts/ps.yaml create mode 100644 egs/egs_bases/tts/ps_flow.yaml create mode 100644 egs/egs_bases/tts/ps_flow_small.yaml create mode 100644 egs/egs_bases/tts/synta.yaml create mode 100644 egs/egs_bases/tts/vocoder/base.yaml create mode 100644 egs/egs_bases/tts/vocoder/hifigan.yaml create mode 100644 inference/tts/base_tts_infer.py create mode 100644 inference/tts/ds.py create mode 100644 inference/tts/fs.py create mode 100644 inference/tts/fs2_orig.py create mode 100644 inference/tts/gradio/gradio_settings.yaml create mode 100644 inference/tts/gradio/infer.py create mode 100644 inference/tts/ps_flow.py create mode 100755 mfa_usr/adapt.py create mode 100755 mfa_usr/adapt_config.yaml create mode 100644 mfa_usr/install_mfa.sh create mode 100755 mfa_usr/mfa.py create mode 100644 mfa_usr/mfa_train_config.yaml create mode 100644 mfa_usr/run_mfa_align.py create mode 100644 mfa_usr/run_mfa_train_align.sh create mode 100644 modules/commons/conformer/conformer.py create mode 100644 modules/commons/conformer/espnet_positional_embedding.py create mode 100644 modules/commons/conformer/espnet_transformer_attn.py create mode 100644 modules/commons/conformer/layers.py create mode 100644 modules/commons/conv.py create mode 100644 modules/commons/layers.py create mode 100644 modules/commons/nar_tts_modules.py create mode 100644 modules/commons/normalizing_flow/glow_modules.py create mode 100644 modules/commons/normalizing_flow/res_flow.py create mode 100644 modules/commons/normalizing_flow/utils.py create mode 100644 modules/commons/rel_transformer.py create mode 100755 modules/commons/rnn.py create mode 100644 modules/commons/transformer.py create mode 100644 modules/commons/wavenet.py create mode 100644 modules/tts/commons/align_ops.py create mode 100644 modules/tts/diffspeech/net.py create mode 100644 modules/tts/diffspeech/shallow_diffusion_tts.py create mode 100755 modules/tts/fs.py create mode 100755 modules/tts/fs2_orig.py create mode 100644 modules/tts/glow/utils.py create mode 100644 modules/tts/portaspeech/fvae.py create mode 100644 modules/tts/portaspeech/portaspeech.py create mode 100644 modules/tts/portaspeech/portaspeech_flow.py create mode 100644 modules/tts/syntaspeech/multi_window_disc.py create mode 100644 modules/tts/syntaspeech/syntactic_graph_buider.py create mode 100644 modules/tts/syntaspeech/syntactic_graph_encoder.py create mode 100644 modules/tts/syntaspeech/syntaspeech.py create mode 100644 modules/vocoder/hifigan/hifigan.py create mode 100644 modules/vocoder/hifigan/mel_utils.py create mode 100755 modules/vocoder/hifigan/stft_loss.py create mode 100644 modules/vocoder/parallel_wavegan/__init__.py create mode 100644 modules/vocoder/parallel_wavegan/layers/__init__.py create mode 100644 modules/vocoder/parallel_wavegan/layers/causal_conv.py create mode 100644 modules/vocoder/parallel_wavegan/layers/pqmf.py create mode 100644 modules/vocoder/parallel_wavegan/layers/residual_block.py create mode 100644 modules/vocoder/parallel_wavegan/layers/residual_stack.py create mode 100644 modules/vocoder/parallel_wavegan/layers/tf_layers.py create mode 100644 modules/vocoder/parallel_wavegan/layers/upsample.py create mode 100644 modules/vocoder/parallel_wavegan/losses/__init__.py create mode 100644 modules/vocoder/parallel_wavegan/losses/stft_loss.py create mode 100644 modules/vocoder/parallel_wavegan/models/__init__.py create mode 100644 modules/vocoder/parallel_wavegan/models/freq_discriminator.py create mode 100644 modules/vocoder/parallel_wavegan/models/melgan.py create mode 100644 modules/vocoder/parallel_wavegan/models/parallel_wavegan.py create mode 100644 modules/vocoder/parallel_wavegan/models/source.py create mode 100644 modules/vocoder/parallel_wavegan/optimizers/__init__.py create mode 100644 modules/vocoder/parallel_wavegan/optimizers/radam.py create mode 100644 modules/vocoder/parallel_wavegan/stft_loss.py create mode 100644 modules/vocoder/parallel_wavegan/utils/__init__.py create mode 100644 modules/vocoder/parallel_wavegan/utils/utils.py create mode 100755 requirements.txt create mode 100644 tasks/run.py create mode 100644 tasks/tts/dataset_utils.py create mode 100644 tasks/tts/diffspeech.py create mode 100755 tasks/tts/fs.py create mode 100755 tasks/tts/fs2_orig.py create mode 100644 tasks/tts/ps.py create mode 100644 tasks/tts/ps_flow.py create mode 100644 tasks/tts/speech_base.py create mode 100644 tasks/tts/synta.py create mode 100644 tasks/tts/tts_utils.py create mode 100644 tasks/tts/vocoder_infer/__init__.py create mode 100644 tasks/tts/vocoder_infer/base_vocoder.py create mode 100644 tasks/tts/vocoder_infer/hifigan.py create mode 100644 tasks/tts/vocoder_infer/pwg.py create mode 100644 tasks/vocoder/dataset_utils.py create mode 100755 tasks/vocoder/hifigan.py create mode 100644 tasks/vocoder/vocoder_base.py create mode 100755 utils/audio/__init__.py create mode 100644 utils/audio/align.py create mode 100644 utils/audio/cwt.py create mode 100644 utils/audio/griffin_lim.py create mode 100644 utils/audio/io.py create mode 100644 utils/audio/pitch/utils.py create mode 100644 utils/audio/pitch_extractors.py create mode 100644 utils/audio/rnnoise.py create mode 100644 utils/audio/vad.py create mode 100755 utils/commons/base_task.py create mode 100644 utils/commons/ckpt_utils.py create mode 100644 utils/commons/dataset_utils.py create mode 100644 utils/commons/ddp_utils.py create mode 100644 utils/commons/hparams.py create mode 100644 utils/commons/indexed_datasets.py create mode 100644 utils/commons/meters.py create mode 100644 utils/commons/multiprocess_utils.py create mode 100644 utils/commons/single_thread_env.py create mode 100644 utils/commons/tensor_utils.py create mode 100644 utils/commons/trainer.py create mode 100644 utils/metrics/diagonal_metrics.py create mode 100644 utils/metrics/dtw.py create mode 100644 utils/metrics/laplace_var.py create mode 100644 utils/metrics/pitch_distance.py create mode 100644 utils/metrics/ssim.py create mode 100644 utils/nn/model_utils.py create mode 100644 utils/nn/schedulers.py create mode 100644 utils/nn/seq_utils.py create mode 100644 utils/os_utils.py create mode 100644 utils/plot/plot.py create mode 100644 utils/text/encoding.py create mode 100644 utils/text/text_encoder.py create mode 100644 utils/text/text_norm.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9851720 --- /dev/null +++ b/.gitignore @@ -0,0 +1,151 @@ +### Project ignore + +/checkpoints/* +!/checkpoints/.gitkeep +/data/* +!/data/.gitkeep +infer_out +rsync +.idea +.DS_Store +bak +tmp +*.tar.gz +mos +nbs +/configs_usr/* +!/configs_usr/.gitkeep +/egs_usr/* +!/egs_usr/.gitkeep +/rnnoise +#/usr/* +#!/usr/.gitkeep +scripts_usr + +# Created by .ignore support plugin (hsz.mobi) +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ +将删除 datasets/remi/test/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1589a1a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Yi Ren + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README-zh.md b/README-zh.md new file mode 100644 index 0000000..19ba375 --- /dev/null +++ b/README-zh.md @@ -0,0 +1,97 @@ +

+
+ +
+

+ +

+

NATSpeech: A Non-Autoregressive Text-to-Speech Framework

+

+ +
+ +[![](https://img.shields.io/github/stars/NATSpeech/NATSpeech)](https://github.com/NATSpeech/NATSpeech) +[![](https://img.shields.io/github/forks/NATSpeech/NATSpeech)](https://github.com/NATSpeech/NATSpeech) +[![](https://img.shields.io/github/license/NATSpeech/NATSpeech)](https://github.com/NATSpeech/NATSpeech/blob/main/LICENSE) +[![](https://img.shields.io/github/downloads/NATSpeech/NATSpeech/total?label=pretrained+model+downloads)](https://github.com/NATSpeech/NATSpeech/releases/tag/pretrained_models) | [English README](./README.md) + +
+ +本仓库包含了以下工作的官方PyTorch实现: + +- [PortaSpeech: Portable and High-Quality Generative Text-to-Speech](https://proceedings.neurips.cc/paper/2021/file/748d6b6ed8e13f857ceaa6cfbdca14b8-Paper.pdf) (NeurIPS 2021)[Demo页面](https://portaspeech.github.io/) | [HuggingFace🤗 Demo](https://huggingface.co/spaces/NATSpeech/PortaSpeech) +- [DiffSinger: Singing Voice Synthesis via Shallow Diffusion Mechanism](https://arxiv.org/abs/2105.02446) (DiffSpeech) (AAAI 2022) + [Demo页面](https://diffsinger.github.io/) | [项目主页](https://github.com/MoonInTheRiver/DiffSinger) | [HuggingFace🤗 Demo](https://huggingface.co/spaces/NATSpeech/DiffSpeech) + +## 主要特点 + +我们在本框架中实现了以下特点: + +- 基于[Montreal Forced Aligner](https://github.com/MontrealCorpusTools/Montreal-Forced-Aligner)的非自回归语音合成数据处理流程; +- 便于使用和可扩展的训练和测试框架; +- 简单但有效的随机访问数据集类的实现。 + +## 安装依赖 + +```bash +## 在 Linux/Ubuntu 18.04 上通过测试 +## 首先需要安装 Python 3.6+ (推荐使用Anaconda) + +export PYTHONPATH=. +# 创建虚拟环境 (推荐). +python -m venv venv +source venv/bin/activate +# 安装依赖 +pip install -U pip +pip install Cython numpy==1.19.1 +pip install torch==1.9.0 # 推荐 torch >= 1.9.0 +pip install -r requirements.txt +sudo apt install -y sox libsox-fmt-mp3 +bash mfa_usr/install_mfa.sh # 安装强制对齐工具 +pip install dgl-cu102 dglgo -f https://data.dgl.ai/wheels/repo.html +``` + +## 文档 + +- [关于本框架](./docs/zh/framework.md) +- [运行PortaSpeech](./docs/portaspeech.md) +- [运行DiffSpeech](./docs/diffspeech.md) + +## 引用 + +如果本REPO对你的研究和工作有用,请引用以下论文: + +- PortaSpeech + +```bib +@article{ren2021portaspeech, + title={PortaSpeech: Portable and High-Quality Generative Text-to-Speech}, + author={Ren, Yi and Liu, Jinglin and Zhao, Zhou}, + journal={Advances in Neural Information Processing Systems}, + volume={34}, + year={2021} +} +``` + +- DiffSpeech + +```bib +@article{liu2021diffsinger, + title={Diffsinger: Singing voice synthesis via shallow diffusion mechanism}, + author={Liu, Jinglin and Li, Chengxi and Ren, Yi and Chen, Feiyang and Liu, Peng and Zhao, Zhou}, + journal={arXiv preprint arXiv:2105.02446}, + volume={2}, + year={2021} + } +``` + +## 致谢 + +我们的代码受以下代码和仓库启发: + +- [PyTorch Lightning](https://github.com/PyTorchLightning/pytorch-lightning) +- [ParallelWaveGAN](https://github.com/kan-bayashi/ParallelWaveGAN) +- [Hifi-GAN](https://github.com/jik876/hifi-gan) +- [espnet](https://github.com/espnet/espnet) +- [Glow-TTS](https://github.com/jaywalnut310/glow-tts) +- [DiffSpeech](https://github.com/MoonInTheRiver/DiffSinger) diff --git a/README.md b/README.md new file mode 100644 index 0000000..423532c --- /dev/null +++ b/README.md @@ -0,0 +1,104 @@ +# SyntaSpeech: Syntax-Aware Generative Adversarial Text-to-Speech + +[![arXiv](https://img.shields.io/badge/arXiv-Paper-%3CCOLOR%3E.svg)](https://arxiv.org/abs/2204.11792)[![GitHub Stars](https://img.shields.io/github/stars/yerfor/SyntaSpeech)](https://github.com/yerfor/SyntaSpeech)[![downloads](https://img.shields.io/github/downloads/yerfor/SyntaSpeech/total.svg)](https://github.com/yerfor/SyntaSpeech/releases) | [![Hugging Face](https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-blue)](https://huggingface.co/spaces/yerfor/SyntaSpeech) | [中文文档](README-zh.md) + +This repository is the official PyTorch implementation of our IJCAI-2022 [paper](https://arxiv.org/abs/2204.11792), in which we propose **SyntaSpeech** for syntax-aware non-autoregressive Text-to-Speech. + +

+
+ +
+

+ +Our SyntaSpeech is built on the basis of [PortaSpeech](https://github.com/NATSpeech/NATSpeech) (NeurIPS 2021) with three new features: + +1. We propose **Syntactic Graph Builder (Sec. 3.1)** and **Syntactic Graph Encoder (Sec. 3.2)**, which is proved to be an effective unit to extract syntactic features to improve the prosody modeling and duration accuracy of TTS model. +2. We introduce **Multi-Length Adversarial Training (Sec. 3.3)**, which could replace the flow-based post-net in PortaSpeech, speeding up the inference time and improving the audio quality naturalness. +3. We support three datasets: [LJSpeech](https://keithito.com/LJ-Speech-Dataset/) (single-speaker English dataset), [Biaobei](https://www.data-baker.com/open%20source.html) (single-speaker Chinese dataset) , and [LibriTTS](http://www.openslr.org/60) (multi-speaker English dataset). + +## Environments + +``` +conda create -n synta python=3.7 +source activate synta +pip install -U pip +pip install Cython numpy==1.19.1 +pip install torch==1.9.0 +pip install -r requirements.txt +# install dgl for graph neural network, dgl-cu102 supports rtx2080, dgl-cu113 support rtx3090 +pip install dgl-cu102 dglgo -f https://data.dgl.ai/wheels/repo.html +sudo apt install -y sox libsox-fmt-mp3 +bash mfa_usr/install_mfa.sh # install force alignment tools + +``` + +## Run SyntaSpeech! + +**Please follow the following steps to run this repo.** + +### 1. Preparation + +#### Data Preparation + +You can directly use our binarized datasets for LJSpeech and Biaobei. Download them from [this link]() and unzip them into the `data/binary/` folder. + +As for LibriTTS, you can download the raw datasets and process them with our `data_gen` modules. Detailed instructions can be found in [dosc/prepare_data](docs/prepare_data.md). + +#### Vocoder Preparation + +We provide the pre-trained model of vocoders for three datasets. Specifically, Hifi-GAN for [LJSpeech]() and [Biaobei](), ParallelWaveGAN for [LibriTTS](). Download and unzip them into the `checkpoints/` folder. + +### 2. Training Example + +Then you can train SyntaSpeech in the three datasets. + +``` +cd +export PYTHONPATH=./ +CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config egs/tts/lj/synta.yaml --exp_name lj_synta --reset # training in LJSpeech +CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config egs/tts/biaobei/synta.yaml --exp_name biaobei_synta --reset # training in Biaobei +CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config egs/tts/biaobei/synta.yaml --exp_name libritts_synta --reset # training in LibriTTS +``` + +### 3. Tensorboard + +``` +tensorboard --logdir=checkpoints/lj_synta +tensorboard --logdir=checkpoints/biaobei_synta +tensorboard --logdir=checkpoints/libritts_synta +``` + +### 4. Inference Example + +``` +CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config egs/tts/lj/synta.yaml --exp_name lj_synta --reset --infer # inference in LJSpeech +CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config egs/tts/biaobei/synta.yaml --exp_name biaobei_synta --reset --infer # inference in Biaobei +CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config egs/tts/biaobei/synta.yaml --exp_name libritts_synta --reset ---infer # inference in LibriTTS +``` + +## Audio Demos + +Audio samples can be found in our [demo page](https://syntaspeech.github.io/). + +## Citation + +``` +@article{ye2022syntaspeech, + title={SyntaSpeech: Syntax-Aware Generative Adversarial Text-to-Speech}, + author={Ye, Zhenhui and Zhao, Zhou and Ren, Yi and Wu, Fei}, + journal={arXiv preprint arXiv:2204.11792}, + year={2022} +} +``` + +## Acknowledgements + +**Our codes are based on the following repos:** + +* [NATSpeech](https://github.com/NATSpeech/NATSpeech) +* [PyTorch Lightning](https://github.com/PyTorchLightning/pytorch-lightning) +* [ParallelWaveGAN](https://github.com/kan-bayashi/ParallelWaveGAN) +* [HifiGAN](https://github.com/jik876/hifi-gan) +* [espnet](https://github.com/espnet/espnet) +* [Glow-TTS](https://github.com/jaywalnut310/glow-tts) +* [DiffSpeech](https://github.com/MoonInTheRiver/DiffSinger) diff --git a/assets/SyntaSpeech.png b/assets/SyntaSpeech.png new file mode 100644 index 0000000000000000000000000000000000000000..cbed6b673fde7e17cacf72c3e2ac2d3223b92fff GIT binary patch literal 132505 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