ChatTTS 开源文本转语音模型本地部署 API 使用和搭建 WebUI 界面

ChatTTS(Chat Text To Speech),专为对话场景设计的文本生成语音(TTS)模型,适用于大型语言模型(LLM)助手的对话任务,以及诸如对话式音频和视频介绍等应用。支持中文和英文,还可以穿插笑声、说话间的停顿、以及语气词等。

1 下载模型

通过git-lfs工具包下载:

sudo apt install git-lfs

下载文件:

git lfs install
git clone https://www.modelscope.cn/pzc163/chatTTS.git ChatTTS-Model

如果因网络不佳下载中断,可以通过以下命令在中断后继续下载:

git lfs pull

2 安装 ChatTTS 依赖包

下载ChatTTS官网GitHub源码:

git clone https://gitcode.com/2noise/ChatTTS.git ChatTTS

安装Python依赖包:

cd ChatTTS
pip install -r requirements.txt

torch需要使用2.2.2

3 ChatTTS 中文文本转音频文件

ChatTTS 官网的样例代码 API 可能会跑不起来。

ChatTTS-01.py

import ChatTTS
import torch
import torchaudio# 下载的ChatTTS模型文件目录,请按照实际情况替换
MODEL_PATH = '/path/to/ChatTTS-Model'# 初始化并加载模型,特别注意加载模型参数,官网样例代码已经过时
chat = ChatTTS.Chat()
chat.load_models(vocos_config_path=f'{MODEL_PATH}/config/vocos.yaml',vocos_ckpt_path=f'{MODEL_PATH}/asset/Vocos.pt',gpt_config_path=f'{MODEL_PATH}/config/gpt.yaml',gpt_ckpt_path=f'{MODEL_PATH}/asset/GPT.pt',decoder_config_path=f'{MODEL_PATH}/config/decoder.yaml',decoder_ckpt_path=f'{MODEL_PATH}/asset/Decoder.pt',tokenizer_path=f'{MODEL_PATH}/asset/tokenizer.pt',
)# 需要转化为音频的文本内容
text = '中文文本'# 文本转为音频
wavs = chat.infer(text, use_decoder=True)# 保存音频文件到本地文件(采样率为24000Hz)
torchaudio.save("./output/output-01.wav", torch.from_numpy(wavs[0]), 24000)

运行Python代码:python ChatTTS-01.py

也可以在文本转换成语音之后,直接播放语音内容:

from IPython.display import Audio# 播放生成的音频(autoplay=True 代表自动播放)
Audio(wavs[0], rate=24000, autoplay=True)

4 搭建 WebUI 界面

4.1 安装 Python 依赖包
pip install omegaconf~=2.3.0 transformers~=4.41.1
pip install tqdm einops vector_quantize_pytorch vocos
pip install modelscope gradio

运行 Python 程序,即可看到可视化界面,可以随意输入文本来生成音频文件了。

ChatTTS-WebUI.py

