模型简介
模型特点
模型能力
使用案例
🚀 Parler-TTS Mini: Expresso
Parler-TTS Mini: Expresso 是基于 Expresso 数据集对 Parler-TTS Mini v0.1 进行微调后的版本。它是一个轻量级的文本转语音(TTS)模型,能够生成高质量、自然流畅的语音。与原始模型相比,Parler-TTS Expresso 在 情感(快乐、困惑、大笑、悲伤)和 稳定音色(杰瑞、托马斯、伊丽莎白、塔莉亚)方面提供了更出色的控制能力。
它是 Parler-TTS 项目首次发布的一部分,该项目旨在为社区提供 TTS 训练资源和数据集预处理代码。有关重现整个训练过程的详细信息,请参阅 训练过程 部分。

🚀 快速开始
使用 Expresso 就像说 “bonjour” 一样简单。只需从源代码安装库:
pip install git+https://github.com/huggingface/parler-tts.git
然后,您可以使用以下推理代码片段来使用该模型:
import torch
from parler_tts import ParlerTTSForConditionalGeneration
from transformers import AutoTokenizer, set_seed
import soundfile as sf
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model = ParlerTTSForConditionalGeneration.from_pretrained("parler-tts/parler-tts-mini-expresso").to(device)
tokenizer = AutoTokenizer.from_pretrained("parler-tts/parler-tts-mini-expresso")
prompt = "Why do you make me do these examples? They're *so* generic."
description = "Thomas speaks moderately slowly in a sad tone with emphasis and high quality audio."
input_ids = tokenizer(description, return_tensors="pt").input_ids.to(device)
prompt_input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to(device)
set_seed(42)
generation = model.generate(input_ids=input_ids, prompt_input_ids=prompt_input_ids)
audio_arr = generation.cpu().numpy().squeeze()
sf.write("parler_tts_out.wav", audio_arr, model.config.sampling_rate)
💡 使用建议
- 指定男性说话者(杰瑞、托马斯)或女性说话者(塔莉亚、伊丽莎白)的姓名,以获得稳定的音色。
- 模型可以生成多种情感的语音,包括:“快乐”、“困惑”、“默认”(即不传达特定情感)、“大笑”、“悲伤”、“低语”、“强调”。
- 包含 “高质量音频” 一词以生成最高质量的音频,包含 “非常嘈杂的音频” 以生成具有高背景噪音的音频。
- 可以使用标点符号来控制生成语音的韵律,例如使用逗号在语音中添加小停顿。
- 要强调特定的单词,请将它们用星号括起来(例如上面示例中的
*you*
),并在提示中包含 “强调”。
✨ 主要特性
- 高质量语音生成:能够生成自然、流畅的语音。
- 情感和音色控制:可以控制语音的情感和音色。
- 轻量级模型:易于部署和使用。
📦 安装指南
从源代码安装库:
pip install git+https://github.com/huggingface/parler-tts.git
💻 使用示例
基础用法
import torch
from parler_tts import ParlerTTSForConditionalGeneration
from transformers import AutoTokenizer, set_seed
import soundfile as sf
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model = ParlerTTSForConditionalGeneration.from_pretrained("parler-tts/parler-tts-mini-expresso").to(device)
tokenizer = AutoTokenizer.from_pretrained("parler-tts/parler-tts-mini-expresso")
prompt = "Why do you make me do these examples? They're *so* generic."
description = "Thomas speaks moderately slowly in a sad tone with emphasis and high quality audio."
input_ids = tokenizer(description, return_tensors="pt").input_ids.to(device)
prompt_input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to(device)
set_seed(42)
generation = model.generate(input_ids=input_ids, prompt_input_ids=prompt_input_ids)
audio_arr = generation.cpu().numpy().squeeze()
sf.write("parler_tts_out.wav", audio_arr, model.config.sampling_rate)
📚 详细文档
训练过程
Expresso 是一个高质量、富有表现力的语音数据集,包含来自四位说话者(两名男性、两名女性)的样本。通过在该数据集上微调 Parler-TTS Mini v0.1,我们可以训练模型以遵循情感和说话者提示。
要重现此微调过程,我们需要执行两个步骤:
- 从 Expresso 数据集中的音频样本创建文本描述。
- 在(文本,音频)对上训练模型。
步骤 1 使用 DataSpeech 库执行,步骤 2 使用 Parler-TTS 执行。如果您希望使用我们实验中预先标注的数据集,可以直接跳到 步骤 2。对于这两个步骤,您可以按照步骤 0 进行设置。
步骤 0: 设置
首先,创建一个新的 Python 环境:
python3 -m venv parler-env
source parler-env/bin/activate
接下来,根据 官方说明 安装 PyTorch。然后,依次安装 DataSpeech 和 Parler-TTS:
git clone git@github.com:huggingface/dataspeech.git && cd dataspeech && pip install -r requirements.txt
cd ..
git clone https://github.com/huggingface/parler-tts.git && cd parler-tts && pip install -e ."[train]"
cd ..
您可以链接您的 Hugging Face 账户,以便将模型仓库推送到 Hub。这将允许您将训练好的模型保存在 Hub 上,以便与社区共享。只需运行以下命令:
git config --global credential.helper store
huggingface-cli login
然后从 https://huggingface.co/settings/tokens 输入一个认证令牌。如果您还没有令牌,请创建一个新的令牌。确保此令牌具有 “写入” 权限。
您还可以选择通过运行以下命令来配置 Accelerate。请注意,您应该根据您的设备设置要用于训练/推理的 GPU 数量以及数据类型(dtype)(例如,A100 GPU 上使用 bfloat16,V100 GPU 上使用 float16 等):
accelerate config
可选地,您还可以登录 Weights and Biases 以进行自动日志记录:
wandb login
步骤 1: 创建文本描述
为数据集创建文本描述包括 DataSpeech 的三个子阶段,下面将进行介绍。
1.A. 标注 Expresso 数据集
我们将使用 DataSpeech 中的 main.py
文件来标注以下连续变量:
- 说话速率
- 信噪比(SNR)
- 混响
- 语音单调性
可以使用以下命令完成此操作:
python ./dataspeech/main.py "ylacombe/expresso" \
--configuration "default" \
--text_column_name "text" \
--audio_column_name "audio" \
--cpu_num_workers 8 \
--rename_column \
--repo_id "expresso-tags"
请注意,如果您有可用的 GPU,脚本将运行得更快。它将自动扩展到环境中可用的每个 GPU。要控制在哪些 GPU 上运行脚本,请考虑通过 CUDA_VISIBLE_DEVICES
环境变量进行指定。
生成的数据集将以您的 Hugging Face 用户名推送到 Hugging Face Hub。我的数据集被推送到了 reach-vb/expresso-tags。我们可以看到,数据集标注了 “说话速率” 和 “信噪比” 等连续特征。
1.B. 将标注映射到文本区间
下一步是将连续变量映射到离散变量。这通过将连续变量分桶并为每个桶分配一个文本标签来实现。
由于这里的最终目标是在 Expresso 数据集上微调 Parler-TTS v0.1 检查点,我们希望与原始模型训练数据集的文本区间保持一致。
为此,我们将把 v01_bin_edges.json
作为输入参数传递给我们的脚本,该文件包含原始数据集的分桶边界:
python ./dataspeech/scripts/metadata_to_text.py \
"reach-vb/expresso-tags" \
--repo_id "expresso-tags" \
--configuration "default" \
--cpu_num_workers "8" \
--path_to_bin_edges "./examples/tags_to_annotations/v01_bin_edges.json" \
--avoid_pitch_computation
由于我们利用了原始数据集的分桶,上述脚本只需要几秒钟。生成的数据集将以您的 Hugging Face 用户名推送到 Hugging Face Hub。我的数据集被推送到了 reach-vb/expresso-tags。
您可以注意到,样本中添加了 “略有噪音”、“相当单调” 等文本区间。
1.C. 从这些文本区间创建自然语言描述
现在我们已经为 Expresso 数据集关联了文本区间,下一步是创建自然语言描述。这涉及将文本区间传递给大语言模型(LLM),并让它生成相应的描述。
Parler-TTS 中有一个模板 提示创建脚本,可用于从 步骤 1.A 中标记的特征(混响、噪音、说话速率等)生成描述。
然而,并非所有这些特征都与 Expresso 数据集相关。例如,Expresso 是在专业录音室录制的,因此所有样本都是高质量的。因此,我们选择使用以下特征子集创建提示:
-
姓名:我们将说话者 ID(ex1、ex2、ex3、ex4)映射到唯一的说话者姓名(杰瑞、伊丽莎白、托马斯、塔莉亚)。这鼓励模型从训练数据中学习特定的说话者。
-
情感:我们包括 Expresso 数据集中提供的情感。
-
说话速率:我们使用上一步预先计算的文本区间。
-
此外,考虑到录音室的录制条件,我们还将音频质量硬编码为 “非常高质量”。
例如,如果我们传递以下信息:
- 说话者:杰瑞
- 情感:困惑
- 说话速率:中等速度
我们期望生成类似 “杰瑞以困惑的语气和中等速度说话,音频质量很高。” 的样本。
修改后的提示创建脚本可以在这个仓库中找到。您可以使用以下 Python 命令下载此脚本:
from huggingface_hub import hf_hub_download
hf_hub_download(repo_id="parler-tts/parler-tts-mini-expresso", filename="run_prompt_creation.py", local_dir="./run_prompt_creation_expresso.py")
然后,您可以使用 Mistral Instruct 7B 模型通过以下命令启动提示创建:
accelerate launch ./dataspeech/run_prompt_creation_expresso.py \
--dataset_name "reach-vb/expresso-tags" \
--dataset_config_name "default" \
--model_name_or_path "mistralai/Mistral-7B-Instruct-v0.2" \
--per_device_eval_batch_size 32 \
--attn_implementation "sdpa" \
--dataloader_num_workers 8 \
--output_dir "./tmp_expresso" \
--load_in_4bit \
--push_to_hub \
--hub_dataset_id "expresso-tagged-w-speech-mistral" \
--preprocessing_num_workers 16
请注意,Mistral 模型是受保护的,因此您应该确保已从 模型卡片 接受使用条款。
您可以在 TODO reach-vb/expresso-tagged-w-speech-mistral 下找到标注后的数据集,在那里您可以找到我们传递的特征的合理描述。
此步骤通常需要更多的资源和时间,并且应该使用一个或多个 GPU。使用 分布式数据并行(DDP) 扩展到多个 GPU 很简单:只需运行 accelerate config
并选择多 GPU 选项,指定您希望使用的 GPU ID。然后可以使用 DDP 运行上述脚本,无需更改代码。
如果您的资源有限,需要使用较小的模型,Gemma 2B 是一个不错的选择。
步骤2: 微调模型
使用 Parler-TTS 训练脚本 run_parler_tts_training.py 进行微调。这与预训练模型使用的脚本相同,无需更改代码即可用于微调。
为了保留模型生成具有通用语音描述的语音的能力,例如 Parler-TTS Mini v0.1 的风格,我们在三个数据集的组合上微调了模型,包括 LibriTTS-R 的测试分割:
这可以通过以下命令实现:
accelerate launch ./training/run_parler_tts_training.py \
--model_name_or_path "parler-tts/parler_tts_mini_v0.1" \
--feature_extractor_name "parler-tts/dac_44khZ_8kbps" \
--description_tokenizer_name "parler-tts/parler_tts_mini_v0.1" \
--prompt_tokenizer_name "parler-tts/parler_tts_mini_v0.1" \
--report_to "wandb" \
--overwrite_output_dir true \
--train_dataset_name "ylacombe/expresso+reach-vb/jenny_tts_dataset+blabble-io/libritts_r+blabble-io/libritts_r" \
--train_metadata_dataset_name "reach-vb/expresso-tagged-w-speech-mistral-v3+ylacombe/jenny-tts-10k-tagged+parler-tts/libritts_r_tags_tagged_10k_generated+parler-tts/libritts_r_tags_tagged_10k_generated" \
--train_dataset_config_name "read+default+clean+other" \
--train_split_name "train+train[:20%]+test.clean+test.other" \
--eval_dataset_name "ylacombe/expresso+reach-vb/jenny_tts_dataset+blabble-io/libritts_r+blabble-io/libritts_r" \
--eval_metadata_dataset_name "reach-vb/expresso-tagged-w-speech-mistral-v3+ylacombe/jenny-tts-10k-tagged+parler-tts/libritts_r_tags_tagged_10k_generated+parler-tts/libritts_r_tags_tagged_10k_generated" \
--eval_dataset_config_name "read+default+clean+other" \
--eval_split_name "train+train[:20%]+test.clean+test.other" \
--max_eval_samples 8 \
--per_device_eval_batch_size 16 \
--target_audio_column_name "audio" \
--description_column_name "text_description" \
--prompt_column_name "text" \
--max_duration_in_seconds 30.0 \
--min_duration_in_seconds 2.0 \
--max_text_length 400 \
--preprocessing_num_workers 2 \
--do_train true \
--num_train_epochs 8 \
--gradient_accumulation_steps 8 \
--gradient_checkpointing true \
--per_device_train_batch_size 16 \
--learning_rate 0.00008 \
--adam_beta1 0.9 \
--adam_beta2 0.99 \
--weight_decay 0.01 \
--lr_scheduler_type "cosine" \
--warmup_steps 250 \
--logging_steps 2 \
--freeze_text_encoder true \
--audio_encoder_per_device_batch_size 4 \
--dtype "bfloat16" \
--seed 456 \
--output_dir "./parler-tts-mini-expresso" \
--temporary_save_to_disk "./audio_code_tmp" \
--save_to_disk "./tmp_dataset_audio" \
--dataloader_num_workers 4 \
--do_eval \
--predict_with_generate \
--include_inputs_for_metrics \
--group_by_length true
在单个 80GB A100 GPU 上,训练大约需要 1.5 小时,最终评估损失为 4.0。同样,可以通过从命令行运行 accelerate config
为多个 GPU 配置脚本;无需进一步更改代码。
训练性能对学习率和训练轮数非常敏感:您应该根据您的任务和数据集大小调整这些参数。在我们的实验中,我们发现训练 8 轮,学习率为 8e-5 时性能最佳。
如果您按照这些步骤完成了训练:恭喜!您现在应该有一个微调后的模型,可以使用上面的 推理代码示例 用于您的下游应用。您可以尝试替换自己的数据集,或者使用单说话者数据集进行训练,例如 Jenny 示例。
🔧 技术细节
动机
Parler-TTS 是对 Dan Lyth 和 Simon King 分别来自 Stability AI 和爱丁堡大学的论文 Natural language guidance of high-fidelity text-to-speech with synthetic annotations 的复现。
与其他 TTS 模型不同,Parler-TTS 是一个 完全开源 的版本。所有数据集、预处理、训练代码和权重都在宽松的许可证下公开发布,使社区能够在我们的工作基础上开发自己强大的 TTS 模型。
Parler-TTS 与以下内容一起发布:
- Parler-TTS 仓库 - 您可以训练和微调自己版本的模型。
- Data-Speech 仓库 - 一套用于标注语音数据集的实用脚本。
- Parler-TTS 组织 - 您可以在其中找到标注后的数据集以及未来的检查点。
引用
如果您发现这个仓库很有用,请考虑引用这项工作以及原始的 Stability AI 论文:
@misc{lacombe-etal-2024-parler-tts,
author = {Yoach Lacombe and Vaibhav Srivastav and Sanchit Gandhi},
title = {Parler-TTS},
year = {2024},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/huggingface/parler-tts}}
}
@misc{lyth2024natural,
title={Natural language guidance of high-fidelity text-to-speech with synthetic annotations},
author={Dan Lyth and Simon King},
year={2024},
eprint={2402.01912},
archivePrefix={arXiv},
primaryClass={cs.SD}
}
📄 许可证
该模型在 Apache 2.0 许可证下宽松许可。




