Evaluation Protocol for Large-Scale Zero-Shot TTS Literature
Python
98
13 commits
updated Mar 12, 2025
The author's officially unofficial PyTorch implementation of the evaluation protocol for DiTTo-TTS: Diffusion Transformers for Scalable Text-to-Speech without Domain-Specific Factors (ICLR'25) [demo].
The goal of this project is to establish an open-source evaluation protocol by reproducing the evaluation setup and results from large-scale zero-shot TTS literature, contributing to future research by enabling the proposal of new models through reliable and fair evaluation.
Recently, following the pioneering work of VALL-E [1], there has been significant research on large-scale zero-shot TTS models (e.g., NaturalSpeech series [2,3,4], Voicebox [5], CLaM-TTS [6], DiTTo-TTS [7]). These models have been evaluated against each other using the methods established by VALL-E [1], but there is still no widely agreed-upon, publicly accessible evaluation protocol. To contribute to fair and straightforward performance evaluation and to facilitate future research based on that, we propose an evaluation protocol that can reproduce these evaluations and make it open source.
The following is an excerpt of the model performances listed in Tables 1 & 2 of the CLaM-TTS [6] and DiTTo-TTS [7]. The scores reproduced by our project are indicated as (Β·), demonstrating that we have successfully reproduced their evaluation method.
| Model | WER β | CER β | SIM-o β | SIM-r β |
|---|---|---|---|---|
| Ground Truth | 2.2 (2.15) | 0.61 (0.61) | 0.754 (0.7395) | - |
| YourTTS [8] | 7.57 (7.70) | 3.06 (3.09) | 0.3928 | - |
| VALL-E [1] | 3.8 | - | 0.452 | 0.508 |
| VALL-E (unofficial) | 3.81 (3.79) | 1.58 (1.55) | 0.2875 (0.2870) | 0.3433 (0.3428) |
| Voicebox [5] | 2.0 | - | 0.593 | 0.616 |
| CLAM-TTS [6] | 2.36 | 0.79 | 0.4767 | 0.5128 |
| DiTTo-en-XL [7] | 1.78 | 0.48 | 0.5773 | 0.6075 |
| Model | WER β | CER β | SIM-o β | SIM-r β |
|---|---|---|---|---|
| YourTTS [8] | 7.92 (7.85) | 3.18 (3.21) | 0.3755 (0.3728) | - |
| VALL-E [1] | 5.9 | - | - | 0.580 |
| VALL-E (unofficial) | 7.63 (7.54) | 3.65 (3.62) | 0.3031 (0.3031) | 0.3700 (0.3699) |
| Voicebox [5] | 1.9 | - | 0.662 | 0.681 |
| CLAM-TTS [6] | 5.11 | 2.87 | 0.4951 | 0.5382 |
| DiTTo-en-XL [7] | 2.56 | 0.89 | 0.6270 | 0.6554 |
In addition to the provided models, it is also possible and very easy to add a new research model. Feel free to submit a pull requestβwe look forward to seeing some amazing models added!
This implementation has been tested on torch==2.2.2+cud118 with Python 3.8.19, assuming the availability of a single GPU.
Clone this repository and navigate to it in your terminal. Then run:
python -m pip install --editable .
This should install evaluate_zero_shot_tts python package that the scripts depend on.
If you only want to evaluate yourtts, you can install the dependencies listed in requirements_inference.txt. We provide all the necessary checkpoints related to the YourTTS model, including the pre-trained model and inference tools, via Git LFS.
To install the requirements for valle_lifeiteng, first install the packages listed in requirements_inference.txt, and then proceed with the following steps.
pip install attridict torchmetrics==0.11.1
# Please set the PyTorch and CUDA driver versions according to your environment (following https://k2-fsa.github.io/k2/installation/from_wheels.html#linux-cuda-example).
pip install k2==1.24.4.dev20240328+cuda11.8.torch2.2.2 -f https://k2-fsa.github.io/k2/cuda.html
pip install lhotse
cd /tmp
git clone https://github.com/k2-fsa/icefall
cd icefall
pip install -r requirements.txt
export PYTHONPATH=/tmp/icefall:$PYTHONPATH
pip install -U encodec
apt-get install espeak-ng
pip install phonemizer==3.2.1 pypinyin==0.48.0
We use a checkpoint trained for 100 epochs with the LibriTTS dataset, shared by @dohe0342, to generate samples for testing. After obtaining the checkpoint via a request to @dohe0342, please place it in the following path: src/models/valle_lifeiteng/ckpt/epoch-100.pt. If you choose to store it in a different location, make sure to update the "checkpoint" value in the attridict of the args variable in src/models/valle_lifeiteng/inference.py to reflect the new path.
To conduct the evaluation, set up the environment using requirements_evaluation.txt, which includes the necessary dependencies for the models used in metric measurement.
Following the evaluation setting in VALL-E [1], we use a subset of the LibriSpeech test-clean dataset. This subset consists of speech clips ranging from 4 to 10 seconds (results in about 2.2 hours), each with a corresponding transcript.
We have constructed the Evalset according to the following structure and criteria, which can be downloaded here.
evalset
βββ librispeech-test-clean
β βββ exp_aligned_pl3_r3
β β βββ {FILE_NAME}_wav_c_{TRIAL_ID}.txt
β β βββ {FILE_NAME}_wav_c_{TRIAL_ID}.wav
β β βββ {FILE_NAME}_wav_g.txt
β β βββ {FILE_NAME}_wav_g.wav
β β βββ {FILE_NAME}_wav_p_{TRIAL_ID}.txt
β β βββ {FILE_NAME}_wav_p_{TRIAL_ID}.wav
β β βββ {FILE_NAME}_wav_pg_{TRIAL_ID}.txt
β β βββ {FILE_NAME}_wav_pg_{TRIAL_ID}.wav
β β ...
β βββ exp_base_pl3_r3
β β ...
...
exp_aligned_pl3_r3 involves word-level prompts cut based on forced-alignment information, as proposed in CLaM-TTS [6], to span a maximum of 3 seconds. exp_base_pl3_r3 involves prompts strictly sliced to 3 seconds. The pl3 notation indicates that the prompt length is capped at a maximum of 3 seconds.r3 notation indicates a total of 3 trials.wav_p), using a 3-second clip from another sample of the same speaker as audio context, and continuation (samples marked as wav_c), using the first 3 seconds of each utterance. For wav_p, we randomly selected another utterance from the same speaker and used a cropped segment.*_wav_g.txt using the speaker information contained in either wav_p or wav_c. wav_pg refers to the original audio before wav_p was cropped, and wav_g corresponds to the ground truth audio that the model's output is compared against. FILE_NAME is the ID assigned to wav_g from the original LibriSpeech test-clean subset.If you are planning a new Evalset, you can easily add it by simply following the same dataset structure.
You can generate the audio for each task and model using the following command:
python inference.py --dataset_key {DATASET_NAME} --model_name {MODEL_NAME} --task_key {TASK_NAME}
librispeech-test-clean.yourtts or valle_lifeiteng.cross or cont.The generated results will be saved in the following path: samples/{DATASET_NAME}/{MODEL_NAME}/exp_{aligned|base}_pl3_r3_{RUN_ID}. RUN_ID is a unique key generated based on the timestamp. For specific examples, please refer to scripts/inference_examples.sh.
CLaM-TTS [6] adopted an evaluation method that integrates existing approaches, and we follow this method for reproduction.
src/utils/speaker_verification/ckpt/wavlm_large_finetune.pth. We also borrow the definition of SIM-o and SIM-r from Voicebox [5]. SIM-o measures the similarity between the generated and the original target speeches, while SIM-r measures the similarity concerning the target speech reconstructed from the original speech.large-v2 model. We adopt NVIDIA's NeMo-text-processing for text normalization.We follow the procedures of CLaM-TTS [6] and DiTTo-TTS [7], using the exp_aligned_pl3_r3 subset for the cross-sentence task and the exp_base_pl3_r3 subset for the continuation task. The evaluation for each task can be executed using the command below.
python evaluate.py -m {METRIC_NAME} -e {METRIC_MODEL} -t {TASK_NAME} -d {SAMPLE_DIR}
wer, cer, sim_o, or sim_r.hubert, whisper, or wavlmuni.wav_p, wav_c, or wav_g. In wav_g, the Ground Truth score from Table 1 is measured. SIM-o measures the similarity between wav_pg and wav_g.samples/{DATASET_NAME}/{MODEL_NAME}/exp_{aligned|base}_pl3_r3_{RUN_ID}.The results will be saved in the following path: results/{DATASET_NAME}/{MODEL_NAME}. For specific examples, please refer to scripts/evaluate_examples.sh.
Please cite this repository by the "Cite this repository" of About section (top right of the main page).
Dong Won Kim (@ddwkim) for the implementation of metric calculation.
Python
92.0%
Jupyter Notebook
6.3%
Shell
1.3%
Evaluation Protocol for Large-Scale Zero-Shot TTS Literature
Python
98
13 commits
updated Mar 12, 2025
The author's officially unofficial PyTorch implementation of the evaluation protocol for DiTTo-TTS: Diffusion Transformers for Scalable Text-to-Speech without Domain-Specific Factors (ICLR'25) [demo].
The goal of this project is to establish an open-source evaluation protocol by reproducing the evaluation setup and results from large-scale zero-shot TTS literature, contributing to future research by enabling the proposal of new models through reliable and fair evaluation.
Recently, following the pioneering work of VALL-E [1], there has been significant research on large-scale zero-shot TTS models (e.g., NaturalSpeech series [2,3,4], Voicebox [5], CLaM-TTS [6], DiTTo-TTS [7]). These models have been evaluated against each other using the methods established by VALL-E [1], but there is still no widely agreed-upon, publicly accessible evaluation protocol. To contribute to fair and straightforward performance evaluation and to facilitate future research based on that, we propose an evaluation protocol that can reproduce these evaluations and make it open source.
The following is an excerpt of the model performances listed in Tables 1 & 2 of the CLaM-TTS [6] and DiTTo-TTS [7]. The scores reproduced by our project are indicated as (Β·), demonstrating that we have successfully reproduced their evaluation method.
| Model | WER β | CER β | SIM-o β | SIM-r β |
|---|---|---|---|---|
| Ground Truth | 2.2 (2.15) | 0.61 (0.61) | 0.754 (0.7395) | - |
| YourTTS [8] | 7.57 (7.70) | 3.06 (3.09) | 0.3928 | - |
| VALL-E [1] | 3.8 | - | 0.452 | 0.508 |
| VALL-E (unofficial) | 3.81 (3.79) | 1.58 (1.55) | 0.2875 (0.2870) | 0.3433 (0.3428) |
| Voicebox [5] | 2.0 | - | 0.593 | 0.616 |
| CLAM-TTS [6] | 2.36 | 0.79 | 0.4767 | 0.5128 |
| DiTTo-en-XL [7] | 1.78 | 0.48 | 0.5773 | 0.6075 |
| Model | WER β | CER β | SIM-o β | SIM-r β |
|---|---|---|---|---|
| YourTTS [8] | 7.92 (7.85) | 3.18 (3.21) | 0.3755 (0.3728) | - |
| VALL-E [1] | 5.9 | - | - | 0.580 |
| VALL-E (unofficial) | 7.63 (7.54) | 3.65 (3.62) | 0.3031 (0.3031) | 0.3700 (0.3699) |
| Voicebox [5] | 1.9 | - | 0.662 | 0.681 |
| CLAM-TTS [6] | 5.11 | 2.87 | 0.4951 | 0.5382 |
| DiTTo-en-XL [7] | 2.56 | 0.89 | 0.6270 | 0.6554 |
In addition to the provided models, it is also possible and very easy to add a new research model. Feel free to submit a pull requestβwe look forward to seeing some amazing models added!
This implementation has been tested on torch==2.2.2+cud118 with Python 3.8.19, assuming the availability of a single GPU.
Clone this repository and navigate to it in your terminal. Then run:
python -m pip install --editable .
This should install evaluate_zero_shot_tts python package that the scripts depend on.
If you only want to evaluate yourtts, you can install the dependencies listed in requirements_inference.txt. We provide all the necessary checkpoints related to the YourTTS model, including the pre-trained model and inference tools, via Git LFS.
To install the requirements for valle_lifeiteng, first install the packages listed in requirements_inference.txt, and then proceed with the following steps.
pip install attridict torchmetrics==0.11.1
# Please set the PyTorch and CUDA driver versions according to your environment (following https://k2-fsa.github.io/k2/installation/from_wheels.html#linux-cuda-example).
pip install k2==1.24.4.dev20240328+cuda11.8.torch2.2.2 -f https://k2-fsa.github.io/k2/cuda.html
pip install lhotse
cd /tmp
git clone https://github.com/k2-fsa/icefall
cd icefall
pip install -r requirements.txt
export PYTHONPATH=/tmp/icefall:$PYTHONPATH
pip install -U encodec
apt-get install espeak-ng
pip install phonemizer==3.2.1 pypinyin==0.48.0
We use a checkpoint trained for 100 epochs with the LibriTTS dataset, shared by @dohe0342, to generate samples for testing. After obtaining the checkpoint via a request to @dohe0342, please place it in the following path: src/models/valle_lifeiteng/ckpt/epoch-100.pt. If you choose to store it in a different location, make sure to update the "checkpoint" value in the attridict of the args variable in src/models/valle_lifeiteng/inference.py to reflect the new path.
To conduct the evaluation, set up the environment using requirements_evaluation.txt, which includes the necessary dependencies for the models used in metric measurement.
Following the evaluation setting in VALL-E [1], we use a subset of the LibriSpeech test-clean dataset. This subset consists of speech clips ranging from 4 to 10 seconds (results in about 2.2 hours), each with a corresponding transcript.
We have constructed the Evalset according to the following structure and criteria, which can be downloaded here.
evalset
βββ librispeech-test-clean
β βββ exp_aligned_pl3_r3
β β βββ {FILE_NAME}_wav_c_{TRIAL_ID}.txt
β β βββ {FILE_NAME}_wav_c_{TRIAL_ID}.wav
β β βββ {FILE_NAME}_wav_g.txt
β β βββ {FILE_NAME}_wav_g.wav
β β βββ {FILE_NAME}_wav_p_{TRIAL_ID}.txt
β β βββ {FILE_NAME}_wav_p_{TRIAL_ID}.wav
β β βββ {FILE_NAME}_wav_pg_{TRIAL_ID}.txt
β β βββ {FILE_NAME}_wav_pg_{TRIAL_ID}.wav
β β ...
β βββ exp_base_pl3_r3
β β ...
...
exp_aligned_pl3_r3 involves word-level prompts cut based on forced-alignment information, as proposed in CLaM-TTS [6], to span a maximum of 3 seconds. exp_base_pl3_r3 involves prompts strictly sliced to 3 seconds. The pl3 notation indicates that the prompt length is capped at a maximum of 3 seconds.r3 notation indicates a total of 3 trials.wav_p), using a 3-second clip from another sample of the same speaker as audio context, and continuation (samples marked as wav_c), using the first 3 seconds of each utterance. For wav_p, we randomly selected another utterance from the same speaker and used a cropped segment.*_wav_g.txt using the speaker information contained in either wav_p or wav_c. wav_pg refers to the original audio before wav_p was cropped, and wav_g corresponds to the ground truth audio that the model's output is compared against. FILE_NAME is the ID assigned to wav_g from the original LibriSpeech test-clean subset.If you are planning a new Evalset, you can easily add it by simply following the same dataset structure.
You can generate the audio for each task and model using the following command:
python inference.py --dataset_key {DATASET_NAME} --model_name {MODEL_NAME} --task_key {TASK_NAME}
librispeech-test-clean.yourtts or valle_lifeiteng.cross or cont.The generated results will be saved in the following path: samples/{DATASET_NAME}/{MODEL_NAME}/exp_{aligned|base}_pl3_r3_{RUN_ID}. RUN_ID is a unique key generated based on the timestamp. For specific examples, please refer to scripts/inference_examples.sh.
CLaM-TTS [6] adopted an evaluation method that integrates existing approaches, and we follow this method for reproduction.
src/utils/speaker_verification/ckpt/wavlm_large_finetune.pth. We also borrow the definition of SIM-o and SIM-r from Voicebox [5]. SIM-o measures the similarity between the generated and the original target speeches, while SIM-r measures the similarity concerning the target speech reconstructed from the original speech.large-v2 model. We adopt NVIDIA's NeMo-text-processing for text normalization.We follow the procedures of CLaM-TTS [6] and DiTTo-TTS [7], using the exp_aligned_pl3_r3 subset for the cross-sentence task and the exp_base_pl3_r3 subset for the continuation task. The evaluation for each task can be executed using the command below.
python evaluate.py -m {METRIC_NAME} -e {METRIC_MODEL} -t {TASK_NAME} -d {SAMPLE_DIR}
wer, cer, sim_o, or sim_r.hubert, whisper, or wavlmuni.wav_p, wav_c, or wav_g. In wav_g, the Ground Truth score from Table 1 is measured. SIM-o measures the similarity between wav_pg and wav_g.samples/{DATASET_NAME}/{MODEL_NAME}/exp_{aligned|base}_pl3_r3_{RUN_ID}.The results will be saved in the following path: results/{DATASET_NAME}/{MODEL_NAME}. For specific examples, please refer to scripts/evaluate_examples.sh.
Please cite this repository by the "Cite this repository" of About section (top right of the main page).
Dong Won Kim (@ddwkim) for the implementation of metric calculation.
Python
92.0%
Jupyter Notebook
6.3%
Shell
1.3%