ChatTTS 开源文本转语音模型本地部署、API使用和搭建WebUI界面(建议收藏)

ChatTTS(Chat Text To Speech)是专为对话场景设计的文本生成语音(TTS)模型,特别适用于大型语言模型(LLM)助手的对话任务,以及诸如对话式音频和视频介绍等应用。它支持中文和英文,还可以穿插笑声、说话间的停顿、以及语气词等,听起来很真实自然,在语音合成中表现出高质量和自然度(ChatTTS团队声称:突破开源天花板)。

同时,ChatTTS模型文件总大小1.1GB左右,常用的个人笔记本电脑均可部署,因此涉及到文本转语音场景,均可以自己操作转换了!

ChatTTS特点

由于ChatTTS以下极具吸引人的特点,使得它一经推出就成为了爆款:

  • 多语言支持:ChatTTS的一个关键特性是支持多种语言,包括英语和中文。这使其能够为广泛用户群提供服务,并克服语言障碍。
  • 大规模数据训练:ChatTTS使用了大量数据进行训练,大约有1000万小时的中文和英文数据。这样的大规模训练使其声音合成质量高,听起来自然。
  • 对话任务兼容性:ChatTTS很适合处理通常分配给大型语言模型LLMs的对话任务。它可以为对话生成响应,并在集成到各种应用和服务时提供更自然流畅的互动体验。
  • 开源计划:ChatTTS团队目前开源一个经过训练的基础模型。
  • 控制和安全性:ChatTTS致力于提高模型的可控性,添加水印,并将其与LLMs集成。这些努力确保了模型的安全性和可靠性。
  • 易用性:ChatTTS为用户提供了易于使用的体验。它只需要文本信息作为输入,就可以生成相应的语音文件。这样的简单性使其方便有语音合成需求的用户。

下载ChatTTS模型文件

因最大模型文件超过900MB,为了防止使用Git无法直接下载到本地,我们通过git-lfs工具包下载:

brew install git-lfs

通过Git复制模型文件到笔记本电脑(文件夹:ChatTTS-Model):

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

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

git lfs pull

ChatTTS模型文件列表

安装ChatTTS依赖包列表

下载ChatTTS官网GitHub源码:

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

进入源码目录,批量安装Python依赖包

pip install -r requirements.txt

特别注意:如果下载过程中,若出现找不到torch2.1.0版本错误,请修改requirements.txt文件,把torch的版本修改为2.2.2后再次执行安装:

torch版本找不到

Python依赖包列表requirements.txt文件如下,我们也可以手工一个一个的进行安装,无需下载整个源码(注意:torch的版本号为2.2.2):

omegaconf~=2.3.0
torch~=2.2.2
tqdm
einops
vector_quantize_pytorch
transformers~=4.41.1
vocos
IPython

ChatTTS中文文本转音频文件

特别注意:经老牛同学的验证,ChatTTS官网的样例代码API已经过时,无法直接运行,特别是chat.load_models方法入参是错误的,下面是老牛同学通过阅读API入参且验证的可执行代码。

# ChatTTS-01.pyimport ChatTTS
import torch
import torchaudio# 第一步下载的ChatTTS模型文件目录,请按照实际情况替换
MODEL_PATH = '/Users/obullxl/PythonSpace/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

$ python ChatTTS-01.py
WARNING:ChatTTS.utils.gpu_utils:No GPU found, use CPU instead
INFO:ChatTTS.core:use cpu
INFO:ChatTTS.core:vocos loaded.
INFO:ChatTTS.core:gpt loaded.
INFO:ChatTTS.core:decoder loaded.
INFO:ChatTTS.core:tokenizer loaded.
WARNING:ChatTTS.core:dvae not initialized.
INFO:ChatTTS.core:All initialized.20%|██████████████████████████▌                    | 76/384 [00:08<00:35,  8.62it/s]26%|██████████████████████████████████▌            | 536/2048 [00:48<02:17, 10.98it/s]

上述文本转音频程序执行完成,在本地目录生成了./output/output-01.wav音频文件,打开该音频文件,就可以听到非常自然流畅的语音了!

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

