GPT-SoVITS的本地部署与使用

GPT-SoVITS的本地部署与使用,支持本地调试和本地接口调用

前言

对GPT-SoVITS的学习也是早有预谋了,起因是前面的一个Blog对应Demo需要的模块,通过用户输入返回给文本AI响应,并发送给TTS生成音频,且音频音色要与对应的Live2D角色相近。。。
欸!这不是能给我们的《数据分析与可视化实践》课程的speech_agent替掉吗?

先列出学习过程中的参考:
官方教程文档

安装

整合包仓库链接

img1

在上面的文件中,后缀为cu128是适配N卡50系以上的包,由于我们不是50系显卡,选择cu124
我这里选择了GPT-SoVITS-1007-cu124.7z。

下载后正常解压即可

img2

模型的下载

为了连贯性,写在使用说明前面。

模型是什么: 模型是TTS的灵魂本身,即生成的声音的 音色来源,你想听到什么样的声音就去找什么样的模型。当然以我们本地的算力是不支持训练模型的,所以我们的选择是在各大论坛和技术交流网站寻找合适的模型。

模型的版本是什么: 目前的模型分为v1,v2,v2pro,v2proplus,v4的版本,可以在GPT-SoVITS使用对应的版本进行生成。

模型下载资源(由于GPT-SoVITS的用途,模型大多都是二次元相关的):

官方文档提供的模型分享社区 : https://www.ai-hobbyist.com

几位大佬自己训练的模型 : https://pan.baicai1145.com/baicai1145/GPT-SOVITS%E6%A8%A1%E5%9E%8B/V4

太有互联网精神了😭

模型下载并解压,以v4版本的模型为例,将 .pth 后缀的文件放在项目文件夹下的 SoVITS_weights_v4 下, 将 .ckpt 后缀的文件放在项目文件夹下的 GPT_weights_v4 下。
注意 :下载的是什么版本的模型就放在对应的 _vxxx 的文件夹下

下载后的模型文件夹下如果有一些 模型作者留下的音频文件 ,记得保留,后面会用到。

进入TTS推理WebUI

作者提供了WebUI的使用和Api调用两种方法,我们先从图形化界面的使用开始,并捎带一些简单的基础知识。

双击根目录下的 go-webui.bat 文件,稍加等待,cmd会在加载完成后跳转至运行的图形化界面(网页),默认url: http://0.0.0.0:9874
界面如下:

img3

由于我们是直接下载别人的模型使用,依次点击 1-GPT-SoVIRS-TTS1C-推理开启TTS推理WebUI
随后稍等片刻,等待新页面弹出。

img4

随后进入了新页面

img5

使用TTS推理WebUI

GPT模型列表和SoVITS模型列表

分别选择之前我们放在对应文件夹下的模型即可

请上传3-10秒内参考音频 与 参考音频的文本

选择模型文件夹下作者附带的参考音频即可,参考音频的文本输入对应音频内容的文本即可(一般也会随模型附带)

模型本身的文件决定了它的音色,这两项的作用是确定接下来模型的语调。所以在自己训练模型使用时也可以根据要生成的语音,选择对应的参考音频,从而展现出生成音频的带有情绪化的语调。

参考音频的语种 与 需要合成的文本 与 需要合成的语种

顾名思义,要生成什么填什么。

在此提醒,最好使用对应语言训练的模型输出对应的语言,如果强迫让日文模型说中文会有一股丁真的风味,同样中文模型说英文也会有Chinglish的味道。 正如前面所说,训练模型时留下的音色决定了上面的不同,不同的语言的不同发音习惯导致了这一点。

剩下的一些参数

不懂就别乱调,因为我也不懂

最终示例

img6

接口调用

那么如何使用接口去调用GPT-SoVITS呢?
所幸,作者考虑了这一点,为我们留下了宝贵的财富——根目录下的 api_v2.py

修改bat 并启动api服务

