文章目录
讲解链接
源码地址:https://github.com/RVC-Boss/GPT-SoVITS
文档
一、GPT-SoVITS特色
1)GPT-SoVITS项目特点
1、Zero-shot TTS: Input a 5-second vocal sample and experience instant text-to-speech conversion.
5秒钟克隆tts集外银色(不包含说话方式和咬字上的口癖)一般能80%到95%像
2、Few-shot TTS: Fine-tune the model with just 1 minute of training data for improved voice similarity and realism.
1分钟素材tts微调可以逼近真人(训练时间成本5~10分钟)
3、Cross-lingual Support: Inference in languages different from the training dataset, currently supporting English, Japanese, Korean, Cantonese and Chinese.
tts跨语言推理(已支持英文、日语、中文、汉语、粤语)
4、WebUI Tools: Integrated tools include voice accompaniment separation, automatic training set segmentation, Chinese ASR, and text labeling, assisting beginners in creating training datasets and GPT/SoVITS models.
独立可调试用的webUI页面调试工具
2)TTS定义
TTS(Text-To-Speech)这是一种文字转语音的语音合成。类似的还有SVC(歌声转换)、SVS(歌声合成)等。目前GPT-SoVITS只有TTS功能,也就是不能唱歌。
- 各版本特点
①GPT-SoVITS-V1实现了:
● 由参考音频的情感、音色、语速控制合成音频的情感、音色、语速
● 可以少量语音微调训练,也可不训练直接推理
● 可以跨语种生成,即参考音频(训练集)和推理文本的语种为不同语种
②GPT-SoVITS-V2新增特点:
● 对低音质参考音频合成出来音质更好
● 底模训练集增加到5k小时,zero shot性能更好音色更像,所需数据集更少
● 增加韩粤两种语言,中日英韩粤5个语种均可跨语种合成
● 更好的文本前端:持续迭代更新。V2中英文加入多音字优化。
③GPT-SoVITS-V3V4新增特点:
● 音色相似度更像,需要更少训练集来逼近本人(甚至不需要训练SoVITS)
● GPT合成更稳定,重复漏字更少,也更容易跑出丰富情感
● v4修复了v3非整数倍上采样可能导致的电音问题,原生输出48k音频防闷(而v3原生输出只有24k)。作者认为v4是v3的平替,更多还需测试。
二、克隆音色操作示例
-
更详细清晰的连接
链接 -
步骤
①先去除背景音乐杂音
1)去除背景音乐(数据集处理):UVR5模型
- 用到的模型
①model_bs_roformer_ep_317_sdr_12.9755模型:提取人声
②onnx_dereverb最后用DeEcho-Aggressive:将输出的干声音频去混响 - 备注
model_bs_roformer_ep_317_sdr_12.9755(常简写为model_bs_roformer_ep_317_sdr_12)是UVR5中用于人声分离的关键模型之一13。该模型在UVR5中替换了原有的hp2模型,大幅提升了人声分离的效果3。用户需要将该模型文件(通常命名为Bs_Roformer.pth)放置在UVR5的指定模型目录下使用2。该模型属于MDX-Net架构系列,专门用于从音频中提取人声或伴奏,其性能指标SDR 12.9755代表了较高的音源分离质量1。安装后,用户可在UVR5的模型选择界面直接调用该模型进行人声分离操作2。 - 步骤
打开文件来到根目录,双击go-webui.bat打开,不要以管理员身份
运行!
这就是正常打开了,稍加等待就会弹出网页。如果没有弹出网页可以复制http://0.0.0.0:9874到浏览器打开
在开始使用前先提醒一下大家:打开的bat不可以关闭!这个黑色的bat框就是控制台,所有的日志都会在这上面呈现,所有的信息以控制台为准。如果要向别人提问请写清楚:哪一步骤+网页端(方便看你填没填对)+控制台截图!所有的报错都在控制台上!Error后面的一般是报错
打开伴奏音频分离工具填写音频地址:
点击开启UVR5-WebUI稍加等待就会自动弹出图二的网页,如果没有弹出复制http://0.0.0.0:9873到浏览器打开
先用model_bs_roformer_ep_317_sdr_12.9755模型(已经是目前最好的模型)处理一遍(提取人声),然后将输出的干声音频再用onnx_dereverb最后用DeEcho-Aggressive(去混响),输出格式选wav。输出的文件默认在GPT-SoVITS-beta\output\uvr5_opt这个文件夹下,建议不要改输出路径,到时候找不到文件谁也帮不了你。处理完的音频(vocal)的是人声,(instrument)是伴奏,(_vocal_main_vocal)的没混响的,(others)的是混响。(vocal)(_vocal_main_vocal)才是要用的文件,其他都可以删除。结束后记得到WebUI关闭UVR5节省显存。
如果没有成功输出,报错了(现在版本应该不会报错了)。
那么推荐使用下面一种方法——UVR5客户端。
创建输入目录audio和输出目录vocal
关闭分离工具的打钩节省显存
填写输入音频目录和切分输出目录、填写要语音识别(音频转文本)的音频输入目录,分别作语音切分和语音识别=》将原来语音切分后进行语音识别成文本
语音识别结果在output/asr_opt这个目录下能找到
把语音识别的结果文件,也就是list文件作为标准工具的数据,用作文本校对,并打钩webUI
有杂音的或样本太少的文本建议删除
2)生成特征文件
得到文件后来到下一个目录
填写三个打*的地方
点击一键三连开始生成
生成特征文件
3)分别进行两个子模型微调
顺序随意
显存需求
4)推理界面试用
勾选点击按钮开始推理
推理前需要上传目标音色的参考视频,并填写对应的文本和语种
合成速度:3090每秒合成三秒长度
三、原理讲解
1)Sovits原理讲解
-
原理步骤
①首先通过softVC编码器去除音色
②然后通过VITS解码器重建音频
③在重建的过程中模型将训练集音色学习进它的参数中,因此输入其他音色的语音进过编码后,VITS模型也能重建出学习过的音色语音 -
最大的问题:
编码器encoder去除音色这一步,事实上目前没有完全去除音色的特征,只有去音色相对强的特征,这也是为什么sovit编码器最后选用ContentVec作为编码器的原因
-
露音色备注
转换音色失败,不是自己想要的 -
CN_Hubert音色引导作用(原始Hubert使用wenet中文数据训练)
保留丰富的音色信息反而成他的特色,结合RVQ将音频转化为包含音色的语义token,然后用类GPT模型将他补全
- 库目录
四、服务构建
1)环境安装(自动安装)
- 步骤
①安装conda并初始化conda环境
②开始安装其他环境
①安装conda并初始化conda环境
下载conda安装包
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
安装miniconda
bash Miniconda3-latest-Linux-x86_64.sh
重新加载环境变量:
source ~/.bashrc
验证 conda 是否可用
conda --version
conda环境
export PATH=~/miniconda3/bin:$PATH
conda init
conda activate GPTSoVits
②开始安装其他环境
这里我选择用install.sh脚本来安装依赖
bash install.sh --device CU128 --source HF --download-uvr5
2)环境安装(手动安装)
①安装fast-whisper
conda create -n GPTSoVits python=3.10
conda activate GPTSoVits
pip install -r extra-req.txt --no-deps -i https://mirrors.aliyun.com/pypi/simple/
②安装一堆其他库
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
pip install --ignore-installed packaging --target=$CONDA_PREFIX/lib/python3.10/site-packages
③安装 FFmpeg
1)conda安装
conda install ffmpeg
2)Ubuntu/Debian Users
sudo apt install ffmpeg
sudo apt install libsox-dev
④模型下载
1)UVR5模型:
UVR5模型
huggingface:
https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/uvr5_weights
iCloud(解压后替换tools/uvr5/uvr5_weights):
https://www.icloud.com/iclouddrive/04ai9bBzJJclEFpbrbd_plmtA#uvr5_weights
2)pretrain_model预训练模型:
huggingface:
https://huggingface.co/lj1995/GPT-SoVITS/tree/main
iCloud(解压后放到GPT_SoVITS/pretrained_models下):
https://www.icloud.com/iclouddrive/0cb2YLuaLd4xBMslvMRnWcX0g#pretrained_models
3)G2PW模型(解压后放到GPT_SoVITS/text下)
iCloud:
https://www.icloud.com/iclouddrive/07cufCZWLeD0KLpL_IKPeQX3A#G2PWModel
ModelScope:
https://www.modelscope.cn/models/XXXXRT/GPT-SoVITS-Pretrained/resolve/master/G2PWModel.zip
4)ASR模型
FunASR中文模型
modelscope:
https://modelscope.cn/models/iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/files
https://modelscope.cn/models/iic/speech_fsmn_vad_zh-cn-16k-common-pytorch/files
https://modelscope.cn/models/iic/punc_ct-transformer_zh-cn-common-vocab272727-pytorch/files
iCloud(解压后models替换tools/asr/models):
https://www.icloud.com/iclouddrive/0b52_7SQWYr75kHkPoPXgpeQA#models
5)Faster Whisper Large V3
huggingface:
https://huggingface.co/Systran/faster-whisper-large-v3
iCloud(解压后放到tools/asr/models下):
https://www.icloud.com/iclouddrive/08dldSDPLUOpmUsTXsuiKQ6aw#faster-whisper-large-v3
6)FunASR粤语模型
Modelscope:
https://modelscope.cn/models/iic/speech_uniasr_asr_2pass-cantonese-chs-16k-common-vocab1468-tensorflow1-online/files
iCloud(解压后放到tools/asr/models下):
https://www.icloud.com/iclouddrive/062KFPq1wBJtKMkR-OL7gzW4w#speech_uniasr_asr_2pass-cantonese-chs-16k-common-vocab1468-tensorflow1-online
7)NLTK:
iCloud(解压后放到用户名目录下):
https://www.icloud.com/iclouddrive/079Bx3QbEosu8XIDkjim_ixPw#nltk_data
⑤下载G2PW模型解压放在text目录
Download G2PW models from G2PWModel.zip(HF)| G2PWModel.zip(ModelScope), unzip and rename to G2PWModel, and then place them in GPT_SoVITS/text.(Chinese TTS Only)
五、报错
1、annotated_types库缺失
pip install --ignore-installed annotated_types --target=$CONDA_PREFIX/lib/python3.10/site-packages -i https://mirrors.aliyun.com/pypi/simple/
2、soundfile 库缺失
pip install --ignore-installed soundfile --target=$CONDA_PREFIX/lib/python3.10/site-packages -i https://mirrors.aliyun.com/pypi/simple/
3、regex报错
pip install --force-reinstall regex!=2019.12.17 transformers -i https://mirrors.aliyun.com/pypi/simple/
4、缺库einops
pip install --ignore-installed einops --target=$CONDA_PREFIX/lib/python3.10/si
te-packages -i https://mirrors.aliyun.com/pypi/simple/
六、GPT-SoVITS转服务流程
1)创建音频
- 步骤
①读取id和上传的音频文件
②音频文件经过soundfile读取,得到音频的采样数据(音频的采样数据)和音频的采样率(如16000、32000等)
③将采样数据经过响度平衡(人话:降低爆破音等剧烈波动对听感造成的影响)
④将平衡后的音频转回字节数据
⑤使用OpenAI API进行语音转文字(whisper模型语音转文字)
⑥whisper转出来的文字默认是繁体,用OpenCC繁体转简体
⑦用 TTS 模型提取参考音频的
1)语义特征(prompt_semantic)
2)声学特征(refer_spec)
3)生成掩码(mask:为了后面只处理有效帧)
4)全局嵌入(ge:用于后续合成)
5)对文本做分段和特征提取,得到
phones_batch音素、
bert_features_batchBERT特征、
norm_text_batch规范化文本等
⑧将上述数据用pickle序列化,再用zlib压缩,保存长度设置为计算的是音频的帧数除以帧率(假设 50 帧/秒),得到音频时长
- 响度平衡解释
音频读取中采用响度平衡(Loudness Equalization)的核心作用在于统一不同音源的听觉响度体验,避免音量频繁波动对听感造成干扰,具体价值体现在以下方面:
- 备忘录
①为什么取索引为0的数据:
这些变量(如 prompt_semantic、phones_batch 等)本身是“批量”处理的结果,通常是一个列表或张量的第一个元素(即 batch size=1 时的第0个)。取 [0] 就是取出当前这条音频/文本的特征,去掉批量维度,方便后续存储和使用。
②.cpu() 表示什么意思:
.cpu() 是 PyTorch 张量的方法,作用是把张量从 GPU 显存转移到 CPU 内存。这样做是因为后续要用 pickle 序列化数据,pickle 只能处理在 CPU 上的张量,不能直接序列化 GPU 上的数据