MaskGCT,AI语音克隆大模型本地部署(Windows11),基于Python3.11,TTS,文字转语音

news/2025/1/23 4:02:38/文章来源:https://www.cnblogs.com/v3ucn/p/18511187

前几天,又一款非自回归的文字转语音的AI模型:MaskGCT,开放了源码,和同样非自回归的F5-TTS模型一样,MaskGCT模型也是基于10万小时数据集Emilia训练而来的,精通中英日韩法德6种语言的跨语种合成。数据集Emilia是全球最大且最为多样的高质量多语种语音数据集之一。

本次分享一下如何在本地部署MaskGCT项目,让您的显卡再次发烧。

安装基础依赖

首先确保本地已经安装好Python3.11环境,安装包可以去Python的官方下载:

python.org

随后克隆官方项目:

git clone https://github.com/open-mmlab/Amphion.git

官方提供了基于linux的安装shell脚本:

pip install setuptools ruamel.yaml tqdm   
pip install tensorboard tensorboardX torch==2.0.1  
pip install transformers===4.41.1  
pip install -U encodec  
pip install black==24.1.1  
pip install oss2  
sudo apt-get install espeak-ng  
pip install phonemizer  
pip install g2p_en  
pip install accelerate==0.31.0  
pip install funasr zhconv zhon modelscope  
# pip install git+https://github.com/lhotse-speech/lhotse  
pip install timm  
pip install jieba cn2an  
pip install unidecode  
pip install -U cos-python-sdk-v5  
pip install pypinyin  
pip install jiwer  
pip install omegaconf  
pip install pyworld  
pip install py3langid==0.2.2 LangSegment  
pip install onnxruntime  
pip install pyopenjtalk  
pip install pykakasi  
pip install -U openai-whisper

这里笔者为大家转换为适合Windows的requirements.txt依赖文件:

setuptools   
ruamel.yaml   
tqdm   
transformers===4.41.1  
encodec  
black==24.1.1  
oss2  
phonemizer  
g2p_en  
accelerate==0.31.0  
funasr   
zhconv   
zhon   
modelscope  
timm  
jieba   
cn2an  
unidecode  
cos-python-sdk-v5  
pypinyin  
jiwer  
omegaconf  
pyworld  
py3langid==0.2.2  
LangSegment  
onnxruntime  
pyopenjtalk  
pykakasi  
openai-whisper  
json5

运行命令:

pip3 install -r requirements.txt

安装依赖即可。

安装onnxruntime-gpu:

pip3 install onnxruntime-gpu

安装torch三件套:

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 

Windows配置espeak-ng

由于MaskGCT项目后端依赖espeak软件,所以需要在本地进行配置,eSpeak 是一个紧凑的开源文本转语音 (TTS) 合成器,支持多种语言和口音 。它使用“共振峰合成”方法,允许以较小的体积提供多种语言 。语音清晰,可以高速使用,但不如基于人类语音录音的较大合成器自然流畅,而MaskGCT就是在espeak的合成基础上进行二次推理。

首先运行命令安装espeak:

winget install espeak

如果装不上,也可以下载安装包手动安装:

https://sourceforge.net/projects/espeak/files/espeak/espeak-1.48/setup_espeak-1.48.04.exe/download

随后下载espeak-ng安装包:

https://github.com/espeak-ng/espeak-ng/releases

下载后双击安装。

接着把 C:\Program Files\eSpeak NG\libespeak-ng.dll 拷贝到 C:\Program Files (x86)\eSpeak\command_line 目录。

然后把 libespeak-ng.dll 重命名为 espeak-ng.dll

最后把 C:\Program Files (x86)\eSpeak\command_line 目录配置到环境变量即可。

MaskGCT本地推理

都配置好之后,编写推理脚本 local_test.py:

