Complete models are converted to ONNX and so you will need a version of the onnx runtime. TBD: More dependencies as we flesh out inference
If you are using a notebook-based environment (e.g., Colab or Kaggle), launch the training notebook via:
Direct notebook link: train-stylish.ipynb
Instructions are provided for both uv or pip. Install your preferred Python package manager and refer to the associated instructions.
# Create a folder for your uv project
mkdir my-training-dir
cd my-training-dir
# stylish-tts currently uses Python 3.12
uv init --python 3.12
# Clone the stylish-tts source somewhere (TODO: Fix this when we upload a package)
git clone https://github.com/Stylish-TTS/stylish-tts.git
# Install pytorch and onnx.
# Use onnxruntime-gpu if you want to do test inference with a GPU.
uv add torch torchaudio onnxruntime requests beautifulsoup4
# Auto-detect OS, Python, and PyTorch versions to fetch and install the compatible k2 wheel.
uv run stylish-tts/get_k2_whl.py > k2_whl.txt && uv add -r k2_whl.txt
# Verify that k2 was installed successfully
uv run python -c "import k2; print('k2 installed successfully')"
# Install stylish-tts as a local editable package
# Automatically rebuilds if contents change
# IMPORTANT: Don't forget the trailing slash /
uv add --editable stylish-tts/
# stylish-tts currently uses Python 3.12
# Use pyenv or equivalent to ensure the venv uses Python 3.12
# pyenv install 3.12.7 && pyenv local 3.12.7
# Ensure pip is installed via your package manager
# Create a folder for your uv project
mkdir my-training-dir
cd my-training-dir
# Set up virtual environment
python3.12 -m venv venv
# Activate virtual environment (needs to be done every time you begin a new session)
source venv/bin/activate
# Clone the stylish-tts source somewhere (TODO: Fix this when we upload a package)
git clone https://github.com/Stylish-TTS/stylish-tts.git
# Install pytorch and onnx.
# Use onnxruntime-gpu if you want to do test inference with a GPU.
pip install torch torchaudio onnxruntime requests beautifulsoup4
# Auto-detect OS, Python, and PyTorch versions to fetch and install the compatible k2 wheel.
python stylish-tts/get_k2_whl.py > k2_whl.txt && pip install -r k2_whl.txt
# Verify that k2 was installed successfully
python -c "import k2; print('k2 installed successfully')"
# Install stylish-tts as a local editable package from the stylish-tts/ directory.
# Automatically rebuilds if contents change.
# IMPORTANT: Don't forget the trailing slash /
pip install -e stylish-tts/
tensorboard is a separate application you can run which lets you see graphs of your loss functions and listen to samples produced at each validation.
train.log file, but this tends to be less useful than the interactive graphs provided by tensorboard.The latest versions of PyTorch can drop support for older GPUs. If you have an old GPU:
torch and torchaudio which supports your GPU. If your GPU is older and requires you to use an older version of torch, make sure to use the same version of torchaudio during training.torch for training, make a separate virtual environment/directory to use during model conversion and use a device of cpu and the latest version of torch for project conversion. This will ensure that you are converting using the most up-to-date version of Torch Dynamo.In order to train your model, you will need:
config.yml file (say my_config.yml) created from the template here. You can store it anywhere, like at the root of your project. training:
log_interval: 1000
save_interval: 5000
val_interval: 5000
device: "cuda"
mixed_precision: "no"
vram_reserve: 200
data_workers: 32
log_interval, save_interval, and val_interval are all in steps.device ("cuda", "mps", "cpu" or whatever will work with your torch installation).vram_reserve allocates an extra block of memory when probing how big batch sizes can be. It reduces the odds of having out-of-memory events.data_workers sets how many processes will be used to prepare data for training. If your GPU is under-utilized and you have spare CPU cores, you can set this higher to go faster.
data_workers to 0 for now. There is a known issue with dataloader concurrency that we are looking into.training_plan:
alignment:
epochs: 20
probe_batch_max: 128
lr: 1e-5
acoustic:
epochs: 10
probe_batch_max: 16
lr: 1e-4
textual:
epochs: 10
probe_batch_max: 16
lr: 3e-5
style:
epochs: 50
probe_batch_max: 128
lr: 1e-5
duration:
epochs: 50
probe_batch_max: 128
lr: 1e-4
The training_plan section provides parameters for each stage of training. With more testing we'll provide concrete guidelines for each of this.
lr) alone as this has been tuned.epochs.
acoustic and textual stages are SLOW. The other stages are FAST.acoustic and textual.probe_batch_max. TODO: Guidanceprobe_max_batch to 2 for every stage. The batch probing works by pushing until it runs out of memory. That will make you sad if this is system memory instead of VRAM memory.The path should be the root of your dataset, and the various other paths in this section are relative to that root. If you use the default file and directory names, your directory structure will look something like this:
dataset:
# All paths in this section are relative to the main path
path: "../my_dataset/"
train_data: "training-list.txt"
val_data: "validation-list.txt"
wav_path: "wav-dir"
pitch_path: "pitch.safetensors"
alignment_path: "alignment.safetensors"
alignment_model_path: "alignment_model.safetensors"
The structure of your dataset folder from this example would look like this:
../my_dataset/ # Root
|
+-> training-list.txt # Training list file (described below)
|
+-> validation-list.txt # Validation list file (described below)
|
+-> wav-dir # Folder with audio wav files, one for each segment
| |
| +-> something.wav
| |
| +-> other.wav
| |
| +-> ...
|
+-> pitch.safetensors # Pre-cached segment pitches (file gets generated at `pitch_path` in `my_config.yml`. See below)
|
+-> alignment.safetensors # Pre-cached alignments (file gets generated at `alignment_path` in `my_config.yml`. See below)
|
+-> alignment_model.safetensors # Model for generating alignments. You will train this (gets generated at `alignment_model_path` in `my_config.yml`. See below)
validation section allows you to adjust which samples are exported to tensorflow.loss_weight section provides relative weights for different kinds of loss. These are tuned and should not be changed unless you know what you are doing.Note: A sample dataset can be found at sample_dataset/. Please note that this has been provided as a reference only, and will in no way be sufficient to train a model.
A dataset consists of many segments. Each segment has a written text and an audio file where that text is spoken by a reader.
Your dataset should have the following files:
my_config.yml)my_config.yml)my_config.yml)Segment Length Distribution:
Training List and Validation List:
<filename>|<phonemes>|<speaker-id>|<plaintext>1.wav|ɔnðə kˈɑːntɹɛɹi|0|On the contrary2.wav|fɚðə fˈɜːst tˈaɪm|0|For the first timemy_config.yml.espeak-ng (or a similar G2P system) to create phonemes corresponding to each audio file.Stylish TTS uses a pre-cached ground truth pitch (F0) for all your segments. To generate these pitches, run:
uv:
uv run stylish-train pitch /path/to/your/config.yml --workers 16
pip:
stylish-train pitch /path/to/your/config.yml --workers 16
The number of workers should be approximately equal to the number of cores on your machine.
By default, Harvest, which is a CPU-based system, is used to extract pitch. If you find this to be too slow, there is also a GPU-based option available by passing --method rmvpe from the command line. When finished, it will write the pre-cached segment pitches at the pitch_path file path specified by your my_config.yml.
Alignment data is also pre-cached. This is a multi-step process, but only needs to be done ONCE for your dataset, after which you can just use the cached results (similar to the generated pitch data).
First, you need to train your own alignment model:
uv:
uv run stylish-train train-align /path/to/your/config.yml --out /path/to/your/output
pip:
stylish-train train-align /path/to/your/config.yml --out /path/to/your/output
--out option is where logs and checkpoints will end up.my_config.yml.We will use this model to generate the alignments:
uv:
uv run stylish-train align /path/to/your/config.yml
pip:
stylish-train align /path/to/your/config.yml
This generates the actual cached alignments for all the segments in both the training and validation data as configured in your config.yml. It outputs its results to the alignment file from your my_config.yml.
stylish-tts align generates a "confidence value" score for every segment it processes. These scores are written to files in your dataset path.Here is a typical command to start off a new training run:
uv:
uv run stylish-train train /path/to/your/config.yml --out /path/to/your/output
pip:
stylish-train train /path/to/your/config.yml --out /path/to/your/output
All checkpoint, training logs, and tensorboard data are sent to the path you specify with --out.
Make sure to have plenty of disk space available here as checkpoints can take a large amount of storage.
Expectations During Training
screen or tmux to have a persistent shell that won't disappear if you get disconnected or close the window.acoustic, textual, style, and duration.acoustic stage by default.--stage option, which is necessary if you are resuming from a checkpoint.my_config.yml settings.out, and its own training log and tensorboard graphs/samples.mel which is a perceptual similarity of the generated audio to the ground truth. It should slowly decrease during training, but the exact point at which it converges will depend on your dataset. The other loss figures can generally be ignored and may not vary much during training.mel, pitch, and energy losses are all important. You should expect mel loss to always be much higher in this stage than the acoustic stage. And it will only very gradually go down. Since there are three losses here, keeping an eye on total loss is more useful. It will be a lot less stable than in acoustic, but there is still a clear trend downwards.mel, pitch, and energy should all trend downward but expect mel to be higher than the previous stage.duration and duration_ce losses should both slowly go down. The main danger here is overfitting. So if you see validation loss stagnate or start going up you should stop training even if training loss is still going down. It is expected that one of the losses might plateau before the other.What is a Checkpoint?
To load a checkpoint:
uv:
uv run stylish-train train /path/to/your/config.yml --stage <stage> --out /path/to/your/output --checkpoint /path/to/your/checkpoint
pip:
stylish-train train /path/to/your/config.yml --stage <stage> --out /path/to/your/output --checkpoint /path/to/your/checkpoint
You can load a checkpoint from any stage via the --checkpoint argument.
You still need to set --stage appropriately to one of "alignment|acoustic|textual|duration".
Please note that Stylish TTS checkpoints are NOT compatible with StyleTTS 2 checkpoints.
ONNX (Open Neural Network Exchange) is an open standard format for representing machine learning models.
Only the models actually needed during inference are exported.
They provide a self-contained standalone version of the model optimized for inference.
This command will export two ONNX files, one for predicting duration and the other for predicting speech.
uv:
uv run stylish-train convert /path/to/your/config.yml --duration /path/to/your/duration.onnx --speech /path/to/your/speech.onnx --checkpoint /path/to/your/checkpoint
pip:
stylish-train convert /path/to/your/config.yml --duration /path/to/your/duration.onnx --speech /path/to/your/speech.onnx --checkpoint /path/to/your/checkpoint
Using the ONNX model for Inference:
uv:
uv run stylish-tts speak /path/to/your/output/speech.onnx < /your/phonemes.txt
pip:
uv run stylish-tts speak /path/to/your/output/speech.onnx < /your/phonemes.txt
Your file should contain phonemized text, one utterance per line. The utterances will be automatically concatenated together. Look at the tts/cli.py and tts/stylish_model.py files to see how this is implemented and you can make your own inference workflow using those as your starting point.
Grapheme to Phoneme (G2P)
espeak-ng, though its accuracy can vary depending on the language. In some cases, a simple approach - using word-to-phoneme mappings from sources like Wiktionary - can be sufficient.Adjust model.yml
What is model.yml used for?
model.yml, change the symbol section and text_encoder.tokens.text_encoder.tokens should be equal to length of symbol.pad + symbol.punctuation + symbol.letters + symbol.letters_ipa
...
text_encoder:
tokens: 178 # number of phoneme tokens
hidden_dim: 192
filter_channels: 768
heads: 2
layers: 6
kernel_size: 3
dropout: 0.1
...
symbol:
pad: "$"
punctuation: ";:,.!?¡¿—…\"()“” "
letters: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
letters_ipa: "ɑɐɒæɓʙβɔɕçɗɖðʤəɘɚɛɜɝɞɟʄɡɠɢʛɦɧħɥʜɨɪʝɭɬɫɮʟɱɯɰŋɳɲɴøɵɸθœɶʘɹɺɾɻʀʁɽʂʃʈʧʉʊʋⱱʌɣɤʍχʎʏʑʐʒʔʡʕʢǀǁᵊǃˈˌːˑʼʴʰʱʲʷˠˤ˞↓↑→↗↘'̩'ᵻ"
Pending tasks:
The foundation of this work is StyleTTS and StyleTTS 2
Discriminators
Text Alignment
Pitch Extraction
Text Encoding
Vocoder is a hybrid model with inspiration from several sources
Duration prediction
ONNX Compatibility
Python
97.3%
Jupyter Notebook
2.7%
Complete models are converted to ONNX and so you will need a version of the onnx runtime. TBD: More dependencies as we flesh out inference
If you are using a notebook-based environment (e.g., Colab or Kaggle), launch the training notebook via:
Direct notebook link: train-stylish.ipynb
Instructions are provided for both uv or pip. Install your preferred Python package manager and refer to the associated instructions.
# Create a folder for your uv project
mkdir my-training-dir
cd my-training-dir
# stylish-tts currently uses Python 3.12
uv init --python 3.12
# Clone the stylish-tts source somewhere (TODO: Fix this when we upload a package)
git clone https://github.com/Stylish-TTS/stylish-tts.git
# Install pytorch and onnx.
# Use onnxruntime-gpu if you want to do test inference with a GPU.
uv add torch torchaudio onnxruntime requests beautifulsoup4
# Auto-detect OS, Python, and PyTorch versions to fetch and install the compatible k2 wheel.
uv run stylish-tts/get_k2_whl.py > k2_whl.txt && uv add -r k2_whl.txt
# Verify that k2 was installed successfully
uv run python -c "import k2; print('k2 installed successfully')"
# Install stylish-tts as a local editable package
# Automatically rebuilds if contents change
# IMPORTANT: Don't forget the trailing slash /
uv add --editable stylish-tts/
# stylish-tts currently uses Python 3.12
# Use pyenv or equivalent to ensure the venv uses Python 3.12
# pyenv install 3.12.7 && pyenv local 3.12.7
# Ensure pip is installed via your package manager
# Create a folder for your uv project
mkdir my-training-dir
cd my-training-dir
# Set up virtual environment
python3.12 -m venv venv
# Activate virtual environment (needs to be done every time you begin a new session)
source venv/bin/activate
# Clone the stylish-tts source somewhere (TODO: Fix this when we upload a package)
git clone https://github.com/Stylish-TTS/stylish-tts.git
# Install pytorch and onnx.
# Use onnxruntime-gpu if you want to do test inference with a GPU.
pip install torch torchaudio onnxruntime requests beautifulsoup4
# Auto-detect OS, Python, and PyTorch versions to fetch and install the compatible k2 wheel.
python stylish-tts/get_k2_whl.py > k2_whl.txt && pip install -r k2_whl.txt
# Verify that k2 was installed successfully
python -c "import k2; print('k2 installed successfully')"
# Install stylish-tts as a local editable package from the stylish-tts/ directory.
# Automatically rebuilds if contents change.
# IMPORTANT: Don't forget the trailing slash /
pip install -e stylish-tts/
tensorboard is a separate application you can run which lets you see graphs of your loss functions and listen to samples produced at each validation.
train.log file, but this tends to be less useful than the interactive graphs provided by tensorboard.The latest versions of PyTorch can drop support for older GPUs. If you have an old GPU:
torch and torchaudio which supports your GPU. If your GPU is older and requires you to use an older version of torch, make sure to use the same version of torchaudio during training.torch for training, make a separate virtual environment/directory to use during model conversion and use a device of cpu and the latest version of torch for project conversion. This will ensure that you are converting using the most up-to-date version of Torch Dynamo.In order to train your model, you will need:
config.yml file (say my_config.yml) created from the template here. You can store it anywhere, like at the root of your project. training:
log_interval: 1000
save_interval: 5000
val_interval: 5000
device: "cuda"
mixed_precision: "no"
vram_reserve: 200
data_workers: 32
log_interval, save_interval, and val_interval are all in steps.device ("cuda", "mps", "cpu" or whatever will work with your torch installation).vram_reserve allocates an extra block of memory when probing how big batch sizes can be. It reduces the odds of having out-of-memory events.data_workers sets how many processes will be used to prepare data for training. If your GPU is under-utilized and you have spare CPU cores, you can set this higher to go faster.
data_workers to 0 for now. There is a known issue with dataloader concurrency that we are looking into.training_plan:
alignment:
epochs: 20
probe_batch_max: 128
lr: 1e-5
acoustic:
epochs: 10
probe_batch_max: 16
lr: 1e-4
textual:
epochs: 10
probe_batch_max: 16
lr: 3e-5
style:
epochs: 50
probe_batch_max: 128
lr: 1e-5
duration:
epochs: 50
probe_batch_max: 128
lr: 1e-4
The training_plan section provides parameters for each stage of training. With more testing we'll provide concrete guidelines for each of this.
lr) alone as this has been tuned.epochs.
acoustic and textual stages are SLOW. The other stages are FAST.acoustic and textual.probe_batch_max. TODO: Guidanceprobe_max_batch to 2 for every stage. The batch probing works by pushing until it runs out of memory. That will make you sad if this is system memory instead of VRAM memory.The path should be the root of your dataset, and the various other paths in this section are relative to that root. If you use the default file and directory names, your directory structure will look something like this:
dataset:
# All paths in this section are relative to the main path
path: "../my_dataset/"
train_data: "training-list.txt"
val_data: "validation-list.txt"
wav_path: "wav-dir"
pitch_path: "pitch.safetensors"
alignment_path: "alignment.safetensors"
alignment_model_path: "alignment_model.safetensors"
The structure of your dataset folder from this example would look like this:
../my_dataset/ # Root
|
+-> training-list.txt # Training list file (described below)
|
+-> validation-list.txt # Validation list file (described below)
|
+-> wav-dir # Folder with audio wav files, one for each segment
| |
| +-> something.wav
| |
| +-> other.wav
| |
| +-> ...
|
+-> pitch.safetensors # Pre-cached segment pitches (file gets generated at `pitch_path` in `my_config.yml`. See below)
|
+-> alignment.safetensors # Pre-cached alignments (file gets generated at `alignment_path` in `my_config.yml`. See below)
|
+-> alignment_model.safetensors # Model for generating alignments. You will train this (gets generated at `alignment_model_path` in `my_config.yml`. See below)
validation section allows you to adjust which samples are exported to tensorflow.loss_weight section provides relative weights for different kinds of loss. These are tuned and should not be changed unless you know what you are doing.Note: A sample dataset can be found at sample_dataset/. Please note that this has been provided as a reference only, and will in no way be sufficient to train a model.
A dataset consists of many segments. Each segment has a written text and an audio file where that text is spoken by a reader.
Your dataset should have the following files:
my_config.yml)my_config.yml)my_config.yml)Segment Length Distribution:
Training List and Validation List:
<filename>|<phonemes>|<speaker-id>|<plaintext>1.wav|ɔnðə kˈɑːntɹɛɹi|0|On the contrary2.wav|fɚðə fˈɜːst tˈaɪm|0|For the first timemy_config.yml.espeak-ng (or a similar G2P system) to create phonemes corresponding to each audio file.Stylish TTS uses a pre-cached ground truth pitch (F0) for all your segments. To generate these pitches, run:
uv:
uv run stylish-train pitch /path/to/your/config.yml --workers 16
pip:
stylish-train pitch /path/to/your/config.yml --workers 16
The number of workers should be approximately equal to the number of cores on your machine.
By default, Harvest, which is a CPU-based system, is used to extract pitch. If you find this to be too slow, there is also a GPU-based option available by passing --method rmvpe from the command line. When finished, it will write the pre-cached segment pitches at the pitch_path file path specified by your my_config.yml.
Alignment data is also pre-cached. This is a multi-step process, but only needs to be done ONCE for your dataset, after which you can just use the cached results (similar to the generated pitch data).
First, you need to train your own alignment model:
uv:
uv run stylish-train train-align /path/to/your/config.yml --out /path/to/your/output
pip:
stylish-train train-align /path/to/your/config.yml --out /path/to/your/output
--out option is where logs and checkpoints will end up.my_config.yml.We will use this model to generate the alignments:
uv:
uv run stylish-train align /path/to/your/config.yml
pip:
stylish-train align /path/to/your/config.yml
This generates the actual cached alignments for all the segments in both the training and validation data as configured in your config.yml. It outputs its results to the alignment file from your my_config.yml.
stylish-tts align generates a "confidence value" score for every segment it processes. These scores are written to files in your dataset path.Here is a typical command to start off a new training run:
uv:
uv run stylish-train train /path/to/your/config.yml --out /path/to/your/output
pip:
stylish-train train /path/to/your/config.yml --out /path/to/your/output
All checkpoint, training logs, and tensorboard data are sent to the path you specify with --out.
Make sure to have plenty of disk space available here as checkpoints can take a large amount of storage.
Expectations During Training
screen or tmux to have a persistent shell that won't disappear if you get disconnected or close the window.acoustic, textual, style, and duration.acoustic stage by default.--stage option, which is necessary if you are resuming from a checkpoint.my_config.yml settings.out, and its own training log and tensorboard graphs/samples.mel which is a perceptual similarity of the generated audio to the ground truth. It should slowly decrease during training, but the exact point at which it converges will depend on your dataset. The other loss figures can generally be ignored and may not vary much during training.mel, pitch, and energy losses are all important. You should expect mel loss to always be much higher in this stage than the acoustic stage. And it will only very gradually go down. Since there are three losses here, keeping an eye on total loss is more useful. It will be a lot less stable than in acoustic, but there is still a clear trend downwards.mel, pitch, and energy should all trend downward but expect mel to be higher than the previous stage.duration and duration_ce losses should both slowly go down. The main danger here is overfitting. So if you see validation loss stagnate or start going up you should stop training even if training loss is still going down. It is expected that one of the losses might plateau before the other.What is a Checkpoint?
To load a checkpoint:
uv:
uv run stylish-train train /path/to/your/config.yml --stage <stage> --out /path/to/your/output --checkpoint /path/to/your/checkpoint
pip:
stylish-train train /path/to/your/config.yml --stage <stage> --out /path/to/your/output --checkpoint /path/to/your/checkpoint
You can load a checkpoint from any stage via the --checkpoint argument.
You still need to set --stage appropriately to one of "alignment|acoustic|textual|duration".
Please note that Stylish TTS checkpoints are NOT compatible with StyleTTS 2 checkpoints.
ONNX (Open Neural Network Exchange) is an open standard format for representing machine learning models.
Only the models actually needed during inference are exported.
They provide a self-contained standalone version of the model optimized for inference.
This command will export two ONNX files, one for predicting duration and the other for predicting speech.
uv:
uv run stylish-train convert /path/to/your/config.yml --duration /path/to/your/duration.onnx --speech /path/to/your/speech.onnx --checkpoint /path/to/your/checkpoint
pip:
stylish-train convert /path/to/your/config.yml --duration /path/to/your/duration.onnx --speech /path/to/your/speech.onnx --checkpoint /path/to/your/checkpoint
Using the ONNX model for Inference:
uv:
uv run stylish-tts speak /path/to/your/output/speech.onnx < /your/phonemes.txt
pip:
uv run stylish-tts speak /path/to/your/output/speech.onnx < /your/phonemes.txt
Your file should contain phonemized text, one utterance per line. The utterances will be automatically concatenated together. Look at the tts/cli.py and tts/stylish_model.py files to see how this is implemented and you can make your own inference workflow using those as your starting point.
Grapheme to Phoneme (G2P)
espeak-ng, though its accuracy can vary depending on the language. In some cases, a simple approach - using word-to-phoneme mappings from sources like Wiktionary - can be sufficient.Adjust model.yml
What is model.yml used for?
model.yml, change the symbol section and text_encoder.tokens.text_encoder.tokens should be equal to length of symbol.pad + symbol.punctuation + symbol.letters + symbol.letters_ipa
...
text_encoder:
tokens: 178 # number of phoneme tokens
hidden_dim: 192
filter_channels: 768
heads: 2
layers: 6
kernel_size: 3
dropout: 0.1
...
symbol:
pad: "$"
punctuation: ";:,.!?¡¿—…\"()“” "
letters: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
letters_ipa: "ɑɐɒæɓʙβɔɕçɗɖðʤəɘɚɛɜɝɞɟʄɡɠɢʛɦɧħɥʜɨɪʝɭɬɫɮʟɱɯɰŋɳɲɴøɵɸθœɶʘɹɺɾɻʀʁɽʂʃʈʧʉʊʋⱱʌɣɤʍχʎʏʑʐʒʔʡʕʢǀǁᵊǃˈˌːˑʼʴʰʱʲʷˠˤ˞↓↑→↗↘'̩'ᵻ"
Pending tasks:
The foundation of this work is StyleTTS and StyleTTS 2
Discriminators
Text Alignment
Pitch Extraction
Text Encoding
Vocoder is a hybrid model with inspiration from several sources
Duration prediction
ONNX Compatibility
Python
97.3%
Jupyter Notebook
2.7%