ChatTTS,語氣韻律媲美真人的開源TTS模型,文字轉語音界的新魁首,對標微軟Azure-tts

刘悦的技术博客發表於2024-05-31

前兩天 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

相關文章