import randomimport ChatTTS
import gradio as gr
import numpy as np
import torch
from ChatTTS.infer.api import refine_text, infer_codeprint('启动ChatTTS WebUI......')# WebUI设置
WEB_HOST = '127.0.0.1'
WEB_PORT = 8089MODEL_PATH = '/path/to/ChatTTS-Model'chat = ChatTTS.Chat()
chat.load_models(vocos_config_path=f'{MODEL_PATH}/config/vocos.yaml',vocos_ckpt_path=f'{MODEL_PATH}/asset/Vocos.pt',gpt_config_path=f'{MODEL_PATH}/config/gpt.yaml',gpt_ckpt_path=f'{MODEL_PATH}/asset/GPT.pt',decoder_config_path=f'{MODEL_PATH}/config/decoder.yaml',decoder_ckpt_path=f'{MODEL_PATH}/asset/Decoder.pt',tokenizer_path=f'{MODEL_PATH}/asset/tokenizer.pt',
)def generate_seed():new_seed = random.randint(1, 100000000)return {"__type__": "update","value": new_seed}def generate_audio(text, temperature, top_P, top_K, audio_seed_input, text_seed_input, refine_text_flag):torch.manual_seed(audio_seed_input)rand_spk = torch.randn(768)params_infer_code = {'spk_emb': rand_spk,'temperature': temperature,'top_P': top_P,'top_K': top_K,}params_refine_text = {'prompt': '[oral_2][laugh_0][break_6]'}torch.manual_seed(text_seed_input)text_tokens = refine_text(chat.pretrain_models, text, **params_refine_text)['ids']text_tokens = [i[i < chat.pretrain_models['tokenizer'].convert_tokens_to_ids('[break_0]')] for i in text_tokens]text = chat.pretrain_models['tokenizer'].batch_decode(text_tokens)# result = infer_code(chat.pretrain_models, text, **params_infer_code, return_hidden=True)print(f'ChatTTS微调文本:{text}')wav = chat.infer(text,params_refine_text=params_refine_text,params_infer_code=params_infer_code,use_decoder=True,skip_refine_text=True,)audio_data = np.array(wav[0]).flatten()sample_rate = 24000text_data = text[0] if isinstance(text, list) else textreturn [(sample_rate, audio_data), text_data]def main():with gr.Blocks() as demo:default_text = "文字"text_input = gr.Textbox(label="输入文本", lines=4, placeholder="Please Input Text...", value=default_text)with gr.Row():refine_text_checkbox = gr.Checkbox(label="文本微调开关", value=True)temperature_slider = gr.Slider(minimum=0.00001, maximum=1.0, step=0.00001, value=0.8, label="语音温度参数")top_p_slider = gr.Slider(minimum=0.1, maximum=0.9, step=0.05, value=0.7, label="语音top_P采样参数")top_k_slider = gr.Slider(minimum=1, maximum=20, step=1, value=20, label="语音top_K采样参数")with gr.Row():audio_seed_input = gr.Number(value=42, label="语音随机数")generate_audio_seed = gr.Button("\U0001F3B2")text_seed_input = gr.Number(value=42, label="文本随机数")generate_text_seed = gr.Button("\U0001F3B2")generate_button = gr.Button("文本生成语音")text_output = gr.Textbox(label="微调文本", interactive=False)audio_output = gr.Audio(label="语音")generate_audio_seed.click(generate_seed,inputs=[],outputs=audio_seed_input)generate_text_seed.click(generate_seed,inputs=[],outputs=text_seed_input)generate_button.click(generate_audio,inputs=[text_input, temperature_slider, top_p_slider, top_k_slider, audio_seed_input, text_seed_input, refine_text_checkbox],outputs=[audio_output, text_output, ])# 启动WebUIdemo.launch(server_name='127.0.0.1', server_port=8089, share=False, show_api=False, )if __name__ == '__main__':main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链表相关知识总结

1、数据结构 基本概念&#xff1a; 数据项&#xff1a;一个数据元素可以由若干个数据项组成数据对象&#xff1a;有相同性质的数据元素的集合&#xff0c;是数据的子集数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合 逻辑结构和物理结构&#xff1a…

蓝桥杯备考-》单词接龙

很明显&#xff0c;这道题是可以用DFS来做的&#xff0c;我们直接暴力搜索&#xff0c;但是这里有很多点是我们需要注意的。 1.我们如何确定两个单词能接上&#xff1f; 比如touch和choose 应该合成为touchoose 就是这样两个单词&#xff0c;我们让一个指针指着第一个字符串…

C语言-访问者模式详解与实践

C语言访问者模式详解与实践 - 传感器数据处理系统 1. 什么是访问者模式&#xff1f; 在嵌入式系统中&#xff0c;我们经常需要对不同传感器的数据进行多种处理&#xff0c;如数据校准、过滤、存储等。访问者模式允许我们在不修改传感器代码的情况下&#xff0c;添加新的数据处…

(UI自动化测试web端)第二篇:元素定位的方法_xpath路径定位

1、第一种xpath路径定位&#xff1a; 绝对路径&#xff1a;表达式是以 /html开头&#xff0c;元素的层级之间是以 / 分隔相同层级的元素可以使用下标&#xff0c;下标是从1开始的需要列出元素所经过的所有层级元素&#xff0c;工作当中一般不使用绝对路径 例&#xff1a;/html/…

设置GeoJSONVectorTileLayer中的line填充图片

设置GeoJSONVectorTileLayer中的line填充图片 关键&#xff1a;linePatternFile const style [{filter: true,renderPlugin: {dataConfig: {type: "line",},type: "line",},symbol: {linePatternFile: "http://examples.maptalks.com/resources/pat…

electron框架(4.0)electron-builde和electron Forge的打包方式

----使用electron-builder打包&#xff08;需要魔法&#xff09; --安装electron-builder: npm install electron-builder -D--package.json中进行相关配置&#xff1a; {"name": "video-tools","version": "1.0.0","main&quo…

让 MGR 不从 Primary 的节点克隆数据?

问题 MGR 中&#xff0c;新节点在加入时&#xff0c;为了与组内其它节点的数据保持一致&#xff0c;它会首先经历一个分布式恢复阶段。在这个阶段&#xff0c;新节点会随机选择组内一个节点&#xff08;Donor&#xff09;来同步差异数据。 在 MySQL 8.0.17 之前&#xff0c;同…

第三十二篇 深入解析Kimball维度建模:构建企业级数据仓库的完整框架

