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

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 -i https://pypi.tuna.tsinghua.edu.cn/simple

安装ChatTTS包:以下2种方式任一一种即可

pip install -e .
## pip install git+https://github.com/2noise/ChatTTS

最后,我们还需要安装 2 个依赖,主要是文本合成音频文件,不支持阿拉伯数字(这是一个坑):

pip install pysoundfile -i https://pypi.tuna.tsinghua.edu.cn/simple

conda install -c conda-forge pynini=2.1.5 && pip install WeTextProcessing==1.0.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

运行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_1649_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 = """
# 关于春节的神话故事。我是主播:老鼠喜欢捉小花猫。
#
# 嗯!好啦,到这里就结束了啦,我是老鼠喜欢捉小花猫,欢迎您关注我啦!
# """
texts = """
10位文学大师笔下的母亲,我是主播:老鼠喜欢捉小花猫,欢迎订阅喔。
1,杨绛《回忆我的母亲》

“我们的妈妈从此没有了”



我妈妈忠厚老实,绝不敏捷。
如果受了欺侮,她往往并不感觉,事后才明白,“哦,她(或他)在笑我”或“哦,他(或她)在骂我”。
但是她从不计较,不久都忘了。她心胸宽大,不念旧恶,所以能和任何人都和好相处,一辈子没一个冤家。

妈妈并不笨,该说她很聪明。她出身富商家,家里也请女先生教读书。
她不但新旧小说都能看,还擅长女红。我出生那年,爸爸为她买了一台胜家名牌的缝衣机。
她买了衣料自己裁,自己缝,在缝衣机上缝,一会儿就做出一套衣裤。
妈妈缝纫之余, 常爱看看小说,旧小说如《缀白裘》,她看得吃吃地笑。
看新小说也能领会各作家的风格,例如看了苏梅的《棘心》。
又读她的《绿天》,就对我说:“她怎么学着苏雪林的《绿天》的调儿呀?”
我说:“苏梅就是苏雪林啊!”她看了冰心的作品后说, 她是名牌女作家, 但不如谁谁谁。我觉得都恰当。

妈妈每晚记账,有时记不起这笔钱怎么花的,爸爸就夺过笔来,写“糊涂账”,不许她多费心思了。
但据爸爸说,妈妈每月寄无锡大家庭的家用,一辈子没错过一天。
这是很不容易的,因为她是个忙人,每天当家过日子就够忙的。
我家因爸爸的工作没固定的地方,常常调动,从上海调苏州,苏州调杭州,杭州调回北京,北京又调回上海。

我爸爸厌于这类工作,改行做律师了。做律师要有个事务所,就买下了一所破旧的大房子。
妈妈当然更忙了。接下来日寇侵华,妈妈随爸爸避居乡间,妈妈得了恶疾,一病不起,我们的妈妈从此没有了。

我想念妈妈,忽想到怎么我没写一篇《回忆我的母亲》啊?

我早已无父无母,姐妹兄弟也都没有了,独在灯下,写完这篇回忆,还痴痴地回忆又回忆。

2,沈从文《我的母亲》

“瘦小、机警、富于胆气与常识的母亲”



我的母亲姓黄,年纪极小时就随同我一个舅父外出在军营中生活,所见事情很多,所读的书也似乎较爸爸读的稍多。
外祖黄河清是本地最早的贡生,守文庙作书院山长,也可说是当地唯一读书人。
所以我母亲极小就认字读书,懂医方,会照相。
舅父是个有新头脑的人物,本县第一个照相馆是那舅父办的,第一个邮政局也是舅父办的。
我等兄弟姊妹的初步教育,便全是这个瘦小、机警、富于胆气与常识的母亲担负的。
我的教育得于母亲的不少,她告我认字,告我认识药名,告我决断——做男子极不可少的决断。
我的气度得于父亲影响的较少,得于妈妈的似较多。

3,贾平凹《写给母亲》

“我妈在牵挂着我”



我妈在牵挂着我,她并不以为她已经死了,我更是觉得我妈还在。
尤其我一个人静静地待在家里,这种感觉就十分强烈。
我常在写作时,突然能听到我妈在叫我,叫得很真切,一听到叫声我便习惯地朝右边扭过头去。
从前我妈坐在右边那个房间的床头上,我一伏案写作,她就不再走动,也不出声,却要一眼一眼看着我。
看得时间久了,她要叫我一声,然后说:世上的字你能写完吗,出去转转么。
现在,每听到我妈叫我,我就放下笔走进那个房间,心想我妈从棣花来西安了?
当然是房间里什么也没有,却要立上半天,自言自语我妈是来了又出门去街上给我买我爱吃的青辣子和萝卜了。
或许,她在逗我,故意藏到挂在墙上的她那张照片里,我便给照片前的香炉里上香,要说上一句:我不累。

4,胡适《我的母亲》

“她是慈母兼任严父。”



每天天刚亮时,我母亲便把我喊醒,叫我披衣坐起。我从不知道她醒来坐了多久了。
她看我清醒了,便对我说昨天我做错了甚么事,说错了甚么话,要我认错,要我用功读书。
有时候她对我说父亲的种种好处,她说:你总要踏上你老子的脚步。
我一生只晓得这一个完全的人,你要学他,不要跌他的股。
(跌股便是丢脸,出丑。)她说到伤心处,往往掉下泪来。
到天大明时,她才把我的衣服穿好,催我去上早学。
学堂门上的锁匙放在先生家里;我先到学堂门口一望,便跑到先生家里去敲门。
先生家里有人把锁匙从门缝里递出来,我拿了跑回去,开了门,坐下念生书。
十天之中,总有八九天我是第一个去开学堂门的。等到先生来了,我背了生书,才回家吃早饭。

我母亲管束我最严。她是慈母兼任严父。但她从来不在别人面前骂我一句,打我一下。
我做错了事,她只对我一望,我看见了她的严厉眼光,便吓住了。
犯的事小,她等到第二天早晨我眠醒时才教训我。
犯的事大,她等到晚上人静时,关了房门,先责备我,然后行罚,或罚跪,或拧我的肉。
无论怎样重罚,总不许我哭出声音来。她教训儿子不是藉此出气叫别人听的。

5,丰子恺《我的母亲》

“我家内外一切责任全部归母亲负担。”



母亲生前没有摄取坐像的照片,但这姿态清楚地摄入在我脑海中的底片上,不过没有晒出。
现在就用笔墨代替显影液和定影液,把我母亲的坐像晒出来吧:

我的母亲坐在我家老屋的西北角里的八仙椅子上,眼睛里发出严肃的光辉,口角上表出慈爱的笑容。

老屋的西北角里的八仙椅子,是母亲的老位子。
从我小时候直到她逝世前数月,母亲空下来总是坐在这把椅子上,这是很不舒服的一个座位。
我家的老屋是一所三开间的楼厅,右边是我的堂兄家,左边一间是我的堂叔家,中央是没有板壁隔开。
只拿在左右的两排八仙椅子当作三份人家的界限。所以母亲坐的椅子,背后凌空。
若是沙发椅子,三面有柔软的厚壁,凌空无妨碍。
但我家的八仙椅子是木造的,坐板和靠背成九十度角,靠背只是疏疏的几根木条,其高只及人的肩膀。
母亲坐着没处搁头,很不安稳。母亲又防椅子的脚摆在泥土上要霉烂,用二三寸高的木座子衬在椅子脚下。
因此这只八仙椅子特别高,母亲坐上去两脚须得挂空,很不便利。
所谓西北角,就是左边最里面的一只椅子,这椅子的里面就是通过退堂的门。退堂里就是灶间。
母亲坐在椅子上向里面顾,可以看见灶头。风从里面吹出的时候,烟灰和油气都吹在母亲身上,很不卫生。
堂前隔着三四尺阔的一条天井便是墙门。墙外面便是我们的染坊店。
母亲坐在椅子里向外面望,可以看见杂沓往来的顾客,听到沸反盈天的市井声,很不清静。
但我的母亲一身坐在我家老屋西北角里的这样不安稳,不便利,不卫生,不清静的一只八仙椅子上。
眼睛发出严肃的光辉,口角上表出慈爱的笑容。母亲为什么老是坐在这样不舒服的椅子里呢?因为这位子在我家中最为冲要。
母亲坐在这位子里可以顾到灶上,又可以顾到店里。
母亲为要兼顾内外,便顾不到座位的安稳不安稳,便利不便利,卫生不卫生,和清静不清静了。

我九岁的时候,父亲遗下了母亲和我们姐弟六人,薄田数亩和染坊店一间而逝世。
我家内外一切责任全部归母亲负担。此后她坐在那椅子上的时间愈加多了。
工人们常来坐在里面的凳子上,同母亲谈家事;店伙们常来坐在外面的椅子上。
同母亲谈店事;父亲的朋友和亲戚邻人常来坐在对面的椅子上,同母亲交涉或应酬。
我从学堂里放假回家,又照例走向西北角椅子边,同母亲讨个铜板。
有时这四班人同时来到,使得母亲招架不住,于是她用眼睛的严肃的光辉来命令,警戒,或交涉。
同时又用了口角上的慈爱的笑容来劝勉,抚爱,或应酬。
当时的我看惯了这种光景,以为母亲是天生成坐在这只椅子上的,而且天生成有四班人向她缠绕不清的。

我十七岁离开母亲,到远方求学。临行的时候,母亲眼睛里发出严肃的光辉,诫我待人接物求学立身的大道。
口角上表出慈爱的笑容,关照我起居饮食一切的细事。
她给我准备学费,她给我置备行李,她给我制一罐猪油炒米粉,放在我的网篮里。
她给我做一个小线板,上面插两只引线放在我的箱子里,然后送我出门。
放假归来的时候,我一进店门,就望见母亲坐在西北角里的八仙椅子上。
她欢迎我归家,口角上表了慈爱的笑容,她探问我的学业,眼睛里发出严肃的光辉。
晚上她亲自上灶,烧些我所爱吃的菜蔬给我吃,灯下她详询我的学校生活,加以勉励,教训,或责备。

我廿二岁毕业后,赴远方服务,不克依居母亲膝下,唯假期归省。
每次归家,依然看见母亲坐在西北角里的椅子上,眼睛里发出严肃的光辉,口角上表现出慈爱的笑容。
她像贤主一般招待我,又像良师一般教训我。

我三十岁时,弃职归家,读书著述奉母,母亲还是每天坐在西北角里的八仙椅子上。
眼睛里发出严肃的光辉,口角上表出慈爱的笑容。只是她的头发已由灰白渐渐转成银白了。

我三十三岁时,母亲逝世。我家老屋西角里的八仙椅子上,从此不再有我母亲坐着了。
然而每逢看见这只椅子的时候,脑际一定浮出母亲的坐像——眼睛里发了严肃的光辉,口角上表出慈爱的笑容。
她是我的母亲,同时又是我的父亲。她以一身任严父兼慈母之职而训诲我抚养我。
我从呱呱坠地的时候直到三十三岁,不,直到现在。陶渊明诗云:“昔闻长者言,掩耳每不喜。”
我也犯这个毛病;我曾经全部接受了母亲的慈爱,但不会全部接受她的训诲。
所以现在我每次想象中瞻望母亲的坐像,对于她口角上的慈爱的笑容觉得十分感谢。
对于她眼睛里的严肃的光辉,觉得十分恐惧。这光辉每次给我以深刻的警惕和有力的勉励。

6,老舍《我的母亲》

“ 她给我的是生命的教育。”



姑母常闹脾气。她单在鸡蛋里找骨头。她是我家中的阎王。
直到我入了中学,她才死去,我可是没有看见母亲反抗过。
“没受过婆婆的气,还不受大姑子的吗?命当如此!”母亲在非解释一下不足以平服别人的时候,才这样说。
是的,命当如此。母亲活到老,穷到老,辛苦到老,全是命当如此。
她最会吃亏。给亲友邻居帮忙,她总跑在前面:她会给婴儿洗三——穷朋友们可以因此少花一笔“请姥姥”钱——她会刮痧。
她会给孩子们剃头,她会给少妇们绞脸……凡是她能作的,都有求必应。
但是吵嘴打架,永远没有她。她宁吃亏,不逗气。当姑母死去的时候,母亲似乎把一世的委屈都哭了出来,一直哭到坟地。
不知道哪里来的一位侄子,声称有继承权,母亲便一声不响,教他搬走那些破桌子烂板凳,而且把姑母养的一只肥母鸡也送给他。

可是,母亲并不软弱。母亲死在庚子闹“拳”的那一年。联军入城,挨家搜索财物鸡鸭,我们被搜过两次。
母亲拉着哥哥与三姐坐在墙根,等着“鬼子”进门,街门是开着的。
“鬼子”进门,一刺刀先把老黄狗刺死,而后入室搜索。他们走后,母亲把破衣箱搬起,才发现了我。
假若箱子不空,我早就被压死了。竽上跑了,丈夫死了,鬼子来了,满城是血光火焰。
可是母亲不怕,她要在刺刀下,饥荒中,保护着儿女。
北平有多少变乱啊,有时候兵变了,街市整条的烧起,火团落在我们的院中。
有时候内战了,城门紧闭,铺店关门,昼夜响着枪炮。
这惊恐,这紧张,再加上一家饮食的筹划,儿女安全的顾虑,岂是一个软弱的老寡妇所能受得起的?
可是,在这种时候,母亲的心横起来,她不慌不哭,要从无办法中想出办法来。
她的泪会往心中落!这点软而硬的个性,也传给了我。
我对一切人与事,都取和平的态度,把吃亏看作当然的。
但是,在作人上,我有一定的宗旨与基本的法则,什么事都可以将就,而不能超过自己画好的界限。
我怕见生人,怕办杂事,怕出头露面;但是到了非我去不可的时候,我便不敢不去,正像我的母亲。
从私塾到小学,到中学,我经历过起码有二十位教师吧,其中有给我很大影响的,也有毫无影响的。
但是我的真正的教师,把性格传给我的,是我的母亲。母亲并不识字,她给我的是生命的教育。

7,季羡林《怀念母亲》

“缺少母爱的孩子,是灵魂不全的人。”



我六岁离开我的生母,到城里去住。中间曾回故乡两次,都是奔丧,只在母亲身边呆了几天,仍然回到城里。
最后一别八年,在我读大学二年级的时候,母亲弃养,只活了四十多岁。
我痛哭了几年,食不下咽,寝不安席。我真想随母亲于地下。我的愿望没能实现。
从此我就成了没有母亲的孤儿。一个缺少母爱的孩子,是灵魂不全的人。
我怀着不全的灵魂,抱终天之恨。一想到母亲,就泪流不止,数十年如一日。
如今到了德国,来到哥廷根这一座孤寂的小城,不知道是为什么,母亲频来入梦。

8,史铁生《秋天的怀念》

“咱娘儿俩在一块儿,好好儿活,好好活”



双腿瘫痪后,我的脾气变得暴怒无常。望着望着窗外天上北归的雁阵,我会突然把面前的玻璃砸碎。
听着听着李谷一甜美的歌声,我会猛地把手边的东西摔向四周的墙壁。
母亲这时就会悄悄地躲出去,在我看不见的地方偷偷地听着我的动静。
当一切恢复沉寂时,她又悄悄地进来,眼边红红的,看着我。“听说北海的花儿都开了,我推着你去走走。”
她总是这么说。母亲喜欢花,可自从我的腿瘫痪以后,她侍弄的那些花都死了。
“不,我不去!”我狠命地捶打这两条可恨的腿,喊着,“我活什么劲儿!”
母亲扑过来抓住我的手,忍住哭声说:“咱娘儿俩在一块儿,好好儿活,好好儿活……”
可我却一直都不知道,她的病已经到了那步田地。
后来妹妹告诉我,她常常肝疼得整宿整宿翻来覆去地睡不了觉。

那天我又独自坐在屋里,看着窗外的树叶“唰唰啦啦”地飘落。
母亲进来了,挡在窗前:“北海的菊花开了,我推着你去看看吧。”
她憔悴的脸上现出央求般的神色。“什么时候?”“你要是愿意,就明天?”她说。
我的回答已经让她喜出望外了。“好吧,就明天。”
我说。她高兴得一会坐下,一会站起:“那就赶紧准备准备。”“哎呀,烦不烦?几步路,有什么好准备的!”
她也笑了,坐在我身边,絮絮叨叨地说着:“看完菊花,咱们就去‘仿膳’,你小时候最爱吃那儿的豌豆黄儿。
还记得那回我带你去北海吗?你偏说那杨树花是毛毛虫,跑着,一脚踩扁一个……”
她忽然不说了。对于“跑”和“踩”一类的字眼,她比我还敏感。她又悄悄地出去了。

她出去了,就再也没回来。

邻居们把她抬上车时,她还在大口大口地吐着鲜血。我没想到她已经病成那样。
看着三轮车远去,也绝没有想到那竟是永远的诀别。

邻居的小伙子背着我去看她的时候,她正艰难地呼吸着,像她那一生艰难的生活。
别人告诉我,她昏迷前的最后一句话是:“我那个有病的儿子和我那个还未成年的女儿……”

又是秋天,妹妹推着我去北海看了菊花。
黄色的花淡雅,白色的花高洁,紫红色的花热烈而深沉,泼泼洒洒,秋风中正开得烂漫。
我懂得母亲没有说完的话。妹妹也懂。我俩在一块儿,要好好儿活……

9,席慕容《生日卡片》

“母亲都是容易受骗和容易满足的”



所以这也许是母亲要好好地收藏这张粗糙的生日卡片的最大理由了吧。
因为,这么多年来,我也只给了她一张而已。
这么多年来,我只会不断地向她要求更多的爱,更多的关怀。
不断地向她要求更多的证据,希望从这些证据里,能够证明她是爱我的。

而我呢?我不过只是在十四岁那一年,给了她一张甜蜜的卡片而已。

她却因此而相信了我,并且把它细心地收藏起来,因为,也许这是她从我这里能得到的唯一的证据了。

在那一刹那,我才发现,原来,原来世间所有的母亲都是这样容易受骗和容易满足的啊!

在那一刹那间,我不禁流下泪来。

10,莫言《母亲》

“孩子,放心吧!”



我出生于山东省高密县一个偏僻落后的乡村。
5岁时,正是中国历史上一个艰难的岁月。
生活留给我最初的记忆是母亲坐在一棵白花盛开的梨树下。
用一根紫红色的洗衣棒槌,在一块白色的石头上,捶打野菜的情景。
绿色的汁液流到地上,溅到母亲的胸前,空气中弥漫着野菜汁液苦涩的气味。
那棒槌敲打野菜发出的声音,沉闷而潮湿,让我的心感到一阵阵地紧缩。

这是一个有声音、有颜色、有气味的画面,是我人生记忆的起点,也是我文学道路的起点。
我用耳朵、鼻子、眼睛、身体来把握生活,来感受事物。
储存在我脑海里的记忆,都是这样的有声音、有颜色、有气味、有形状的立体记忆。
这种感受生活和记忆事物的方式,在某种程度上决定了我小说的面貌和特质。
这个记忆的画面中更让我难忘的是,愁容满面的母亲,在辛苦地劳作时,嘴里竟然哼唱着一支小曲!

母亲没读过书,不认识文字,她一生中遭受的苦难,真是难以尽述。
战争、饥饿、疾病,在那样的苦难中,是什么样的力量支撑她活下来。
是什么样的力量使她在饥肠辘辘、疾病缠身时还能歌唱?
有一段时间,村子里连续自杀了几个女人,我莫名其妙地感到了一种巨大的恐惧。
那是我们家最艰难的时刻,我总担心母亲走上绝路。
每当我下工归来,一进门就要大声喊叫,只有听到母亲的回答,心中才感到一块石头落了地。
有次下工回来,母亲没有回答我的呼喊。我感到最可怕的事情发生了,不由地大声哭起来。
这时,母亲从外边走了进来。她对我非常不满,她认为一个人尤其是男人不应该随便哭泣。
她追问我为什么哭。我不敢对她说出我的担忧。
母亲理解了我的意思,她对我说:孩子,放心吧,阎王爷不叫,我是不会去的!

母亲的话虽然腔调不高,但使我陡然获得了一种安全感和对于未来的希望。
这是一个母亲对她忧心忡忡的儿子做出的庄严承诺。活下去,无论多么艰难也要活下去!
现在,尽管母亲已被阎王爷叫去了,但她面对苦难挣扎着活下去的勇气,将永远伴随着我,激励着我。


嗯!好啦,到这里就结束了啦,我是老鼠喜欢捉小花猫,欢迎您关注我啦!
"""
#.replace('\u3000', '').replace("。", "。\n").replace(";", ";\n").replace(";", ";\n").replace("!", "!\n").replace("!", "!\n").replace("?", "?\n").replace("?", "?\n").replace(" ", "")
#,更多好听的故事将为你娓娓道来喔
###################################################################################################
# 固定音色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_1983_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_0][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_1649_restored_emb.wav", torch.from_numpy(wavs[0]).unsqueeze(0), 24000)
# except:
#     torchaudio.save("seed_1649_restored_emb.wav", torch.from_numpy(wavs[0]), 24000)