from models.tts.maskgct.maskgct_utils import *  
from huggingface_hub import hf_hub_download  
import safetensors  
import soundfile as sf  
import os  
import argparse  
os.environ['HF_HOME'] = os.path.join(os.path.dirname(__file__), 'hf_download')  print(os.path.join(os.path.dirname(__file__), 'hf_download'))  parser = argparse.ArgumentParser(description="GPT-SoVITS api")  
parser.add_argument("-p", "--prompt_text", type=str, default="说得好像您带我以来我考好过几次一样")  
parser.add_argument("-a", "--audio", type=str, default="./说得好像您带我以来我考好过几次一样.wav")  
parser.add_argument("-t", "--text", type=str, default="你好")  
parser.add_argument("-l", "--language", type=str, default="zh")  
parser.add_argument("-lt", "--target_language", type=str, default="zh")  
args = parser.parse_args()  if __name__ == "__main__":  # download semantic codec ckpt  semantic_code_ckpt = hf_hub_download("amphion/MaskGCT", filename="semantic_codec/model.safetensors")  # download acoustic codec ckpt  codec_encoder_ckpt = hf_hub_download("amphion/MaskGCT", filename="acoustic_codec/model.safetensors")  codec_decoder_ckpt = hf_hub_download("amphion/MaskGCT", filename="acoustic_codec/model_1.safetensors")  # download t2s model ckpt  t2s_model_ckpt = hf_hub_download("amphion/MaskGCT", filename="t2s_model/model.safetensors")  # download s2a model ckpt  s2a_1layer_ckpt = hf_hub_download("amphion/MaskGCT", filename="s2a_model/s2a_model_1layer/model.safetensors")  s2a_full_ckpt = hf_hub_download("amphion/MaskGCT", filename="s2a_model/s2a_model_full/model.safetensors")  # build model  device = torch.device("cuda")  cfg_path = "./models/tts/maskgct/config/maskgct.json"  cfg = load_config(cfg_path)  # 1. build semantic model (w2v-bert-2.0)  semantic_model, semantic_mean, semantic_std = build_semantic_model(device)  # 2. build semantic codec  semantic_codec = build_semantic_codec(cfg.model.semantic_codec, device)  # 3. build acoustic codec  codec_encoder, codec_decoder = build_acoustic_codec(cfg.model.acoustic_codec, device)  # 4. build t2s model  t2s_model = build_t2s_model(cfg.model.t2s_model, device)  # 5. build s2a model  s2a_model_1layer = build_s2a_model(cfg.model.s2a_model.s2a_1layer, device)  s2a_model_full =  build_s2a_model(cfg.model.s2a_model.s2a_full, device)  # load semantic codec  safetensors.torch.load_model(semantic_codec, semantic_code_ckpt)  # load acoustic codec  safetensors.torch.load_model(codec_encoder, codec_encoder_ckpt)  safetensors.torch.load_model(codec_decoder, codec_decoder_ckpt)  # load t2s model  safetensors.torch.load_model(t2s_model, t2s_model_ckpt)  # load s2a model  safetensors.torch.load_model(s2a_model_1layer, s2a_1layer_ckpt)  safetensors.torch.load_model(s2a_model_full, s2a_full_ckpt)  # inference  prompt_wav_path = args.audio  save_path = "output.wav"  prompt_text = args.prompt_text  target_text = args.text  # Specify the target duration (in seconds). If target_len = None, we use a simple rule to predict the target duration.  target_len = None  maskgct_inference_pipeline = MaskGCT_Inference_Pipeline(  semantic_model,  semantic_codec,  codec_encoder,  codec_decoder,  t2s_model,  s2a_model_1layer,  s2a_model_full,  semantic_mean,  semantic_std,  device,  )  recovered_audio = maskgct_inference_pipeline.maskgct_inference(  prompt_wav_path, prompt_text, target_text,args.language,args.target_language, target_len=target_len  )  sf.write(save_path, recovered_audio, 24000)

首次推理会在hf_download目录下载10个G的模型。

推理过程中,会占用11G的显存:

如果您的显存低于11G,那么务必打开Nvidia控制面板的系统内存回退策略,通过系统内存来补足显存:

如果愿意,也可以基于gradio写一个简单的webui界面,app.py:

