# Framework of NATSpeech NATSpeech is a simple framework for Non-Autoregressive Text-to-Speech. ## Directory Structure - `egs`: configuration files, which will be loaded by `utils/commons/hparams.py` - `data_gen`: data binarization codes - `modules`: modules and models - `tasks`: the training and inference logics - `utils`: commonly used utils - `data`: data - `raw`: raw data - `processed`: data after preprocess - `binary`: binary data - `checkpoints`: model checkpoints, tensorboard logs and generated results for all experiments. ## How to Add New Tasks and Run? We show the basic steps of adding a new task/model and running the code (LJSpeech dataset as an example). ### Add the model Add your model to `modules`. ### Add the task Task classes are used to manage the training and inference procedures. A new task (e.g., `tasks.tts.fs.FastSpeechTask`) should inherit the base task (`tasks.tts.speech_base.TTSBaseTask`) class. You must implement these methods: - `build_tts_model`, which builds the model for your task. - `run_model`, indicating how to use the model in training and inference. You can override `test_step` and `save_valid_result` to change the validation/testing logics or add more plots to tensorboard. ### Add a new config file Add a new config file in `egs/datasets/audio/lj/YOUR_TASK.yaml`. For example: ```yaml base_config: ./base_text2mel.yaml task_cls: tasks.tts.fs.FastSpeechTask # model configs hidden_size: 256 dropout: 0.1 # some more configs ..... ``` If you use a new dataset `YOUR_DATASET`, you should also add a `YOUR_DATASET_Processor` in `egs/datasets/audio/YOUR_DATASET/preprocess.py`, inheriting `data_gen.tts.base_preprocess.BasePreprocessor`, which loads some meta information of the dataset. ### Preprocess and binary dataset ```bash python data_gen/tts/runs/align_and_binarize.py --config egs/datasets/audio/lj/base_text2mel.yaml ``` ### Training ```bash CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config YOUR_CONFIG --exp_name YOUR_EXP_NAME --reset ``` You can open Tensorboard via: ```bash tensorboard --logdir checkpoints/EXP_NAME ``` ### Inference (Testing) ```bash CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config egs/datasets/audio/lj/YOUR_TASK.yaml --exp_name YOUR_EXP_NAME --reset --infer ``` ## Design Philosophy ### Random-Access Binarized Dataset To address the IO problem when reading small files, we design a `IndexedDataset` class (_utils/commons/indexed_datasets.py_) ### Global Config We introduce a global config `hparams`, which is load from a `.yaml` config file and can be used in anywhere. However, we do not recommend using it in some general-purpose modules. ### BaseTrainer Framework Our [base trainer](utils/commons/trainer.py) and [base task ](utils/commons/base_task.py) classes refer to [PytorchLightning](https://github.com/PyTorchLightning/pytorch-lightning), which builds some commonly used training/inference code structure. Our framework supports multi-process GPU training without changing the subclass codes. ### Checkpoint Saving All checkpoints and tensorboard logs are saved in `checkpoints/EXP_NAME`, where `EXP_NAME` is set in the running command: `python tasks/run.py .... --exp_name EXP_NAME`. You can use `tensorboard --logdir checkpoints/EXP_NAME` to open the tensorboard and check the training loss curves etc.