当前位置: 首页 > article >正文

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

安装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

# 情感控制
# 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_4]",  # 速度(0-9)
    spk_emb=fixed_spk,  # add sampled speaker
    temperature=.3,  # using custom temperature
    top_P=0.7,  # top P decode
    top_K=2,  # 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_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]]
'''

http://www.kler.cn/news/341407.html

相关文章:

  • Jquery serialize()、serializeArray()、$.param()
  • 超详细2024版python+pycharm安装与配置教程,pycharm汉化教程-python学习
  • 如何用深度神经网络预测潜在消费者
  • 解释如何使用Python进行数据清洗和预处理。
  • YOLO11改进|注意力机制篇|引入上下文锚注意力机制CAA
  • 如何用一套商业模式 整合本地商业 打造强有力的商家联盟!
  • 极客兔兔Gee-Cache Day1
  • 利用 OpenAI 和 Python 预测股市行情
  • STM32外设详解——ADC
  • 如何通过实践项目来提升网络安全工程师的实战能力?
  • Vue 脚手架学习
  • 基于Springboot海宝海鲜餐厅系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解
  • 【2024年最新】基于springboot+vue的垃圾分类网站lw+ppt
  • Excel-查找和引用数据-VLOOKUP 和 HLOOKUP 函数
  • 【Qt学习笔记】setModal()(模态对话框)
  • 探索 PixiJS:强大的 2D 图形渲染库
  • 【AI人脸融合】FaceFusion 3.0一键整合包,支持AI视频/图片人脸融合、数字人视频、表情修复、年龄修改等
  • C++ 算法学习——1.3 拓扑排序
  • Scratch编程乐园:提供学习、创建和分享Scratch作品的最佳平台
  • git 克隆时,SSL 连接失败解决方案