# …… 其他包引用省略
from IPython.display import Audio# …… 其他部分代码省略# 播放生成的音频(autoplay=True 代表自动播放)
Audio(wavs[0], rate=24000, autoplay=True)

快速搭建WebUI界面

上面我们通过Python代码生成了音频文件,操作起来比较麻烦,现在我们构建一个WebUI可视化界面:

首先安装Python依赖包,列表如下:

pip install omegaconf~=2.3.0 transformers~=4.41.1
pip install tqdm einops vector_quantize_pytorch vocos
pip install modelscope gradio

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

WebUI可视化界面

# ChatTTS-WebUI.pyimport 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 = '/Users/obullxl/PythonSpace/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()

最后,运行WebUI程序,就可以享受可视化文本生成语音功能了:python ChatTTS-WebUI.py


关注本公众号,我们共同学习进步👇🏻👇🏻👇🏻

微信公众号:老牛同学


我的本博客原地址:https://mp.weixin.qq.com/s/rL3vyJ_xEj7GGoKaxUh8_A

部署Llama 3 8B开源大模型:玩转 AI,笔记本电脑安装属于自己的 Llama 3 8B 大模型和对话客户端

部署Llama 3 8BWeb版对话机器人:一文彻底整明白,基于 Ollama 工具的 LLM 大语言模型 Web 可视化对话机器人部署指南

部署中文版Llama 3(Llama3-Chinese-Chat) 大模型:基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型对话聊天机器人


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

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

相关文章

计算机网络ppt和课后题总结(下)

常用端口总结 计算机网络中&#xff0c;端口是TCP/IP协议的一部分&#xff0c;用于标识运行在同一台计算机上的不同服务。端口号是一个16位的数字&#xff0c;范围从0到65535。通常&#xff0c;0到1023的端口被称为“熟知端口”或“系统端口”&#xff0c;它们被保留给一些标准…

基于百度接口的实时流式语音识别系统

目录 基于百度接口的实时流式语音识别系统 1. 简介 2. 需求分析 3. 系统架构 4. 模块设计 4.1 音频输入模块 4.2 WebSocket通信模块 4.3 音频处理模块 4.4 结果处理模块 5. 接口设计 5.1 WebSocket接口 5.2 音频输入接口 6. 流程图 程序说明文档 1. 安装依赖 2.…

RHEL8/Centos8 install for PXE

PXE介绍 PXE&#xff08;Preboot Execution Environment&#xff09;是预引导执行环境的缩写。它是由Intel设计的&#xff0c;允许客户端计算机通过网络从服务器上加载操作系统镜像。PXE通常用于大规模部署操作系统&#xff0c;例如在企业或学校环境中。 PXE工作流程如下&…

【复现】含能量路由器的交直流混合配电网潮流计算

目录 1 主要内容 2 理论及模型 3 程序结果 4 下载链接 1 主要内容 程序复现《含能量路由器的交直流混合配电网潮流计算》&#xff0c;主要是对算例4.1进行建模分析&#xff0c;理论和方法按照文献所述。能量路由器&#xff08;ER&#xff09;作为新兴的电力元器件&#xff…

Spring Boot通过自定义注解和Redis+Lua脚本实现接口限流

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

FuTalk设计周刊-Vol.040

&#x1f525;AI漫谈 热点捕手 1、零代码定制游戏NPC&#xff0c;百川智能发布角色大模型 百川智能此次推出了“角色创建平台搜索增强知识库”的定制化解决方案。通过这一方案&#xff0c;游戏厂商无需编写任何代码&#xff0c;只需通过简单的文字描述&#xff0c;便可以快速…

IT人的拖延——都是“分心”惹的祸?

典型表现 我们说到拖延的原因有很多&#xff0c;还有一个原因是因为“分心太多“造成的&#xff0c;分心太多的拖延大致上有以下表现&#xff1a; 无法集中注意力&#xff1a; 分心太多会导致我们无法集中注意力在当前的工作任务上&#xff0c;我们可能会经常性地走神或者在工…

Vue12-计算属性

