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.pswp.cn/bicheng/74300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74300.shtml
英文地址,請注明出處:http://en.pswp.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…