ChatTTS使用demo示例(包含长文本生成语音、固定音色pt文件)

扫测资讯 2024-10-09 18:07   254 0

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]]
'''