1 简介
相对于大型语言模型(LLM),语音模型相对来说比较小,可以在本地有GPU的机器上训练。我的机器是很久以前买的1080Ti,10G显存,可以正常训练。声音模拟效果也相当不错,我下载了一段10分钟长的讲故事的音频,训练这个模型只花了5分钟,我觉得模拟的音色和语调都相当不错,虽然不能完全模拟出讲故事的声音,但已经是我用过效果最好的了。
此外,作者的评估显示,使用1分钟的语音与30分钟的效果差不多。目前该项目只发布了TTS工具,变声器工具还在开发中。
2 安装 2.1 环境
建议在docker环境中安装。这样可以让它与其他工具共存,而不会破坏宿主机当前的环境。我下载的是与install.sh中指定的底层软件版本最接近的版本。基础镜像7.2G,全部安装总大小10.5G,下载的模型和源代码也在5G以内。
$ docker pull pytorch/pytorch:2.1.1-cuda12.1-cudnn8-runtime
$ nvidia-docker run --network host --rm -v /exports:/workspace/exports -it pytorch/pytorch:2.1.1-cuda12.1-cudnn8-runtime bash
Docker镜像占用7.2G空间
2.2 安装软件
安装软件的时候,如果设置了代理,可能会更快;另外为了避免重复安装,我修改了install.sh里的cuda版本,使之与docker版本一致。
$ git clone https://github.com/RVC-Boss/GPT-SoVITS
$ cd GPT-SoVITS
$ . install.sh
如果需要中文语音识别,还需要安装以下软件:
$ pip install modelscope torchaudio sentencepiece funasr
2.3 下载模型
训练和使用GPT-SoVITS都需要下载基础模型,如果需要训练模型还需要对要模仿的音频进行分割和识别,至少还要安装语音识别模型ASR。
2.3.1 下载预先训练的 GPT-SoVITS 模型
在 huggingface 下载
$ cd GPT_SoVITS/pretrained_models
$ git clone https://huggingface.co/lj1995/GPT-SoVITS
$ mv GPT-SoVITS/* .
不包括.git,模型大约1.1G
2.3.2 下载asr模型
在魔塔平台下载
$ cd tools/damo_asr/models
$ git clone https://www.modelscope.cn/iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch.git
$ git clone https://www.modelscope.cn/iic/speech_fsmn_vad_zh-cn-16k-common-pytorch.git
$ git clone https://www.modelscope.cn/iic/punc_ct-transformer_zh-cn-common-vocab272727-pytorch.git
不包括.git文件夹,大约有1.4G。
2.4 运行程序
如果需要更改端口,请在config.py中设置
$ python webui.py
此时可以在默认端口9874上看到gradio界面。
2.4.1 准备训练音频
分割音频
语音识别
编辑语音识别结果
2.4.2 训练模型
切换到第二个选项卡GPT-SOVITS-TTS,输入要创建的模型的名称。
界面分为A数据格式化、B模型训练、C语音合成三部分。
1A-数据集格式化
设置之前处理过的列表位置和音频数据目录,然后按照ABC步骤进行,或者单击下面的按钮一次执行所有步骤。
1B-微调训练
点击两个按钮即可训练模型,SoVITS训练大约需要5GB显存和5分钟,GPT训练大约需要5GB显存和3分钟。
训练过程中可能会出现共享内存错误。解决方案请参阅问题与解决方案部分。
1C-推理
点击刷新按钮后,下拉列表中会出现刚刚训练好的模型,选择模型后,打开推理WEB界面,并在9872端口开启接口。
在Inference界面需要设置一个音频文件和其对应的文本,可以使用之前切分好的wav文件,输入其对应的文本,我觉得这个是为了让GPT根据前面的文本生成后面的文本。
然后输入需要合成的文本,点击合成按钮。
如果您收到与 pyopenjtalk 相关的错误,请参阅问题和解决方案部分。
2.5 问题与解决方案
从下载到修改到训练、综合大概花了半天时间,安装过程中遇到了一些错误,工具链还有改进的空间。
2.5.1 问题1:pyopenjtalk版本问题
理论上来说,运行install.sh脚本就可以直接安装需要的软件,可能是因为requirements.txt文件中没有指定软件版本号,导致我在安装pyopenjtalk时遇到了错误,似乎是编译工具的问题导致的,解决办法如下:
$ apt-get update
$ apt-get install build-essential
这是一个日语合成库,我们一般用不到,如果实在不想用,可以加个try或者注释掉text/japanese.py里包含pyopenjtalk的部分。
2.5.2 问题2:markupsafe 版本问题
importError: cannot import name 'soft_unicode' from 'markupsafe'
降级两个软件版本后,即可正常运行。
$ pip install werkzeug==2.0.1
$ pip install markupsafe==1.1.1
2.5.3 问题三:Modelscope无法识别funasr
当我使用语音识别asr功能时,出现错误信息“funasr-pipeline is not in the pipelines...” 解决办法是从源代码安装modelscope(使用pip安装相同版本会给出错误信息说找不到funasr),同时还需要匹配modelscope和funasr的版本 请在modelscopt中搜索funasr来确定它的版本。
$ git clone -b funasr1.0 --single-branch https://github.com/alibaba-damo-academy/FunASR.git
$ cd FunASR
$ pip install -e ./
$ git clone https://github.com/modelscope/modelscope.git
$ pip install -e ./
修改完之后又出现了“TypeError: AutoModel.generate() missing 1 required positional arc: 'input'”的错误,我想可能是版本问题,于是修改了源码:
vi tools/damo_asr/cmd-asr.py
修改:
26 text = inference_pipeline(input="%s/%s"%(dir,name))[0]["text"]
27 #text = inference_pipeline(audio_in="%s/%s"%(dir,name))["text"] # xieyan test
2.5.4 问题四:共享内存错误
错误信息如下:
RuntimeError: DataLoader worker (pid 14958) 被信号杀死:总线错误。可能是因为 dataloader 的 worker 共享内存不足。请尝试提高共享内存限制。
解决办法是修改GPT_SoVITS/s2_train.py
在第 112 行左右,将 DataLoader 的 num_workers 从 6 更改为 1
110 train_loader = DataLoader(
111 train_dataset,
112 #num_workers=6,
113 num_workers=1,
3 代码分析
代码主要用Python编写文本语音合成软件,约13000行,包括:
4 原则
GPT_SoVITS 是一个由三部分组成的模型:这里的 GPT 不是指常见的大语言模型 GPT,而是它的字面意思——Generative Pre-training Transformer,通常是指从上一个上下文生成下一个上下文的生成模型,这也可以从上面的操作中看出,在推理过程中,以“音频”作为引子,合成新的音频。
SoVITS是2023年非常流行的歌声转换器文本语音合成软件,主要建立在SoftVC和VITS两个音频模型之上,其名字也是两者的结合,后面的文章会介绍这两个模型相关的论文。
5. 收益
本项目实现了定制化的语音合成,并在训练过程中具体应用了语音识别、人声与背景音分离、微调模型、声音转换等技术,可以说是一个优秀的语音模型入门。
6 参考文献
作者视频: