ChatTTS使用demo示例(包含长文本生成语音、固定音色pt文件)
一、配置开发环境
安装anaconda,安装参考文章:https://blog.csdn.net/Q_fairy/article/details/129158178
建议anaconda最新版:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2024.06-1-Windows-x86_64.exe
pycharm 配置 anaconda 自行百度
Windows打开CMD命令时候,必须使用administrator管理员身份,切记切记!!!如果运行 conda activate ChatTTS 报错,请自行百度!!!
anaconda 的 Python虚拟环境名:ChatTTS,版本号:3.10
conda create --name ChatTTS python=3.10 -y
激活虚拟环境
conda activate ChatTTS
克隆源代码
git clone https://github.com/2noise/ChatTTS
切换到源代码目录
cd ChatTTS
安装Python依赖包
pip install -r requirements.txt
安装ChatTTS包:以下2种方式任一一种即可
pip install -e .
## pip install git+https://github.com/2noise/ChatTTS
最后,我们还需要安装 2 个依赖,主要是文本合成音频文件,不支持阿拉伯数字(这是一个坑):
pip install pysoundfile
conda install -c conda-forge pynini=2.1.5 && pip install WeTextProcessing==1.0.2
运行demo
# 创建文件夹 ChatTTS\examples\hsj 并创建文件 test_001.py
# 第一次运行会下载模型文件到当前目录ChatTTS\examples\hsj\asset(asset目录没有会自动创建),花费时间稍长,请耐心等待
cd ChatTTS\examples\hsj
python test_001.py
二、编写测试代码:test_001.py
import ChatTTS
import torch
import torchaudio
import numpy as np
from tools.normalizer import normalizer_zh_tn
'''
开源项目地址:https://github.com/2noise/ChatTTS
ChatTTS使用demo示例(包含长文本生成语音、固定音色pt文件)
由于电脑不才,无法GPU运行,故使用CPU方式加载音色pt文件运行测试
seed_1065_restored_emb.pt文件见附件
'''
###################################################################################################
# 初始化ChatTTS
chat = ChatTTS.Chat()
chat.load(compile=False) # Set to True for better performance
###################################################################################################
# 短文本,单个30秒内
# texts = ["""
# 《呐喊》是现代文学家鲁迅的短篇小说集,收录鲁迅于1918年至1922年所作的14篇短篇小说,1923年由北京新潮社出版,现编入《鲁迅全集》第1卷。
# 小说集真实地描绘了从辛亥革命到五四运动时期的社会生活.
# 从革命民主主义出发,抱着启蒙主义目的和人道主义精神,揭示了种种深层次的社会矛盾,
# 表现出对民族生存浓重的忧患意识和对社会变革的强烈希望。
# """]
###################################################################################################
# 长文本,多个短文本合成
# 每一行建议100字以内
texts = """
《呐喊》是现代文学家鲁迅的短篇小说集,收录鲁迅于1918年至1922年所作的14篇短篇小说,1923年由北京新潮社出版,现编入《鲁迅全集》第1卷。
小说集真实地描绘了从辛亥革命到五四运动时期的社会生活。
从革命民主主义出发,抱着启蒙主义目的和人道主义精神,揭示了种种深层次的社会矛盾。
表现出对民族生存浓重的忧患意识和对社会变革的强烈希望。
《呐喊》是中国现代小说的开端与成熟的标志,开创了现代现实主义文学的先河。
作品通过写实主义、象征主义、浪漫主义等多种手法,
以传神的笔触和“画眼睛”、“写灵魂”的艺术技巧,
形象生动地塑造了狂人、孔乙己、阿Q等一批不朽的艺术形象,
深刻反映了19世纪末到20世纪20年代间中国社会生活的现状,
有力揭露和鞭挞了封建旧恶势力,表达了作者渴望变革,为时代呐喊,希望唤醒国民的思想。
奠定了鲁迅在中国现代文学史和现代文化史上的地位。
1985年,日本出版的50卷本《世界最高杰作》,中国仅有《呐喊》与《论语》被收入;
1999年6月,《呐喊》被《亚洲周刊》评选为20世纪中文小说100强之首。
"""
###################################################################################################
# 固定音色pt文件和另外一些配置
# 固定音色pt文件下载: https://modelscope.cn/studios/ttwwwaa/ChatTTS_Speaker
# 随机pt
# rand_spk = chat.sample_random_speaker()
# 固定pt
# CPU模式:map_location=torch.device('cpu'), weights_only=True
fixed_spk = torch.load("./seed_1065_restored_emb.pt", map_location=torch.device('cpu'), weights_only=True)
params_infer_code = ChatTTS.Chat.InferCodeParams(
prompt="[speed_4]", # 速度(0-9)
spk_emb=fixed_spk, # add sampled speaker
temperature=.3, # using custom temperature
top_P=0.7, # top P decode
top_K=20, # top K decode
)
chat.normalizer.register('zh', normalizer_zh_tn())
###################################################################################################
# 停顿、笑声等配置
# use oral_(0-9), laugh_(0-2), break_(0-7)
# to generate special token in text to synthesize.
params_refine_text = ChatTTS.Chat.RefineTextParams(
prompt='[oral_2][laugh_0][break_6]',
)
###################################################################################################
# 短文本,单个30秒内
# skip_refine_text:这个参数实际上是预处理文本,对于输入的文本会加入一些[uvbreak]的韵律标记,skip_refine_text = True则是预处理时候跳过(一般用于自己手动在texts已经加入了标记,无需code自动处理)
# wavs = chat.infer(
# texts,
# params_refine_text=params_refine_text,
# params_infer_code=params_infer_code,
# )
#
# try:
# torchaudio.save("seed_1065_restored_emb.wav", torch.from_numpy(wavs[0]).unsqueeze(0), 24000)
# except:
# torchaudio.save("seed_1065_restored_emb.wav", torch.from_numpy(wavs[0]), 24000)
###################################################################################################
# 长文本,多个短文本合成
# 将文本按照\n换行拆分为短文本
wavs = []
inputs_text_tmp = texts.split("\n")
for item_tmp in inputs_text_tmp[:]: # 使用切片创建迭代器的副本
item_tmp = item_tmp.replace("\t", "").replace("《", "").replace("》", "")
if len(item_tmp) > 100:
raise Exception('每一行建议100字以内,程序即将终止!')
if len(item_tmp) != 0:
print("\n" + item_tmp)
wavs.append(chat.infer(item_tmp,
params_refine_text=params_refine_text,
params_infer_code=params_infer_code)[0])
# 合并音频[见:np.concatenate函数demo]
# 将输出的语音保存为音频文件
wavs_cat = np.concatenate(wavs, axis=0)
# torchaudio.save("seed_1065_restored_emb_long_text.wav", torch.tensor(wavs_cat).unsqueeze(0), 24000)
torchaudio.save("seed_1065_restored_emb_long_text.wav", torch.from_numpy(wavs_cat).unsqueeze(0), 24000)
print("ChatTTS使用demo示例(包含长文本生成语音、固定音色pt文件)生成完毕!")
###################################################################################################
################################## np.concatenate函数demo ########################################
###################################################################################################
'''
import numpy as np
# axis=0:在第一维拼接:其他维度的需要是相同的维度;
# axis=1:在第二维拼接:其他维度的需要是相同的维度;(error)
# axis=-1:最后一维拼接:其他维度的需要是相同的维度;
# 两个数组
array1 = np.array([[1, 2], [3, 4]])
array2 = np.array([[5, 6], [7, 8]])
# 连接两个数组
# 沿着第一个轴(行方向)
np.concatenate((array1, array2), axis=0)
# 输出:
# [[1, 2],
# [3, 4],
# [5, 6],
# [7, 8]]
# 沿着第二个轴(列方向)
np.concatenate((array1, array2), axis=-1)
# 输出:
# [[1, 2, 5, 6],
# [3, 4, 7, 8]]
'''