一、姓名案例 1-1、插值语法实现 1、v-bind v-bind的问题&#xff1a; 所以&#xff1a;v-bind是单向绑定。 2、v-model 解决v-bind的问题。 3、输出全名 方式一&#xff1a; 方式二&#xff1a; 需求优化&#xff1a;全名中的姓氏&#xff0c;只取输入框中的前三位&#xf…

VSCode数据库插件

Visual Studio Code (VS Code) 是一个非常流行的源代码编辑器&#xff0c;它通过丰富的插件生态系统提供了大量的功能扩展。对于数据库操作&#xff0c;VS Code 提供了几种插件&#xff0c;其中“Database Client”系列插件是比较受欢迎的选择之一&#xff0c;它包括了对多种数…

使用C++结合OpenCV进行图像处理与分类

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

基于STC12C5A60S2系列1T 8051单片机实现串口调试助手软件与单片机相互发送数据的RS485通信功能

基于STC12C5A60S2系列1T 8051单片机实现串口调试助手软件与单片机相互发送数据的RS485通信功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功…

力扣 74.搜索二维矩阵

题目描述&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&am…

决策树Decision Tree

目录 一、介绍发展优点缺点基本原理 二、熵1、熵2、条件熵3、信息增益4、信息增益率 三、基尼系数四、ID3算法1、建树过程2、优点3、缺点 五、C4.51、二分法处理连续变量1、流程&#xff1a;2、示例 2、缺点 六、CART1、连续数据处理2、离散数据处理3、CART回归原理1、均方误差…

【机器学习】机器学习引领AI:重塑人类社会的新纪元

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀机器学习引领AI &#x1f4d2;1. 引言&#x1f4d5;2. 人工智能&#xff08;AI&#xff09;&#x1f308;人工智能的发展&#x1f31e;应用领…

每日两题6

文章目录 删除并获得点数粉刷房子 删除并获得点数 分析 class Solution { public:int deleteAndEarn(vector<int>& nums) {const int N 10001;// 预处理int arr[N] {0};for (int& e : nums)arr[e] e;// 在 arr 上进行 打家劫舍 问题vector<int> f(N),…

【Python机器学习】NMF——模拟数据

与使用PCA不同&#xff0c;我们需要保证数据是正的&#xff0c;NMF能够对数据进行操作。这说明数据相对于原点(0,0)的位置实际上对NMF很重要。因此&#xff0c;可以将提取出来的非负向量看作是从(0,0)到数据的方向。 举例&#xff1a;NMF在二维玩具数据上的结果&#xff1a; …

FreeRTOS基础(十二):信号量

本篇博客&#xff0c;我们详细介绍另一个重要的应用&#xff0c;信号量。 目录 一、信号量的简介 1.0 举例理解 1.1 FreeRTOS中的应用 1.2 队列与信号量的对比 二、二值信号量 2.1 二值信号量的概念 2.2 二值信号量的API函数接口 2.2.1 使用二值信号量的过程 2.2.2 …

PDF转图片工具

背景&#xff1a; 今天有个朋友找我&#xff1a;“我有个文件需要更改&#xff0c;但是文档是PDF的&#xff0c;需要你帮我改下内容&#xff0c;你是搞软件的&#xff0c;这个对你应该是轻车熟路了吧&#xff0c;帮我弄弄吧”&#xff0c;听到这话我本想反驳&#xff0c;我是开…

IT闲谈-IMD是什么,有什么优势

目录 一、引言二、IDM是什么&#xff1f;三、IDM的优势1. 高速下载2. 稳定性强3. 强大的任务管理4. 视频下载5. 浏览器整合 四、应用场景1. 商务办公2. 教育学习3. 娱乐休闲 总结 一、引言 在数字化时代&#xff0c;下载管理器已成为我们日常工作和生活中不可或缺的工具。而在…

王学岗鸿蒙开发(北向)——————(四、五、六)ArkUi声明式组件

普通组件 1,注意&#xff0c;如上图&#xff0c;build只能有一个根节点 2,Entry表示程序的入口 Component表示自定义的组件 Preview表示可以预览 3&#xff0c;图片存放的地方 4&#xff0c; Image组件最好只给宽度&#xff0c;给了高度又给宽度容易失真。 build() {Row() {/…