1.什么是TTS
TTS(Text-To-Speech)这是一种文字转语音的语音合成。类似的还有SVC(歌声转换)、SVS(歌声合成)等。
2.配置要求
GPT-SoVITS对电脑配置有较高的要求。
训练:对于Windows电脑:
- 支持CUDA的nVIDIA显卡,每张拥有至少6G以上显存。
- 常见的不能使用的显卡:10系以前的所有卡、1060以下,1660以下,2060以下、3050 4G
- Windows10/11 系统
- 如果没显卡会自动识别使用CPU训练,但速度非常缓慢。
推理:对于Windows电脑:
- 支持CUDA的nVIDIA显卡,每张拥有至少4G以上显存。
- Windows 10/11 系统
- 没显卡会自动识别使用CPU推理
基础知识
1.常见的英文
1.error。这个单词会在所有报错的时候出现。它一般前面会有一个定语来修饰这个报错,后面跟着报错原因。例如:OutOfMemoryError: CUDA out of memory。前面的OutOfMemory说明是内存不足的报错,后面的CUDA out of memory说明是显存不足。
2.CUDA。这是N卡的统一计算架构,所有在N卡进行的Ai计算都需要它。安装了显卡驱动的话都会安装上CUDA,推荐使用11.8版本的CUDA。
3.GPU。 GPU是图形处理器,显卡是GPU但GPU不一定是显卡。台式机的显卡是很大的一个硬件。笔记本只有游戏本才有显卡。其他的GPU都是核显!核显不是显卡!
4.module。模块。模块就是一个脚本,缺少某个脚本,对应的程序就无法运行。可能会遇到No module的报错,这种情况只需安装对应的模块就好了。 例如:ModuleNotFoundError: No module named ‘jieba_fast' , 这里没有jieba_fast这个模块,那么只要python -m pip install jieba_fast装上这个模块即可。
5.WebUI。 web是网络的意思,ui是使用界面的意思,合在一起就是一个网页,一个以网页呈现的操作界面。网页是用来控制操作程序的,真正的运行程序是你点开的那个go-webui.bat的程序。
6.weights。weights:模型权重。也就是模型,GPT_weights就是GPT模型,SOVITS_weights就是SoVITS模型。weight指的是神经网络中的参数,这些参数被存储在称为“权重”的数组中,所以weights叫做模型权重。
7.output。 output:输出。程序输出的文件一般都会在output文件夹,有时候output会缩写成opt,例如uvr5_opt就代表这个文件夹是uvr5输出的文件的存放位置。
8.found。found:找到。一般出现在路径不对的报错中,not found是没有找到的意思。如果路径中没有某个需要的文件的时候就会报错NotFound:xxx。也有可能是没有找到某个模块,模块就是Moudle,ModuleNotFoundError。
9.pretrained。预先训练的,常见的有pretrained_models这个文件夹里放的是底膜,并不是微调后的最终模型。找模型的时候别找错了。
2.什么是显存
显存是显卡的专用内存,ctrl+shift+esc打开任务管理器看,专用GPU内存就是显存,其他的内存都是共享的,并不是真正的显存。
3.什么是数据集
数据集是指一组数据样本,包括音频,文本等数据。数据集的质量指的是音频的质量和标注的正确率,数据集的大小指的是音频的长度。
4.什么是音频质量
1.响度: 响度就是俗称的音量,常见的计数方式是dB,也就是分贝。生活中常见的分贝都为正数,例如60分贝是正常说话的声音。但dB作为一个对数单位是不能直接拿来描述一个物理量的大小或多少的。 在描述音频的音量时一般使用电平这个词,音频电平就是输入信号的电压大小,和人耳听见的分贝数是不同的。一般来说正常说话的电平要保持在-9dB~6dB这个区间。推荐在训练前用软件做下响度统一。因为db是一个对数单位,相差3dB那么就意味着相差10的0.3次方倍,大约2倍,如果相差10db就是10倍。所以不要觉得大了几dB差距不大没关系。如果在正常电平下你觉得听起来声音小,那么是你的音响问题,请调整你的音响,不要乱动电平。
这是同样一段音频不同响度在AU中的样子
2.混响
混响是后期反射声,可以简单的理解为回声。你可能觉得正常录的声音能有什么回声,但实际上无论什么情况都会有混响,只是有大小和多少的区分罢了。最基础的看混响的方法是看频谱图,很明显第一张图就显得干净不拖沓。第二张图就是混响严重的。有混响的话就要用UVTR5去混响。
3.音质
这里的音质是对音频准确性、保真度或清晰度的评估。一般情况下采样率,位深和码率都不会太低的。现在的麦克风都是44.1k,16bit以上了。但清晰度就不好说了,如果要自己录音的话最好买个单独的麦克风。再贵的耳机麦克风都不如一个独立麦克风。当然清晰度也可以通过频谱图看出一点点。图一是音质好的,图二是音质差的。至于采样率,位深和码率不用太高,会进行重采样的。
整合包教程
在开始之前
为了避免在之后的使用中出现各种意料之外的问题,请务必对照下面的 Checklist 检查本机环境。
- 关闭全局梯子/绕过局域网
- 使用推荐的浏览器(Chrome/Edge/Firefox)
- 关闭浏览器自带的网页翻译功能
- 关闭所有第三方杀毒软件/安全卫士等
- 如果内存吃紧,将系统虚拟内存设置为自动
- 建议关闭共享内存
- win11关闭GPU加速,貌似有占用不满的bug
1.下载
这里请自行找下载资源,这里不再提供。
2.解压并打开
请使用7-zip解压!其他解压工具可能会吞文件。解压后打开文件来到根目录,双击go-webui.bat打开,不要以管理员身份运行!
这就是正常打开了,稍后等待就会弹出网页。如果没有弹出网页可以复制http://0.0.0.0:9874到浏览器打开。
这是网页端
在开始使用前提醒一下:打开的bat不可以关闭!这个黑色的bat框就是控制台,所有的日志都会在这上面呈现,所有的信息以控制台为准。所有的报错都在控制台上!
3.数据集处理
请认真准备数据集!以免出现各种报错,和炼出不理想的模型!好的数据集是炼出好的模型的基础!
使用UVR5处理原音频(如果原音频足够干净可以跳过这步,比如游戏里提取的干声)
方法1:用自带的UVR5处理音频
点击开启UVR5-WebUI稍加等待就会自动弹出下图的网页,如果没有弹出复制http://0.0.0.0:9873到浏览器打开
首先输入音频文件夹路径或直接选择文件(2选1),文件夹上面那个地址框就是文件夹路径。
如果要复制文件路径就是这样:
先用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)的是混响。(voval)(_vocal_main_vocal)才是要用的文件,其他都可以删除。结束后记得到WebUI关闭UVR5节省内存。
例如:
这里有两端素材,点击一下目录,就是路径名了,将其复制。
粘贴到输入路径里,下拉选择model_bs_roformer_ep_317_sdr_12.9755模型,然后点击转换,稍等片刻后输出信息就会显示xxxx-> Success
在状态栏点击黑窗口可以打开bat控制台,在这里可以查看进度。
然后打开GPT-SoVITS整合包文件夹的output文件夹,打开uvr5_opt文件夹。
这里会有输入文件数两倍的文件,其中instrumental文件是不需要的,都必须删掉,否则会影响最终效果。再新建一个文件夹把这两个文件移过去。
然后输入路径改成上面那个新的文件夹,下拉选择onnx_dereverb_By_FoxJoy模型,点击转换。然后要等待比较长一段时间。同样可以再bat控制台看进度,如果等待的时间太长可以跳过这个模型。输入的文件还是在uvr5_opt文件夹,其中others是不需要的,删掉。上一步的vocal也不需要了可以删掉。再新建 一个文件夹把_vocal_main_vocal这两个文件移过去
然后输入路径改成上面那个新建文件夹,下拉选择VR-DeEchoAggressive模型(如果混响很重选DeReverb,比较轻选Normal,中间选Aggressive),点击转换。稍微等待一段时间,再打开uvr5_opt文件夹,把instrument开头的删掉就好了。
如果没有成功输出,那么推荐使用UVR5客户端。
方法2:使用UVR5客户端(没有bug,模型更多)
这个之后深入学习时再使用。
切割音频
在切割音频前建议把所有音频拖进音频软件(如au、剪映)调整音量,最大音量调整至-9dB到-6dB,过高的删除。
首先输入原音频的文件夹路径(不要有中文),如果刚刚经过了UVR5处理那么就是uvr5_opt这个文件夹。然后建议可以调整的参数有min_length、min_interval 和 max_sil_kept 单位都是ms。
min_length根据显存大小调整,显存越小调越小。 min_interval根据音频的平均间隔调整,如果音频太密集可以适当调低。 max_sil_kept会影响句子的连贯性,不同音频不同调整,不会调的话保持默认。其他参数不建议调整。点击开启语音分割,马上就分割好了。默认输出路径在output/slicer_opt。当然也可以使用其他切分工具切分。
切分完后文件在output\slicer_opt。打开切分文件夹,排序方式选大小,将时长超过显存数秒的音频手动切分至显存数秒以下。比如显卡是4090显存是24g,那么就要将超过24秒的音频手动切分至24s以下,音频时长太长的会爆显存。如果语音切割后还是一个文件,那是引文音频太密集了。可以调低min_interval,从300调到100基本能解决这问题。实在不行用au手动切分。
3.3音频降噪(如果原音频足够干净可以跳过这步,比如游戏中提取的干声)
如果你觉得音频足够清晰可以跳过这步,降噪对音质的破坏挺大的,谨慎使用。输入刚才切割玩的音频的文件夹,默认是output/slicer_opt文件夹。然后点击开启语音降噪。默认输出路径在output/denoise_opt。
3.4打标
为什么要打标:打标就是给每个音频配上文字,这样才能让AI学习到每个字该怎么读。这里的标指的是标注。
如果你上一步切分了或者降噪了,那么已经自动帮你填充好路径了。然后选择达摩ASR或者fast whisper。达摩ASR只能用于识别汉语和粤语,效果也最好。 fast whisper可以标注99种语言,是目前最好的英语和日语识别,模型尺寸选large V3,语种选auto自动。whisper 可以选择精度,建议选float 16,float 16比float32块,int8速度几乎和float16一样。然后点开启离线批量ASR就好了,默认输出是output/asr_opt这个路径。ASR需要一些时间,看看控制台有没有报错就好了。
如果有字幕的可以用字幕标注,准确多了。内嵌字幕或者外挂字母都可以。这个以后的学习中会进行讲解。
3.5校对标注(这步比较费时间,如果不追求极致效果可以跳过)
上一步打标会自动填写list路径,你只需要点击开启打标webui,打开后就是SubFix,从左往右从上到下依次意思是:跳转页码、保存修改、合并音频、删除音频、上一页、下一页、分割音频、保存文件、反向选择。每一页修改完都要点以下保存修改(Submit Text),如果没保存就翻页那么会重置文本,在完成退出前要点保存文件(Save File),做任何其他操作前最好先点一下保存修改(Submit Text)。合并音频和分割音频不建议使用,精度非常差。删除音频先要点击要删除的音频右边的yes,再点删除音频(Delete Audio)。删除完成后文件夹中的音频不会删除但标注已经删除了,不会加入训练集的。
4.训练
1.输出logs
来到第二个页面
先设置实验名也就是模型名,理论上可以是中文!打标结束后会自动填写路径,只要点下一键三连就可以了。
如果是英文,日语,粤语或韩语的话logs里的3-bert文件夹是空的,是正常的不用管。
2.微调训练
首先设置batch_size,sovits训练建议batch_size设置为显存的一半以下,高了会爆显存。bs并不是越高越快! batch_size也需要根据数据集大小调整,也并不是严格按照显存数一半来设置,比如6g显存需要设置为1。如果爆显存就调低。 当显卡3D占用100%的时候就是bs太高了,使用到了共享显存,速度会慢好几倍。
以下是切片长度为10s时实测的不同显存的sovits训练最大batch_size,可以对照这个设置。如果切片更长、数据集更大的话要适当减少。
在0213版本之后添加了dpo训练。dpo大幅提升了模型的效果,几乎不会吞字和复读,能够推理的字数也翻了几倍。但同时训练时显存占用多了2倍多,训练速度慢了4倍,12g以下显卡无法训练。 数据集质量要求也高了很多,如果数据集有杂音,有混响,音质差,不校对标注,那么会有负面效果。
如果你的显卡大于12g,且数据集质量较好,且愿意等待漫长的训练时间,那么可以开启dpo训练。否则请不要开启,下面是切片长度为10s时实测的不同显存的gpt训练最大batch_size。如果切片更长、数据集更大的话要适当减少。
接着设置轮数,相比V1,V2对训练集的还原更好,但也更容易学习到训练集中的负面内容。所以如果你的素材中有底噪、混响、喷麦、响度不统一、电流声、口水音、口齿不清、音质差等情况那么请不要调高SoVITS模型轮数,否则会有负面效果。GPT模型数一半情况下不高于20,建议设置10.然后先点开启SoVITS训练,训练完成后再点开GPT训练,不可以一起训练(除非你有两张卡)!如果中途中断了,直接再点开始训练就好了,会从最近的保存点开始训练。
训练的时候请ctrl+shift+esc打开任务管理器看,下拉打开选项,选择cuda。如果cuda占用为0那么就不在训练。专用GPU内存就是显存,其他的内存都是共享的,并不是真正的显存。爆显存就调低bs。或者存在过长的音频,需要重新制作数据集。
win11没有cuda打开设置--系统--显示--显示卡--默认图形设置, 关闭硬件加速GPU计划,并重启电脑。
训练完成后会显示训练完成,并且控制台显示的轮数停在设置的(总轮数-1)的轮数上。
看cuda占用需要下拉选择cuda,如果win11找不到cuda界面需要关闭硬件加速GPU计划并重启
关于学习率权重:
可以调低但不建议调高。
关于高训练轮数:
你可能会看见有人说训练了几百轮,几千轮的。但高轮数并不就是好。如果要训练高轮数请先保证数据集质量极好,标记全都经过手动校对,时长至少超过1小时才有必要拉高轮数。否则默认的十几轮效果已经很好了。
关于数据集长度:
请先保证质量!音频千万不能有杂音,要口齿清晰,响度统一,没有混响,每句话尽量完整,全部手动校对标注。30分钟内有明显提升,不建议再增加数据集长度。
情感分类
如果有超过1小时的数据集的话,可以先用Emotion2Vec或ColorSplitter情感分类后再训练。会获得更稳定更丰富的情感,不过标注一定要手动校对。
5.推理
开启推理界面
先点一下刷新模型,下拉选择模型推理,e代表轮数,s代表步数。不是轮数越高越好。选择好模型点开启TTS推理,自动弹出推理界面。如果没有弹出,复制http://0.0.0.0:9872到浏览器打开。
请严格区分轮数(Epoch)和步数(Step):1个Epoch代表训练集中的所有样本都参与了一次学习,1 Step代表进行了一次学习,由于batch size的存在,没步学习可以含有数条样本,因此,Epoch 和 Step 的换算如下:
开始推理
最上面可以切换模型,在刚练完挑模型的时候很重要
然后上传一段参考音频,建议是数据集中的音频。最好5秒。参考音频很重要!会学习语速和语气,请认真选择。参考音频的文本是参考音频说什么就填什么,语种也要对应。 在0217版本之后可以选择无参考文本模式,但非常不建议使用。
右上角有个融合音色的可选项,先将要融合的音频放在一个文件夹中然后一起拖进去(没有什么实用性的功能)
接着就是输入要合成的文本了,注意语种要对应。目前可以中英混合,日英混合和中日混合。切分建议选择四句一切,低于四句的不会切。如果凑四句一切报错就是显存太小可以按句号切。如果不切,显存越大能合成的越多。合成的过长很容易胡言乱语。
0213版本加入了top_p,top_k和temperature,保持默认就可以。这些控制的都是随机性,拉大数值,随机性会变大,建议使用默认。
关于top_p,top_k和temperature
这三个值都是用来控制采样的。在推理的时候要挑出一个最好的token,但机器并不知道哪个是最好的。于是先按照top_k挑出前几个token,top_p在top_k的基础上筛选token。最后temperature控制随机性输出。
比如总共有100个token,top_k设置5,top_p设置0.6,temperature设置为0.5。那么就会从100个token中先挑出5个概率最大的token,这五个token的概率分别是(0.3,0.3,0.2,0.2,0.1),那么再挑出累加概率不超过0.6的token(0.3和0.3),再从这两个token中随机挑出一个token输出,其中前一个token被挑选到的几率更大。以此类推。
关于重复惩罚
=1 不惩罚重复, >1时开始惩罚重复, <1时鼓励重复。 一般都设置为 >1。
如果出现吞字,重复,参考音频混入的情况,这是正常现象。改善的方法有使用较低轮数的GPT模型、合成文本再短点、换参考音频。如果一直复读估计是标注不准确的问题,手动校对后重炼即可。
6.分享模型
分享需要的模型都在SoVITS_weights_v2和GPT_weights_v2这两个文件夹。选择合适轮数的模型,记得带上参考音频一起打包成压缩文件,就可以分享了。别人只要将GPT模型(ckpt后缀)放入GPT_weights_v2文件夹,SoVITS模型(pth后缀)放入SoVITS_weights_v2文件夹就可以推理了。
7.使用别人分享的模型
将GPT模型(ckpt后缀)放入GPT_weights_v2文件夹。SoVITS模型(pth后缀)放入SoVITS_weights_v2文件夹,刷新下模型就能选择模型推理了。
8.训练第二个模型
记得把之前切片文件夹里的音频和asr文件夹里的标注文件移走,否则会一起加入训练集。训练的时候记得更换模型名!其他步骤都一样。模型还在GPT_weights_v2文件夹和SoVITS_weights_v2文件夹。