前兩天 2noise 團隊開源了ChatTTS專案,並且釋出了相關的音色模型權重,效果確實非常驚豔,讓人一聽難忘,即使擺在微軟的商業級專案Azure-tts面前,也是毫不遜色的。
ChatTTS是專門為對話場景設計的文字轉語音模型,例如大語言助手對話任務。它支援英文和中文兩種語言。最大的模型使用了10萬小時以上的中英文資料進行訓練。目前在huggingface中的開源版本為4萬小時訓練且未SFT的版本。
本次分享一下如何在本地部署ChatTTS專案。
配置ChatTTS環境
首先確保本地已經安裝好Anaconda軟體包,執行命令建立虛擬環境:
conda create -n ChatTTS python=3.11
之所以選擇Python3.11的版本,是因為該版本的整體效能更好。
隨後克隆官方的專案:
git clone https://github.com/2noise/ChatTTS.git
進入專案
cd ChatTTS
啟用虛擬環境
conda activate ChatTTS
安裝專案依賴:
pip install -r requirements.txt
最後安裝gpu版本的torch:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
注意這裡預設的cuda版本是12.1,如果你的本地cuda是11.8,那麼就安裝對應11.8的torch:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
至此,環境就配置好了。
ChatTTS的基本使用
首先,是最基本的文字轉語音功能:
import ChatTTS
from IPython.display import Audio
chat = ChatTTS.Chat()
chat.load_models()
texts = ["你好啊",]
wavs = chat.infer(texts, use_decoder=True)
Audio(wavs[0], rate=24_000, autoplay=True)
這裡 ChatTTS 是專案內的資料夾模組,初始化後直接呼叫infer方法即可進行音訊推理。
需要注意的是,首次執行會預設在Huggingface上下載模型,需要學術上網環境。
ChatTTS的進階用法
###################################
# Sample a speaker from Gaussian.
import torch
std, mean = torch.load('ChatTTS/asset/spk_stat.pt').chunk(2)
rand_spk = torch.randn(768) * std + mean
params_infer_code = {
'spk_emb': rand_spk, # add sampled speaker
'temperature': .3, # using custom temperature
'top_P': 0.7, # top P decode
'top_K': 20, # top K decode
}
###################################
# For sentence level manual control.
# use oral_(0-9), laugh_(0-2), break_(0-7)
# to generate special token in text to synthesize.
params_refine_text = {
'prompt': '[oral_2][laugh_0][break_6]'
}
wav = chat.infer("<PUT YOUR TEXT HERE>", params_refine_text=params_refine_text, params_infer_code=params_infer_code)
###################################
# For word level manual control.
# use_decoder=False to infer faster with a bit worse quality
text = 'What is [uv_break]your favorite english food?[laugh][lbreak]'
wav = chat.infer(text, skip_refine_text=True, params_infer_code=params_infer_code, use_decoder=False)
這裡透過 std, mean = torch.load('ChatTTS/asset/spk_stat.pt').chunk(2) 方法來固定音色。
隨後透過 params_refine_text 來人為的增加笑聲和斷句。
ChatTTS的中文樣例
最後是一個ChatTTS的中文推理例子:
inputs_cn = """
chat T T S 是一款強大的對話式文字轉語音模型。它有中英混讀和多說話人的能力。
chat T T S 不僅能夠生成自然流暢的語音,還能控制[laugh]笑聲啊[laugh],
停頓啊[uv_break]語氣詞啊等副語言現象[uv_break]。這個韻律超越了許多開源模型[uv_break]。
請注意,chat T T S 的使用應遵守法律和倫理準則,避免濫用的安全風險。[uv_break]'
""".replace('\n', '')
params_refine_text = {
'prompt': '[oral_2][laugh_0][break_4]'
}
audio_array_cn = chat.infer(inputs_cn, params_refine_text=params_refine_text)
audio_array_en = chat.infer(inputs_en, params_refine_text=params_refine_text)
文字內容可以透過[laugh]和[uv_break]標識來進行笑聲和語氣停頓的定製化操作
結語
誠然,沒有完美的產品,ChatTTS的模型穩定性似乎還有待提高, 偶爾會出現其他音色或音質很差的現象,這是自迴歸模型通常都會出現的問題,說話人的音色也有可能會在一定範圍內變化, 可能會取樣到音質非常差的結果, 這通常難以避免. 可以多采樣幾次來找到合適的結果,俗稱抽卡,最後奉上一鍵整合包,與眾鄉親同饗:
ChatTTS新版整合包:https://pan.quark.cn/s/e07f47edf82a