import os  
import gc  
import re  
import gradio as gr  
import numpy as np  
import subprocess  
os.environ['HF_HOME'] = os.path.join(os.path.dirname(__file__), 'hf_download')  
# 设置HF_ENDPOINT环境变量  
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"  reference_wavs = ["请选择参考音频或者自己上传"]  
for name in os.listdir("./参考音频/"):  reference_wavs.append(name)  def change_choices():  reference_wavs = ["请选择参考音频或者自己上传"]  for name in os.listdir("./参考音频/"):  reference_wavs.append(name)  return {"choices":reference_wavs, "__type__": "update"}  def change_wav(audio_path):  text = audio_path.replace(".wav","").replace(".mp3","").replace(".WAV","")  # text = replace_speaker(text)  return f"./参考音频/{audio_path}",text  def do_cloth(gen_text_input,ref_audio_input,model_choice_text,model_choice_re,ref_text_input):  cmd = fr'.\py311_cu118\python.exe local_test.py -t "{gen_text_input}" -p "{ref_text_input}" -a "{ref_audio_input}" -l {model_choice_re} -lt {model_choice_text} '  print(cmd)  res = subprocess.Popen(cmd)  res.wait()  return "output.wav"  with gr.Blocks() as app_demo:  gr.Markdown(  """  
项目地址:https://github.com/open-mmlab/Amphion/tree/main/models/tts/maskgct  整合包制作:刘悦的技术博客 https://space.bilibili.com/3031494  
"""  )  gen_text_input = gr.Textbox(label="生成文本", lines=4)  model_choice_text = gr.Radio(  choices=["zh", "en"], label="生成文本语种", value="zh",interactive=True)  wavs_dropdown = gr.Dropdown(label="参考音频列表",choices=reference_wavs,value="选择参考音频或者自己上传",interactive=True)  refresh_button = gr.Button("刷新参考音频")  refresh_button.click(fn=change_choices, inputs=[], outputs=[wavs_dropdown])  ref_audio_input = gr.Audio(label="Reference Audio", type="filepath")  ref_text_input = gr.Textbox(  label="Reference Text",  info="Leave blank to automatically transcribe the reference audio. If you enter text it will override automatic transcription.",  lines=2,  )  model_choice_re = gr.Radio(  choices=["zh", "en"], label="参考音频语种", value="zh",interactive=True  )  wavs_dropdown.change(change_wav,[wavs_dropdown],[ref_audio_input,ref_text_input])  generate_btn = gr.Button("Synthesize", variant="primary")  audio_output = gr.Audio(label="Synthesized Audio")  generate_btn.click(do_cloth,[gen_text_input,ref_audio_input,model_choice_text,model_choice_re,ref_text_input],[audio_output])  def main():  global app_demo  print(f"Starting app...")  app_demo.launch(inbrowser=True)  if __name__ == "__main__":  main()

当然,别忘了安装gradio依赖:

pip3 install -U gradio

运行效果是这样的:

结语

MaskGCT模型的优势在于语气韵律层面十分突出,可以媲美真实语音,缺点也很明显,运行成本偏高,工程化层面优化不足。MaskGCT项目主页中已经有其商业版本模型的入口,据此推断,官方应该不会在开源版本中太过发力,最后奉上一键整合包,与众乡亲同飨:

MaskGCT一键包整合包 https://pan.quark.cn/s/e74726b84c78

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

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

相关文章

图像处理领域的加速算子收集

1、Simd库——CPU指令集加速 算子 Simd Library Documentation. 部分算子截图: 2、VPI库——CPU、GPU(CUDA)加速 算子 VPI - Vision Programming Interface: Algorithms 部分算子截图: 3、CV-CUDA库 算子 CV-CUDA — CV-CUDA Beta documentation 部分算子截图:

postgresql 下载安装

一、postgresql 下载 pg官网:postgres.org一般推荐用源码安装,下载 .tar.gz 包 二、安装 本文以12.6版本安装为例: 2.1、安装前要求和环境配置 # 1、要求GNU make版本3.80或以上(GNU make有时以名字gmake安装),要测试make版本可以使用以下命令(如果是安装其他版本的pg具…

“药品追溯到客户管理:数字化转型下的药企发展之路”

随着科技进步和市场环境的变化,医药企业面临着前所未有的机遇和挑战。数字化转型已成为药企创新管理模式、提升市场竞争力的关键举措。在这一过程中,药品追溯和客户管理作为重要环节,通过数字化手段可以实现信息的高效流通和透明管理。以下将从药品追溯、客户管理以及未来发…

sgx模拟执行,不需要sgx硬件---sgx executed in simulation,No need to support hardware for SGX

sgx executed in simulation 使用项目:https://github.com/intel/linux-sgx.git前言:目前国内和国外互联网上关于使用模拟模式来完成sgx的博客我是真的一点没有找到,因此自己写一份博客来完成记录 环境:Ubuntu22.04不支持sgx,没有硬件存在(mac也可以按照本教程来完成工作…

算法定制视频分析网关拍照检测工业园区/厂区/工厂智慧安监方案

一、方案背景 随着工业化进程的加速,特别是制造业、建筑业、化工等高风险行业,生产安全事故频发,对人们的生命安全和健康构成了严重威胁。为了有效预防和减少重大事故的发生,提高安全管理水平,智慧安监方案应运而生。 二、方案内容 智慧安监方案的核心在于利用物联网、大数…

IIC通信协议详解 PCF8591应用(Verilog实现)

详细介绍了IIC通信协议并给出如何使用PCF8591,用verilog实现.该文章结合PCF8591 8-bit AD/DA 模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易懂。该文图片均从PCF8591手册中截取,一定程度上引导读者学习阅读data sheet。 1. PCF8591引脚2. 功能介绍 2.1 地…

GaussDB 数据库实验环境搭建指导

@目录简介内容描述实验环境说明1 GaussDB数据库购买1.1 实验介绍1.1.1 关于本实验1.1.2 实验目的1.2 购买GaussDB数据库1.2.1 登录华为云1.2.2 购买华为云GaussDB数据库 简介 本指导书适用于在华为云部署购买GaussDB数据库,通过该指导书可以顺利完成GaussDB数据库在华为云的购…

Python 学习记录(3)

数据Pandas对数据帧各列的运算 import seaborn as sns import pandas as pd #从Seaborn 当中导入鸢尾花数据帧,并处理 iris_df=sns.load_dataset("iris") X_df=iris_df.copy() X_df.rename(columns={sepal_length:X1,sepal_width:X2},inplace=True) X_df_=X_df[[X1,…

Qt gridLayout布局占两格或两列在ui文件中实现

在Qt gridLayou布局里添加一个控件如何设置其占两格或多格如下图: 一 、如果是纯代码编写的界面 (大多是这个方式)在纯代码编写的界面应用中,可以使用函数QGridLayout::addWidget(QWidget *w, int row, int column, int rowSpan, int columnSpan, Qt::Alignment =…

GaussDB火焰图分析

问题描述 CPU利用率是衡量系统负载和健康度的重要指标之一,系统在运行过程中时常发生CPU利用率高的情况。在分析性能问题时,可通过火焰图查看CPU耗时,了解瓶颈在哪里。 问题现象 部分sql执行速度不符合预期。 告警慢sql告警。 cpu使用率高告警。 数据库整体运行慢。业务影响…

为什么MySQL单表不能超过2000万行? (1)

​ 最近看到一篇《我说MySQL每张表最好不要超过2000万数据,面试官让我回去等通知》的文章,非常有趣。 文中提到,他朋友在面试的过程中说,自己的工作就是把用户操作信息存到MySQL里,因为数据量超大(5000万条左右),需要每天定时生成3张表,然后将数据取模分别存到这三张表…

js逆向笔记

Cookie 和 Session: 服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。 为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。 Cookie:通过在 客户端 记录的信息确定用户的身…