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 报错,关闭并重新administer管理员身份打开CMD,输入 conda init --system --all 尝试!!!
anaconda 的 Python虚拟环境名:ChatTTS,版本号:3.10
conda create --name ChatTTS python=3.10 -y
激活虚拟环境
#Windows打开CMD命令时候,必须使用administrator管理员身份,切记切记!!!如果运行 conda activate ChatTTS 报错,关闭并重新administer管理员身份打开CMD,输入 conda init --system --all 尝试
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
如果你的电脑GPU很吊,要测GPU模式,只需要找到:
torch.load("./seed_1065_restored_emb.pt", map_location=torch.device('cpu'), weights_only=True)
换成:
torch.load("./seed_1065_restored_emb.pt")
二、编写测试代码: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卷。
# 小说集真实地描绘了从辛亥革命到五四运动时期的社会生活.
# 从革命民主主义出发,抱着启蒙主义目的和人道主义精神,揭示了种种深层次的社会矛盾,
# 表现出对民族生存浓重的忧患意识和对社会变革的强烈希望。
# """]
###################################################################################################
# 长文本,多个短文本合成
# 每一行建议384字以内
# texts = """
# 《呐喊》是现代文学家鲁迅的短篇小说集,收录鲁迅于1918年至1922年所作的14篇短篇小说,1923年由北京新潮社出版,现编入《鲁迅全集》第1卷。
# 小说集真实地描绘了从辛亥革命到五四运动时期的社会生活。
# 从革命民主主义出发,抱着启蒙主义目的和人道主义精神,揭示了种种深层次的社会矛盾。
# 表现出对民族生存浓重的忧患意识和对社会变革的强烈希望。
# 《呐喊》是中国现代小说的开端与成熟的标志,开创了现代现实主义文学的先河。
# 作品通过写实主义、象征主义、浪漫主义等多种手法,
# 以传神的笔触和“画眼睛”、“写灵魂”的艺术技巧,
# 形象生动地塑造了狂人、孔乙己、阿Q等一批不朽的艺术形象,
# 深刻反映了19世纪末到20世纪20年代间中国社会生活的现状,
# 有力揭露和鞭挞了封建旧恶势力,表达了作者渴望变革,为时代呐喊,希望唤醒国民的思想。
# 奠定了鲁迅在中国现代文学史和现代文化史上的地位。
# 1985年,日本出版的50卷本《世界最高杰作》,中国仅有《呐喊》与《论语》被收入;
# 1999年6月,《呐喊》被《亚洲周刊》评选为20世纪中文小说100强之首。
# """
texts = """
1、姜子牙
周朝开国元勋,兵学奠基人。
在渭水之滨,遇见西伯侯姬昌,拜为“太师”,尊称太公望,成为首席智囊,辅佐姬昌建立霸业。周武王即位后,尊为“师尚父”成为周国军事统帅。
辅佐武王消灭商纣,建立周朝,灭商后受封于营丘(后称临淄,今山东淄博东北),为齐国开国之君。辅佐执政周公旦,平定内乱,开疆扩土,促成成康之治。
后世推崇备至,被尊为兵家鼻祖、武圣、百家宗师。
2、伊尹
商朝开国元勋。
曾耕作于有莘国,经过成汤三聘之后,担任右相,联合仲虺辅佐商汤打败夏桀。商朝建立后。担任尹(相当于秦朝时期的丞相),用“以鼎调羹”“调和五味”的理论治理天下。
积极整顿吏治,洞察民心国情,推动经济繁荣、政治清明。辅政五十余年,为商朝兴盛富强立下汗马功劳。
3、管仲
春秋齐国人。
齐桓公元年,得到鲍叔牙推荐,担任齐国国相,辅佐齐桓公成为春秋五霸之首。对内大兴改革、富国强兵;对外尊王攘夷,九合诸侯,一匡天下,被尊称为“仲父”。
后人尊称为“管子”,誉为“法家先驱”“圣人之师”“华夏文明保护者”“华夏第一相”。
4、范蠡
范蠡为中国早期商业理论家,楚学开拓者之一。被后人尊称为“商圣”,“南阳五圣”之一。博学多才、文武双全。春秋末期,投奔越国之后被拜为上大夫、相国,辅佐越国勾践灭吴国,成就霸业,被封为上将军。
功成名就之后急流勇退。三次经商成巨富,三散家财。后定居于宋国陶丘(今山东省菏泽市定陶区南),自号“陶朱公”。
5、张良
秦末汉初杰出谋臣,西汉开国功臣,与韩信、萧何并称为“汉初三杰”。其先辈在韩国任过五代韩王之国相。
张良力劝刘邦在鸿门宴上卑辞言和,保存实力,并疏通项羽季父项伯,使得刘邦顺利脱身。凭借出色的智谋,协助汉王刘邦赢得楚汉战争,建立大汉王朝,帮助吕后之子刘盈成为皇太子,册封为留侯。
张良精通黄老之道,不恋权位,晚年随赤松子云游四海。
6、诸葛亮
三国时期,蜀汉丞相。
刘备依附荆州刘表时三顾茅庐,诸葛亮向刘备提出占据荆州、益州,联合孙权共同对抗曹操的“隆中对”策,刘备根据诸葛亮的策略,成功建立蜀汉政权,与孙权、曹操形成三足鼎立之势。
刘备称帝,任命诸葛亮为丞相,伐吴失败后,刘备于永安举国托付于诸葛亮。刘禅继位后,封诸葛亮为武乡侯,领益州牧。前后五次北伐中原。他是中国传统文化中忠臣与智者的代表人物。
7、李斯
战国末楚国上蔡(今河南上蔡县)人。
战国末年入秦国,初为秦相吕不韦舍人,被任命为郎。秦王政十年(前237)下逐客令时,上书力谏客不可逐,为秦王采纳。又为秦并六国谋划,建议先攻取韩国,再逐一消灭各诸侯国,完成统一大业。
秦始皇统一全国后任丞相。
8、刘基
明朝开国元勋。
至正十九年(1359年),受朱元璋礼聘而至。参与谋划平定张士诚、陈友谅与北伐中原等军事大计。刘基辅佐朱元璋平天下,计划立定,人莫能测。朱元璋多次称他为“吾之子房”。
在中国民间,也流传着“三分天下诸葛亮,一统江山刘伯温;前朝军师诸葛亮,后朝军师刘伯温”的说法。
9、王猛
前秦时期大臣。
王猛出身贫寒,但好读兵书,文武双全。与东海王苻坚一见如故,后出任中书侍郎,累迁辅国将军、仆射、丞相等,册封清河郡侯,成为苻坚的心腹大臣。任职十八年,鞠躬尽瘁,综合儒法,选拔廉明,励精图治。
政治上,抵制权贵,整肃吏治,强化中央集权。军事上,军纪严明,平定五公之乱,统兵攻占前燕都城,都督关东六州军事。经济上,劝课农桑,开放山泽,兴修水利,实现田畴开辟,仓库充实。执政期间,北方呈现小康景象。
10、房玄龄
唐朝初年名相。
晋阳起兵后,投靠秦王李世民后,积极出谋划策,典管书记,选拔人才,成为秦王府得力谋士之一。武德九年(626年),谋划“玄武门之变”,随同杜如晦等五人居于首功。
唐太宗即位后,拜中书令、邢国公,负责综理朝政,兼修国史、编纂《晋书》。执政期间,房玄龄善于谋略,杜如晦处事果断,并称“房谋杜断”,成为良相典范,累迁尚书左仆射、司空,受封梁国公,名列“凌烟阁二十四功臣”。
11、姚广孝
姚广孝早年出家为僧。通儒、道、佛诸家之学,善诗文。被朱元璋选入为已故马皇后诵经荐福,后随燕王朱棣至北平住持大庆寿寺。从此经常出入燕王府,参与夺位密谋,成为朱棣的重要谋士。
朱棣“靖难”称兵前,他曾多次为朱棣出谋划策,计擒北平布政使张昺、都指挥使谢贵。靖难之役中,其辅佐燕王世子率万人固守北平,击溃朝廷数十万北伐之师,终使朱棣夺得皇位。
朱棣即位后,初授官僧录司左善世,后又再授为太子少师。晚年,主要承担太子、太孙的辅导讲读,及主持《永乐大典》《明太祖实录》等书的修纂。在明初期佛教渐成颓势之际,又担起护教之责,整理了反排佛的《道余录》。
"""
# .replace("。", "。\n")
###################################################################################################
# 固定音色pt文件和另外一些配置
# 固定音色pt文件下载: https://modelscope.cn/studios/ttwwwaa/ChatTTS_Speaker
# 情感控制
# speed : 控制音频速度,范围为 0-9,数字越大,速度越快
# temperate : 控制音频情感波动性,范围为 0-1,数字越大,波动性越大
# top_P :控制音频的情感相关性,范围为 0.1-0.9,数字越大,相关性越高
# top_K :控制音频的情感相似性,范围为 1-20,数字越小,相似性越高
# 随机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_1]", # 速度(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())
###################################################################################################
# 停顿、笑声等配置
# 文本控制
# Refine text : 控制是否对文本进行口语化处理,取消勾选则后面三个选项无效
# oral : 控制文本口语化程度,范围为 0-9,数字越大,添加的“就是”、“那么”之类的连接词越多
# laugh : 控制文本是否添加笑声,范围为 0-9,数字越大,笑声越多
# break : 控制文本是否添加停顿,范围为 0-9,数字越大,停顿越多
# 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_1][laugh_0][break_0]',
)
###################################################################################################
# 短文本,单个30秒内
# skip_refine_text:这个参数实际上是预处理文本,对于输入的文本会加入一些[uvbreak]的韵律标记,skip_refine_text = True则是预处理时候跳过(一般用于自己手动在texts已经加入了标记,无需code自动处理)
# wavs = chat.infer(
# texts, skip_refine_text=True,
# 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("\n", "").replace(" ", "")
if len(item_tmp) > 384:
raise Exception('每一行建议384字以内,程序即将终止!')
if len(item_tmp) != 0:
print("\n" + item_tmp)
wavs.append(chat.infer(item_tmp, skip_refine_text=False,
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("中国古代十大谋士.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]]
'''
'''
附录:一种文本分割方法
import torch
# print(torch.__version__)
# print(torch.version.cuda)
# print(torch.cuda.is_available()) # 输出为True,则安装成功
texts = """
chattts正文 第一
严嵩谢绝会见他,赵贞吉恼火地喝斥了严家的看门人。
恰好这时赵文华也来拜访严嵩,赵贞吉把他也训斥了一通。
等到起草皇上指示时,就没有让赵贞吉监督作战,以便削减他的权限,并且不给他一兵一卒护行。
chattts正文 第二
当时敌寇的骑兵到处都是,赵贞吉飞马进入各位将领的兵营中,散发白金,犒赏官兵,传达了世宗(朱厚熜)的指示精神,第二天就回朝作汇报。
世宗(朱厚熜)大为恼火,批评赵贞吉对军事没有作任何规划、处置,只是在为周尚文、沈东游说,所以把他关进了皇家监狱,并在朝廷杖打了他一回,然后把他贬为荔波典史。
chattts正文 第三
测试最后一段。
""".replace('\u3000', '').replace("。", "。\n").replace(";", ";\n").replace(" ", "").replace(" ", "")
inputs_text_tmp_chapter = texts.split("chattts正文")
for item_tmp_chapter in inputs_text_tmp_chapter[:]:
if len(item_tmp_chapter.replace('\u3000', '').replace("\n", "").replace("\t", "").replace(" ", "").replace(" ", "")) != 0:
inputs_text_tmp = item_tmp_chapter.split("\n")
print('************标题************' + inputs_text_tmp[0])
for item_tmp in inputs_text_tmp[1:]: # 使用切片创建迭代器的副本
item_tmp = item_tmp.replace('\u3000', '').replace("\n", "").replace("\t", "").replace(" ", "").replace(" ", "")
if len(item_tmp) != 0:
print(item_tmp)