模型概述
模型特點
模型能力
使用案例
🚀 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 許可證下寬鬆許可。




