GPT-SoVITS音频处理及语音克隆

2/22/2024 GPT-SoVITS语音克隆UVR5提取人声音频降噪切分打标

# 1. GPT-SoVITS简介

一个开源的TTS项目,支持在Linux、MacOS、Win下运行,只需要1分钟的音频文件就可以克隆声音,支持将汉语、英语、日语三种语言的文本转为克隆声音。

GPT-SoVITS主界面

注:GPT-SoVITS的训练速度快,效果较好。之前我尝试过OpenVoice语音克隆,但这个中文效果不好,详见:Whisper语音识别及VITS语音合成 (opens new window)

# 2. GPT-SoVITS部署面板

# 2.1 准备实验环境

# 2.1.1 租用GPU服务器

实验环境:租用的AutoDL的GPU服务器,NVIDIA RTX 3080 / 10GB,Ubuntu20.04,Python 3.9, CUDA 11.8。

由于这家的服务器都是境内的,拉取Github代码和HuggingFace模型都会受到墙的干扰,建议配置一下代理。

$ source /etc/network_turbo
1

另外,该服务器上的服务不可被外界直接调用,如有需要,可使用自定义服务。

  • 打开自定义服务,在本地终端输入上述命令(6006换成服务器实际部署服务的端口),之后就可以在本地通过127.0.0.1:6006去访问服务器部署的服务了。

本地访问AutoDL部署的服务

注:现在这个“自定义服务”需要实名认证,6006端口只是个示例,可以换成任意端口,也可以开多个。

# 2.1.2 安装基础环境

安装conda环境

$ curl -O https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh   // 从官网下载安装脚本
$ bash Anaconda3-2019.03-Linux-x86_64.sh           // 阅读协议确认安装,安装完成后再输入yes以便不需要手动将Anaconda添加到PATH
$ conda create -n GPTSoVits python=3.9             // 安装虚拟环境,GPTSoVits是给虚拟环境起的别名(任意即可)
$ source /root/miniconda3/etc/profile.d/conda.sh   // conda初始化
$ conda activate GPTSoVits                         // 激活虚拟环境
1
2
3
4
5

安装其他版本的CUDA/cuDNN

$ conda search cudatoolkit
$ conda install cudatoolkit==11.8.0
$ conda list cudatoolkit
$ conda search cudnn --channel nvidia
$ conda install cudnn=8.9.2.26
$ conda list cudnn
1
2
3
4
5
6

注:默认镜像都内置了最原生的CUDA和cuDNN,如果您自己安装了cudatoolkits等,那么一般会默认优先使用conda中安装的cudatoolkits。

# 2.2 部署GPT-SoVITS服务

# 2.2.1 拉取代码安装依赖

拉取GPT-SoVITS代码,使用官方提供的一键脚本安装依赖。

$ git clone https://github.com/RVC-Boss/GPT-SoVITS.git
$ cd GPT-SoVITS
$ conda activate GPTSoVits   
$ bash install.sh
1
2
3
4

# 2.2.2 下载模型文件

可以通过如下链接并点击“下载副本”来下载这两个模型,然后将模型文件放置到指定目录。

# 2.2.3 启动WebUI面板

启动服务,然后配置一下自定义服务(下同,不再赘述),在本地 http://localhost:9874 进行访问。

$ python3 webui.py
1

# 3. GPT-SoVITS训练模型

GPT-SoVITS WebUI提供了完整的数据集制作、模型微调训练、语音克隆推理功能,如果只是想体验效果,可以直接使用4.3节官方分享的派蒙语音模型。

# 3.1 数据集处理

# 3.1.1 使用UVR5处理原音频

如果原音频足够干净可以跳过这步,比如游戏中提取的干声。

点击开启Open UVR5-WebUI,稍加等待之后,打开http://localhost:9873地址。

使用UVR5处理原音频

先用HP2模型处理一遍(提取人声),然后将输出的干声音频再用onnx_dereverb最后用DeEcho-Aggressive(去混响),输出格式选wav。

使用UVR5分离人声

处理完的音频vocal是人声,instrument是伴奏,vocal才是要用的文件,其他都可以删除,结束后建议到WebUI里关闭UVR5以节省显存。

分离出的人声音频

# 3.1.2 切割音频

在切割音频前建议把所有音频拖进音频软件(如剪映)调整音量,最大音量调整至-9dB到-6dB,过高的删除。

打开WebUI,首先输入原音频的文件夹路径,然后建议可以调整的参数有min_length、min_interval和max_sil_kept单位都是ms,其他参数不建议调整。

  • min_length根据显存大小调整,显存越小调越小。
  • min_interval根据音频的平均间隔调整,如果音频太密集可以适当调低。
  • max_sil_kept会影响句子的连贯性,不同音频不同调整,不会调的话保持默认。

点击开启语音切割,马上就切割好了,默认输出路径在output/slicer_opt。

切割音频

打开切分文件夹,将时长超过“显存数”秒的音频手动切分至“显存数”秒以下。比如显卡是3080显存是10g,那么建议将超过10s的音频手动切分至10s以下或者直接删掉(稍微超一点儿的可以不管),音频时长太长的可能会爆显存。如果语音切割后还是一个文件,那是因为音频太密集了,可以调低min_interval。

切割后的音频文件

# 3.1.3 音频降噪

如果原音频足够干净可以跳过这步,比如游戏中提取的干声。

输入刚才切割完音频的文件夹,默认是output/slicer_opt目录,然后点击开启语音降噪,默认输出路径在output/denoise_opt。

