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

2/22/2024 GPT-SoVITS语音克隆VITS语音合成Whisper语音识别ChatTTS语音合成UVR5提取人声

# 1. GPT-SoVITS基本介绍

# 1.1 GPT-SoVITS简介

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

GPT-SoVITS主界面

# 1.2 VITS语音合成

VITS:用于端到端文本到语音的具有对抗学习的条件变分自动编码器,生成的语音效果比较好。

项目简介:最近已经提出了几种支持单阶段训练和并行采样的端到端文本到语音 (TTS) 模型,但它们的样本质量与两阶段 TTS 系统的样本质量不匹配。在这项工作中,我们提出了一种并行的端到端 TTS 方法,它比当前的两阶段模型生成更自然的声音。我们的方法采用通过标准化流和对抗训练过程增强的变分推理,提高了生成建模的表达能力。我们还提出了一个随机持续时间预测器,以从输入文本中合成具有不同节奏的语音。通过对潜在变量的不确定性建模和随机持续时间预测器,我们的方法表达了自然的一对多关系,其中文本输入可以以不同的音高和节奏以多种方式说出。

VITS语音合成

应用实例:https://github.com/JOETtheIV/VITS-Paimon (opens new window)(效果体验:派蒙语音合成Google-Colab (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。

# 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. 其他语音处理项目

# 5.1 Whisper语音识别

# 5.1.1 Whisper简介

Whisper 是一个自动语音识别系统,OpenAI 通过从网络上收集了 68 万小时的多语言(98 种语言)和多任务监督数据对 Whisper 进行了训练。OpenAI 认为使用这样一个庞大而多样的数据集,可以提高对口音、背景噪音和技术术语的识别能力。除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。

它有五种模型尺寸,提供速度和准确性的平衡,下面是可用模型的名称、大致内存需求和相对速度。

Size Parameters English-only model Multilingual model
tiny 39 M
base 74 M
small 244 M
medium 769 M
large 1550 M

# 5.1.2 Whisper原理

一种 Transformer 序列到序列模型被训练用于各种语音处理任务,包括多语种语音识别、语音翻译、口语语言识别以及语音活动检测。这些任务共同以一个需要被解码器预测的符号序列的形式进行表示,从而使得单个模型可以替代传统语音处理管道中的多个阶段。多任务训练格式使用一系列特殊的符号作为任务指示符或分类目标。

Whisper原理

# 5.1.3 Whisper使用示例

Whisper.cpp 是 OpenAI Whisper 模型的一个实现,可以在本地进行语音识别。

实验环境:Macbook Pro 2021,M1 pro芯片,16G内存,macOS Ventura13.2.1系统,Python3.9环境

首先需要安装 ffmpeg 工具库,它是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源工具。

$ brew install ffmpeg
$ ffmpeg -version
1
2

之后拉取 Whisper.cpp 项目代码并进行编译,然后下载相应的模型。

$ export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890
$ git clone https://github.com/ggerganov/whisper.cpp.git
$ make
$ ./models/download-ggml-model.sh small
1
2
3
4

然后可以随便找个单声道的音频进行测试,可以使用 ffmpeg 进行转换。

$ ffmpeg -i ./test.mp3 -ar 16000 -ac 1 -c:a pcm_s16le ./test.wav      // 将mp3音频转换成wav音频
$ ffmpeg -i ./test.mp4 -f wav -ar 16000 ./test.wav                    // 从mp4视频中提取wav音频
1
2

执行如下命令提取音频的文本:

$ ./main -m models/ggml-small.bin --language zh -f ./test.wav
1

运行效果如下:

Whisper.cpp运行效果

注:在 Apple Silicon 设备上,编码器推理可以通过 Core ML 在 Apple Neural Engine 上执行,这可以带来显著的加速——与仅 CPU 执行相比快 3 倍以上。

# 5.2 ChatTTS对话场景语音合成

# 5.2.1 ChatTTS简介

ChatTTS是专门为对话场景设计的文本转语音模型,例如LLM助手对话任务。它支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练。在HuggingFace中开源的版本为4万小时的训练尚未有SFT版本。