###################################################################################################
# 长文本,多个短文本合成
def wavs_process_simple(txt):
    if txt != '"' and txt != '“':
        print("\n" + txt)
        wavs.append(chat.infer(txt, skip_refine_text=True,
                               params_refine_text=params_refine_text,
                               params_infer_code=params_infer_code)[0])

# 将文本按照\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:
        if len(item_tmp) > 70:  # 70以内正常生成语音30s内,超过不清晰
            item_tmp_tmp = item_tmp.replace(",", ',')
            item_tmp_tmp_array = item_tmp_tmp.split(",")
            min_len_index = int(len(item_tmp_tmp_array) / 2)
            fram_1 = item_tmp_tmp_array[:min_len_index]
            fram_2 = item_tmp_tmp_array[min_len_index:]
            fram_1 = ",".join(fram_1)
            fram_2 = ",".join(fram_2)
            if len(fram_1) > 70:  # 70以内正常生成语音30s内,超过不清晰
                item_tmp_tmp1 = fram_1.replace(",", ',')
                item_tmp_tmp_array1 = item_tmp_tmp1.split(",")

                min_len_index1 = int(len(item_tmp_tmp_array1) / 2)
                fram_11 = item_tmp_tmp_array1[:min_len_index1]
                fram_12 = item_tmp_tmp_array1[min_len_index1:]
                fram_11 = ",".join(fram_11)
                fram_12 = ",".join(fram_12)
                # print("\n" + fram_11)
                # print("\n" + fram_12)
                wavs_process_simple(fram_11)
                wavs_process_simple(fram_12)
            else:
                # print("\n" + fram_1)
                wavs_process_simple(fram_1)

            if len(fram_2) > 70:  # 70以内正常生成语音30s内,超过不清晰
                item_tmp_tmp2 = fram_2.replace(",", ',')
                item_tmp_tmp_array2 = item_tmp_tmp2.split(",")

                min_len_index2 = int(len(item_tmp_tmp_array2) / 2)
                fram_21 = item_tmp_tmp_array2[:min_len_index2]
                fram_22 = item_tmp_tmp_array2[min_len_index2:]
                fram_21 = ",".join(fram_21)
                fram_22 = ",".join(fram_22)
                # print("\n" + fram_21)
                # print("\n" + fram_22)
                wavs_process_simple(fram_21)
                wavs_process_simple(fram_22)
            else:
                # print("\n" + fram_2)
                wavs_process_simple(fram_2)
            # for item_tmp_tmp_array_index in item_tmp_tmp_array[:]:
            #     print("\n" + item_tmp_tmp_array_index)
            #     wavs.append(chat.infer(item_tmp_tmp_array_index, skip_refine_text=True,
            #                            params_refine_text=params_refine_text,
            #                            params_infer_code=params_infer_code)[0])
        else:
            # print("\n" + item_tmp)
            wavs_process_simple(item_tmp)