目录 一、维度建模设计原则深度剖析1.1 业务过程驱动设计1.2 星型模式VS雪花模式 二、维度建模五步法实战&#xff08;附完整案例&#xff09;2.1 业务需求映射2.2 模型详细设计2.3 缓慢变化维处理 三、高级建模技术解析3.1 渐变维度桥接表3.2 快照事实表设计 四、性能优化体系…

IntelliJ IDEA 中 Maven 的 `pom.xml` 变灰带横线?一文详解解决方法

前言 在使用 IntelliJ IDEA 进行 Java 开发时&#xff0c;如果你发现项目的 pom.xml 文件突然变成灰色并带有删除线&#xff0c;这可能是 Maven 的配置或项目结构出现了问题。 一、问题现象与原因分析 现象描述 文件变灰&#xff1a;pom.xml 在项目资源管理器中显示为灰色。…

缓存过期时间之逻辑过期

1. 物理不过期&#xff08;Physical Non-Expiration&#xff09; 定义&#xff1a;在Redis中不设置EXPIRE时间&#xff0c;缓存键永久存在&#xff08;除非主动删除或内存淘汰&#xff09;。目的&#xff1a;彻底规避因缓存自动过期导致的击穿&#xff08;单热点失效&#xff…

基于WebAssembly的浏览器密码套件

目录 一、前言二、WebAssembly与浏览器密码套件2.1 WebAssembly技术概述2.2 浏览器密码套件的需求三、系统设计思路与架构3.1 核心模块3.2 系统整体架构图四、核心数学公式与算法证明4.1 AES-GCM加解密公式4.2 SHA-256哈希函数五、异步任务调度与GPU加速设计5.1 异步任务调度5.…

Qt的内存管理机制

在Qt中&#xff0c;显式使用new创建的对象通常不需要显式调用delete来释放内存&#xff0c;这是因为Qt提供了一种基于对象树(Object Tree)和父子关系(Parent-Child Relationship)的内存管理机制。这种机制可以自动管理对象的生命周期&#xff0c;确保在适当的时候释放内存&…

数据结构之双向链表-初始化链表-头插法-遍历链表-获取尾部结点-尾插法-指定位置插入-删除节点-释放链表——完整代码

数据结构之双向链表-初始化链表-头插法-遍历链表-获取尾部结点-尾插法-指定位置插入-删除节点-释放链表——完整代码 #include <stdio.h> #include <stdlib.h>typedef int ElemType;typedef struct node{ElemType data;struct node *next, *prev; }Node;//初化链表…

【Linux网络-五种IO模型与阻塞IO】

一、引入 网络通信的本质就是进程间的通信&#xff0c;进程间通信的本质就是IO&#xff08;Input&#xff0c;Output&#xff09; I/O&#xff08;input/output&#xff09;也就是输入和输出&#xff0c;在冯诺依曼体系结构当中&#xff0c;将数据从输入设备拷贝到内存就叫作…

算法-最大公约数

1、约数&#xff1a; 1.1 试除法求约数 原理&#xff1a;只需要遍历最小的约数即可&#xff0c;较大的那个可以直接算出来。 import java.util.*; public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {int t sc.nextIn…

湖北楚大夫

品牌出海已成为众多企业拓展业务、提升竞争力的关键战略。楚大夫(chudafu.com)作为一家专注于品牌出海、海外网络营销推广以及外贸独立站搭建的公司&#xff0c;凭借其专业、高效、创新的服务模式&#xff0c;致力于成为中国企业走向国际市场的坚实后盾与得力伙伴。楚大夫通过综…

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 目录 Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 一、简单介绍 二、conne…

从零开始实现 C++ TinyWebServer 处理请求 HttpRequest类详解

文章目录 HTTP 请求报文HttpRequest 类实现 Init() 函数实现 ParseRequestLine() 函数实现 ParseHeader() 函数实现 ParsePath() 函数实现 ParseBody() 函数实现 ParsePost() 函数实现 ParseFromUrlEncoded() 函数实现 UserVerify() 函数实现 Parse() 函数HttpRequest 代码Http…

systemd-networkd 的 *.network 配置文件详解 笔记250323

systemd-networkd 的 *.network 配置文件详解 笔记250323 查看官方文档可以用 man systemd.network命令, 或访问: https://www.freedesktop.org/software/systemd/man/latest/systemd.network.html 名称 systemd.network — 网络配置 概要 network.network 描述 一个纯…

自定义mavlink 生成wireshark wlua插件错误(已解决)

进入正题 python3 -m pymavlink.tools.mavgen --langWLua --wire-protocol2.0 --outputoutput/develop message_definitions/v1.0/development.xml 编译WLUA的时候遇到一些问题 1.ERROR:SCHEMASV:SCHEMAV_CVC_ENUMERATION_VALID 3765:0:ERROR:SCHEMASV:SCHEMAV_CVC_ENUMERAT…