# 5.2.2 部署ChatTTS服务

实验环境:普通的CPU服务器,Debian11,Python 3.10(该项目用CPU可以跑,不过生成速度有些慢,最好是使用GPU来跑,那样速度就很快了)

拉取代码并安装项目依赖:

$ git clone https://github.com/2noise/ChatTTS
$ cd ChatTTS
$ pip3 install -r requirements.txt
$ pip3 install gradio
$ conda install -c conda-forge pynini=2.1.5 && pip install WeTextProcessing
1
2
3
4
5

下载模型到指定位置:

# -*- coding: utf-8 -*-

import os
from huggingface_hub import snapshot_download

# 设置代理
# os.environ['http_proxy'] = 'http://127.0.0.1:7890'
# os.environ['https_proxy'] = 'http://127.0.0.1:7890'

# 模型仓库的标识
repo_id = "2Noise/ChatTTS"

# 下载模型到指定目录
local_dir = "./models"

# 检查目录是否存在,如果不存在则创建
if not os.path.exists(local_dir):
    os.makedirs(local_dir)

snapshot_download(repo_id=repo_id, local_dir=local_dir)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

部署服务:

$ python3 webui.py --local_path './models'
1

# 5.2.3 测试语音合成效果

使用体验:实际效果相当惊艳,能够精确预测并精细调控语音中的韵律特征,包括笑声、停顿及插入语等,非常接近于人声了。

ChatTTS效果

# 5.3 OpenVoice语音克隆

# 5.3.1 OpenVoice简介

自2023年5月以来,OpenVoice一直在为myshell.ai提供即时语音克隆功能。直到2023年11月,全球用户已经使用了数千万次语音克隆模型,并见证了该平台上用户数量的爆炸性增长。

OpenVoice原理图

# 5.3.2 部署OpenVoice服务

实验环境:租用的AutoDL的GPU服务器,NVIDIA A5000 / 24GB,Ubuntu20.04,Python 3.10, CUDA 11.8

Step1:拉取代码并安装依赖

$ source /etc/network_turbo   // 设置AutoDL提供的科学上网代理
$ git clone https://github.com/myshell-ai/OpenVoice.git
$ cd /root/OpenVoice
$ pip3 install -r requirements.txt
$ apt-get update && apt install ffmpeg
$ ffmpeg -version
$ ffprobe -version
1
2
3
4
5
6
7

注:Pytorch环境使用了镜像里自带的那个,这里就不重复安装了。

Step2:下载模型文件并解压到checkpoints目录

$ curl -o checkpoints_1226.zip https://myshell-public-repo-hosting.s3.amazonaws.com/checkpoints_1226.zip
$ unzip checkpoints_1226.zip -d ./
1
2

注:后面执行时还会自动下载WavMark模型,如果网络不通可手动下载,https://huggingface.co/M4869/WavMark (opens new window)

Step3:指定6006端口启动应用服务

示例源码里加了校验,Text Prompt需要在2-200之间,这个将openvoice_app.py的校验代码注释掉即可解决。

$ export GRADIO_SERVER_PORT=6006
$ python3 openvoice_app.py
1
2

之后使用AutoDL的“自定义服务”功能,使其在本地访问该应用。

# 5.3.3 测试语音克隆的效果

左侧修改Text Prompt、选择Style、上传Reference Audio,勾选Agree后,点击Send,之后右侧便会有克隆出的语音。

OpenVoice语音克隆

使用体验:英文支持所有Style,中文仅支持default Style,实际体验英文的克隆效果还可以,但中文的克隆声音太难听了,它的实际效果不如GPT-SoVITS。

# 6. 参考资料

[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)

[5] Whisper的使用 from LI的技术笔记 (opens new window)

[6] 中文普通话语音识别开源数据集 from CSDN (opens new window)

[7] ffmpeg 从视频中提取WAV格式的音频 from CSDN (opens new window)

[8] ChatTTS:对话式高可控的语音合成模型 from Bilibili (opens new window)

Last Updated: 6/2/2024, 1:15:42 AM