开启语音降噪

# 3.1.4 打标并校对

只要把刚才的切分文件夹输入,如果音频降噪过,那么默认是output/denoise_opt目录,如果切分了没有降噪,那么默认是output/slicer_opt目录。

然后选择达摩ASR或者fast whisper,点开启离线批量ASR就好了,默认输出是output/asr_opt这个路径。这里需要等待一些时间,因为它要下载模型。

  • 达摩ASR只能用于识别中文,效果也最好。
  • fast whisper可以标注99种语言,是目前最好的英语和日语识别,模型尺寸选large V3,语种选auto自动就好了。

由于识别出的文本不够准确,因此需要人工校对标注(这步比较费时间,如果不追求极致效果可以跳过。这里我只是为了跑个流程,此步骤就略过了)

  • 注:如果有字幕的可以用字幕标注,那就更准确了,内嵌字幕或者外挂字幕都可以。

打标并校对

# 3.2 微调训练

# 3.2.1 数据集格式化

来到1-GPT-SOVITS-TTS选项卡,填写Experiment/model name(实验名,不要有中文)、Text labelling file(标注文件)、Audio dataset folder(音频数据集)

填写微调训练的基本配置

填写完成后,分别点击下面三个按钮,每个按钮点完后,等待执行结束再点击下一个。如果出现报错,就去看一下后台日志,有的报错重试就可以走通。

数据集格式化

注:也可以直接使用 Start one-click formatting 按钮一键完成这三步操作。

# 3.2.2 训练微调模型

选择 1B-Fine-tuned training 子选项卡,配置batch_size等参数。然后依次点击 Start SoVITS training、Start GPT training。不可以一起训练(除非有两张卡)。如果中途中断了,直接再点开始训练就好了,会从最近的保存点开始训练。

sovits训练建议batch_size设置为显存一半以下,高了会爆显存,也不是越高就训练越快,它需要根据数据集大小调整,也并不是严格按照显存数一半来设置,如果爆显存就调低。以下是切片长度为10s时实测的不同显存的sovits训练最大batch_size,可以对照这个设置。如果切片更长、数据集更大的话要适当减少。

显存 batch_size 切片长度
6g 1 10s
8g 2 10s
12g 5 10s
16g 8 10s
22g 12 10s
24g 14 10s
32g 18 10s
40g 24 10s
80g 48 10s

在0213版本之后添加了dpo训练。dpo大幅提升了模型的效果,几乎不会吞字和复读,能够推理的字数也翻了几倍,但同时训练时显存占用多了2倍多,训练速度慢了4倍,12g以下显卡无法训练。数据集质量要求也高了很多,如果数据集有杂音,有混响,音质差,不校对标注,那么会有负面效果。

如果你的显卡大于12g,且数据集质量较好,且愿意等待漫长的训练时间,那么可以开启dpo训练。否则请不要开启。下面是切片长度为10s时实测的不同显存的gpt训练最大batch_size。如果切片更长、数据集更大的话要适当减少。

显存 未开启dpo batch_size 开启dpo batch_size 切片长度
6g 1 无法训练 10s
8g 2 无法训练 10s
12g 4 1 10s
16g 7 1 10s
22g 10 4 10s
24g 11 6 10s
32g 16 6 10s
40g 21 8 10s
80g 44 18 10s

接着设置轮数,SoVITS模型轮数可以设置的高一点,反正训练的很快。GPT模型轮数一般情况下建议设置10,不要高于20。

训练微调模型

有关训练参数的常见问题:

  • 关于高训练轮数:但高轮数并不就是好,如果要训练高轮数请先保证数据集质量极好,标注全都经过手动校对,时长至少超过1小时才有必要拉高轮数。否则默认的十几轮效果已经很好了。
  • 关于数据集长度:请先保证数据集质量。音频千万不能有杂音,要口齿清晰,响度统一,没有混响,每句话尽量完整,全部手动校对标注。30分钟内有明显提升,不建议再增加数据集长度。

# 4. GPT-SoVITS推理服务

# 4.1 开启推理服务页面

选择 1C-inference 子选项卡,选择模型路径(没出来的话就点击右侧按钮刷新),然后点击 Open TTS inference WEBUI 按钮打开推理页面。

开启推理服务页面

稍加等待之后,打开http://localhost:9872地址。

推理服务页面

# 4.2 使用语音克隆推理

第一步选择模型,第二步上传参考语音及文本(建议5s左右,参考音频很重要,会学习语速和语气,请认真选择),第三步输入用于语音克隆的文本。

语音克隆推理

# 4.3 模型分享及使用

分享需要的模型都在SoVITS_weights和GPT_weights这两个目录,选择合适轮数的模型,记得带上参考音频一起打包成压缩文件,就可以分享了。

模型分享

官方提供了个极佳模型的分享(使用30小时派蒙数据集,100%正确率标注):派蒙-30h.zip (opens new window)

派蒙-30h目录结构

把它下载下来上传到SoVITS_weights和GPT_weights目录即可,然后使用参考音频体验其效果。

使用派蒙-30h模型

# 5. 参考资料

[1] GPT-SoVITS用一分钟语音完美克隆自己的声音 from 微信公众号 (opens new window)

[2] GPT-SoVITS指南 from 官方文档 (opens new window)

[3] GPT-SoVITS整合包教程 from 官方文档 (opens new window)

[4] GPT-SoVITS使用字幕标注 from 官方文档 (opens new window)

Last Updated: 2/22/2024, 10:14:03 PM