方便起见,我们仍然使用bat启动程序。
在根目录下新建文件 api.bat
记事本打开,输入

1
2
3
4
5
6
set "SCRIPT_DIR=%~dp0"
set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%"
cd /d "%SCRIPT_DIR%"
set "PATH=%SCRIPT_DIR%\runtime;%PATH%"
runtime\python.exe -I api_v2.py
pause

保存并退出,随后双击 api.bat 即可启动项目的api端口

随后观察cmd(现在是运行py的状态,没有图形化界面了,cmd的输出至关重要)

1
2
3
4
5
6
7
8
9
10
C:\Users\X.J\Desktop\GPT-SoVITS-1007-cu124>runtime\python.exe -I api_v2.py
---------------------------------------------TTS Config---------------------------------------------
device : cuda:0
is_half : True
version : v4
t2s_weights_path : models/v4\优香\优香-e10.ckpt
vits_weights_path : models/v4\优香\优香_e10_s140_l32.pth
bert_base_path : GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large
cnhuhbert_base_path : GPT_SoVITS/pretrained_models/chinese-hubert-base
----------------------------------------------------------------------------------------------------

会自动读取你的模型
来自路径 GPT-SoVITS-1007-cu124\GPT_SoVITS\configs\tts_infer.yaml

修改其中的模型路径以及版本即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
custom:
bert_base_path: GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large
cnhuhbert_base_path: GPT_SoVITS/pretrained_models/chinese-hubert-base
device: cuda:0
is_half: true

# t2s_weights_path: "C:\\Users\\X.J\\Desktop\\GPT-SoVITS-1007-cu124\\GPT_weights_v4\\\\u6821\u957FZH-e10.ckpt"
# version: v4
# vits_weights_path: "C:\\Users\\X.J\\Desktop\\GPT-SoVITS-1007-cu124\\SoVITS_weights_v4\\\\u6821\u957FZH_e4_s1064_l32.pth"

t2s_weights_path: "C:\\Users\\X.J\\Desktop\\GPT-SoVITS-1007-cu124\\GPT_weights_v2ProPlus\\yuuka_v2_pro_plus-e25.ckpt"
version: v2ProPlus
vits_weights_path: "C:\\Users\\X.J\\Desktop\\GPT-SoVITS-1007-cu124\\SoVITS_weights_v2ProPlus\\yuuka_v2_pro_plus_e20_s380.pth"

随后再观察

1
2
3
4
INFO:     Started server process [26560]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:9880 (Press CTRL+C to quit)

证明api服务启动成功

观察接口

浏览器输入 http://127.0.0.1:9880/docs ,即可进入项目的fastapi界面,其中我们主要使用的只有一个接口 /tts

观察接口需要的参数:

img7

其中 text 与 text_lang 为需要生成的文本和语言
注意: text_lang为英文缩写,ch ja en 等

ref_audio_path 为参考音频的路径

prompt_text 与 prompt_lang 为参考音频的文本和语言

调用接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def get_tts_audio(text: str, output_file: str = "output.wav") -> bool:
# 这里text为需要生成的文本(函数调用时写入),其他的写入环境变量即可
params = {
"text": text,
"text_lang": TEXT_LANG,
"ref_audio_path": REF_AUDIO_PATH,
"prompt_lang": PROMPT_LANG,
"prompt_text": PROMPT_TEXT,
"text_split_method": "cut5",
"batch_size": 1,
"media_type": "wav",
"streaming_mode": False
}

try:
response = requests.get("http://127.0.0.1:9880/tts", params=params)
if response.status_code == 200:
with open(output_file, "wb") as f:
f.write(response.content)
print(f"音频已保存至:{output_file}")
return True
else:
print(f"TTS API调用失败:{response.json().get('message', '未知错误')}")
return False
except Exception as e:
print(f"调用TTS API时发生错误:{str(e)}")
return False

调用接口后可以观察cmd输出,会有一个小进度条,完成后音频则输出在指定位置。