# 合并音频[见:np.concatenate函数demo]
# 将输出的语音保存为音频文件
wavs_cat = np.concatenate(wavs, axis=0)
# torchaudio.save("seed_1649_restored_emb_long_text.wav", torch.tensor(wavs_cat).unsqueeze(0), 24000)
torchaudio.save("10位文学大师笔下的母亲.wav", torch.from_numpy(wavs_cat).unsqueeze(0), 24000)
print("ChatTTS使用demo示例(包含长文本生成语音、固定音色pt文件)生成完毕!")
#https://www.ruiwen.com/word/aiqingsanwen.html
#https://www.baihuawen.cn/yuedu/shige/96060.html
###################################################################################################
##################################  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)

### Chattts 音色技术实现 Chattts作为一款先进的对话式文本转语音(Text-to-Speech, TTS)系统,在音色技术和声音合成方面表现出众。通过特别优化的算法,Chattts能够在不同应用场景下模拟多种真实人类讲话风格,使机器发声更贴近真人交流[^2]。 #### 细粒度韵律特征控制 为了达到更高的自然度,Chattts引入了对细微语调变化的支持,比如笑声、停顿以及插入词语等非标准发音元素。这些功能使得生成的声音不仅限于简单的文字朗读,而是具备丰富的表情力,增强了沟通的真实感和趣味性。 ```python # 示例代码片段展示如何配置特定参数来调整输出音频中的情感表达 from chattts import Synthesizer synth = Synthesizer() audio_with_laughter = synth.synthesize(text="这太有趣了", laugh=True) ``` #### 多说话人模式支持 除了单一声线外,Chattts还允许创建多个虚拟角色,每个都有独特的声纹特性。这一特点非常适合用于构建具有个性化交互体验的产品或服务,例如客服机器人、有声书阅读器或是在线教育平台上的教师形象塑造。 ```json // JSON格式定义不同的说话者属性 { "speakers": [ {"name": "Alice", "gender": "female", "age": 28}, {"name": "Bob", "gender": "male", "age": 35} ] } ``` --- ### 服务应用实例:电商直播领域 在一个典型的电商直播间环境中,主播通常需要频繁地向观众介绍商品详情并解答疑问。此时如果采用传统录音方式,则难以灵活应对突发情况;而借助像Chattts这样的实时语音合成功能,则可以让整个过程变得更加顺畅高效。具体来说: - **产品描述**:当新物品上架时自动播放详细的解说词; - **促销活动通知**:及时告知正在观看的人群有关限时优惠的信息; - **客户咨询回复**:快速响应买家提出的各种问题,提高服务质量与效率[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值