Plachtaa / VITS-fast-fine-tuning

This repo is a pipeline of VITS finetuning for fast speaker adaptation TTS, and many-to-many voice conversion
Apache License 2.0
4.74k stars 712 forks source link

刚接触这个repo,几点心得 #416

Open shirubei opened 1 year ago

shirubei commented 1 year ago

首先要感谢作者的共享。 刚接触这个repo,花了几天(白天上班,晚上搞这个)时间,总算训练出一个大概过得去的模型了,不过就是语调的抑扬顿挫还有不太好的地方,估计是我用的语音数据太少了。下面说说踩过的坑和一点心得,供后来者参考:

1 一开始为了对应中英文混合的情况,选的是 CJE,fine tuning用的只有中文语音数据,但是训练了2天,都感觉机器音太重,完全无法达到原来的期望。后来想了一下,不行就先搞中文的,英文部分先不管,然后再看了下单独一个C模型时,它的url跟那个CJE的完全不一样,感觉可能有戏。训练50epoch后,果然,单独的C模型的效果相对于CJE的200 epoch都明显好了很多。估计是CJE模型本身就不太好。

2 用多个short audio的时候,说明里说只要是音频就可以了,其实这个有些问题,我当时录音的时候用了m4a,这种格式是不行的,结果还得手动转wav 或mp3

3 blob/main/LOCAL.md 的第10步说:If you choose to add auxiliary data, run python preprocess_v2.py --add_auxiliary_data True --languages "{PRETRAINED_MODEL}" If not, run python preprocess_v2.py --languages "{PRETRAINED_MODEL}" 这个也是有问题的, --add_auxiliary_data True 这个是一定要的,否则它这里无法在 OUTPUT_MODEL 目录下生成模型文件

4 即使训练没有结束,也可以先看看目前为止训练的效果,就是运行12步的命令,不过这之前要把config目录下的modified_finetune_speaker.json文件拷贝到其上一级目录,并改名为 finetune_speaker.json

以上,这些个认识如果有问题还请予以指正。

另外,第11步后面说查看进度可以执行 tensorboard --logdir=./OUTPUT_MODEL 我跑了这条命令后,看到网页了,但具体怎么操作不懂,请明白的朋友告知,谢谢!

5102a commented 1 year ago

我基于 CJE 底模使用了 16k 条短音频,训练了 300 epoch,最终效果和 300 条训练 200 epoch差别不大,在原文本语料上拟合效果不错,基本能还原原音频效果,但是在泛化能力上欠佳,尤其是在没有训练过的文字以及抑扬顿挫上有些奇怪,不同词组的语速过度较为生硬

shirubei commented 1 year ago

估计是数据不够

shirubei commented 1 year ago

追记: 1 对标注结果文件 short_character_anno.txt 或 long_character_anno.txt,一定要进行校对,看看系统自动判断的汉字是不是跟声音文件能对得上,以提高最后的效果 2 使用一个长语音文件,让系统自动切割成小段的语音的时候,更容易出现标注不准确的情况,需要好好地确认。

443127316 commented 1 year ago

@shirubei 大佬,请问你用了多少条中文短音频,训练了多久,效果如何呢? 我用了20条短音频,auxiliary data 为True(新增了400条辅助训练数据),目前训练到2000 epoch,效果还是不行,很重的大佐口音,而且一些音素发音不清晰

shirubei commented 1 year ago

@shirubei 大佬,请问你用了多少条中文短音频,训练了多久,效果如何呢? 我用了20条短音频,auxiliary data 为True(新增了400条辅助训练数据),目前训练到2000 epoch,效果还是不行,很重的大佐口音,而且一些音素发音不清晰

我用的是长语音然后让系统自己切割。有80分钟左右,之前还试过23分钟的。在C模型上训练整体还行,但即使是很标准的普通话,有些字发音的时候也会变成方言口音,就是上面@5102a 说的那种情况。估计是覆盖率的问题

443127316 commented 1 year ago

@shirubei 明白了,大佬,我觉得是因为这个模型的底模型有问题,还有就是自己训练集太少了

shirubei commented 1 year ago

追记2: 1 因为我用的是一个直播的人声,一个多小时的语音文件。原语音偶尔会有一小段歌声,或者说话的时候突然升高了调门,声音拉长等,基于这样的原始数据训练出来的终究还是有些不够令人满意的地方。因此我就想着把上面说的这些地方给去掉,所以就只能是自己手动去分割长语音文件了。还好chatgpt告诉我有一个叫Audacity的免费工具,用这个工具可以看到声音的波形,从而能知道哪些地方有语音,哪些地方是无声的。分割的时候就只要在你想切分的开始处点击一下,然后在结束的地方再点一下,按下ctrl+B,输入标记名,重复这个步骤,最后选导出,导出多个文件,按照默认值进行操作就可以了。这个工具真心不错。

2 最上面写的“--add_auxiliary_data True”一定要,在别的地方看到有个解释,说设置为True 在数据量较小的情况下,可以使用原有的声音数据补足新增语音文件所没有覆盖的一些声音。如果你的语音在100句以上可以不用。才发现我原来的认识是错误的。

3 上述这2步做完以后,依然是痛苦的标注校对,需要把分段后的语音,和自动标注后的文字一个一个地核对,确保标注准确。然后再开始训练。结果发现,在300epoch就感觉不错了。我是一点点地跑的,大概100--200个epoch就备份一个模型数据,一直跑到1000个epoch。用同样的一段文字来比较它最后生成的语音,感觉800epoch的时候最好。再就是有个别词,似乎是数据不足,听起来有稍微一点口音(非要说个比率的话,估计在90-95%吧)。总体上还是比较满意的,至此也就停下了不跑了。

4 上面提到的那个“别的地方”还说,可以改config下的设置文件,把batch_size调大,可以加快训练速度。我这边一直使用的值是16,试着改为64,提示显存不够(显卡是1080Ti, 11GB内存),改32也不一样的报错,只好乖乖改回16。看来这个地方很吃内存。

shirubei commented 1 year ago

为了验证效果,随机找个群友(她不知道我在做TTS语音训练的事情)帮忙测试一下,发了2段语音,一段是原声的录音,一段是TTS生成的录音,问她"能不能听出这是两个人的声音",对方回答说应该是一个人的。另外一个一起搞项目的朋友也说太像真人的声音了。

shirubei commented 1 year ago

pyinstaller 打包 #436

alannesta commented 1 year ago

@shirubei 你是本地训练的还是用的google colab? 我现在用colab感觉太慢了,50个epoch都要一个多小时 本地的话最新的mac pro m1能跑起来吗? windows的电脑我也有,游戏本, n卡,不过不知道配置够不够

shirubei commented 1 year ago

@shirubei 你是本地训练的还是用的google colab? 我现在用colab感觉太慢了,50个epoch都要一个多小时 本地的话最新的mac pro m1能跑起来吗? windows的电脑我也有,游戏本, n卡,不过不知道配置够不够

本地,Windows 11 + 1080Ti, 显存11GB。mac proc m1就不清楚了。

alannesta commented 1 year ago

@shirubei 所以不加--add_auxiliary_data True 也是可行的对吧?我大概有1000条语料,感觉可以从0开始炼(不需要使用预训练模型)

shirubei commented 1 year ago

@shirubei 所以不加--add_auxiliary_data True 也是可行的对吧?我大概有1000条语料,感觉可以从0开始炼(不需要使用预训练模型)

是的,我就没加

shirubei commented 1 year ago

追记3: 新来一个需要,要求增加一种音色。同样是拿到了一个MP3文件,大概1小时。 先转wav,然后直接放raw_audio下面。 按照原来的想法,先单独弄一个模型试试没问题,再和原有的那个音色一起训练成最新的模型。 第一步用最新的语音文件单独弄一个模型,一切顺利,而且语音标注的精度感觉很不错。跑了10个小时,走完200个epoch后试验了一下,推理的效果也不错。 接下来就是和原来的语音文件一起再训练成一个新的模型,由于原先的那个语音已经手动切好了文件,所以想着利用上一步系统自动切分完的文件,跟之前的那些都放custom_character_voice,再逐步实行。 结果发现,切分后的新的语音文件的标注精度,比上一步那个单独一个文件的标注下降了很多。 无奈,只能把最初那些我手动切分的语音文件再合并,用2个文件去建模型。还好这一步也是用audacity可以简单实现,要不然手动合并300多个文件那太浪费时间了。

shirubei commented 1 year ago

501

prometheus-alien commented 10 months ago

谢谢分享

prometheus-alien commented 10 months ago

追记: 1 对标注结果文件 short_character_anno.txt 或 long_character_anno.txt,一定要进行校对,看看系统自动判断的汉字是不是跟声音文件能对得上,以提高最后的效果 2 使用一个长语音文件,让系统自动切割成小段的语音的时候,更容易出现标注不准确的情况,需要好好地确认。 @shirubei 请教一下,校对需要用空格增加断句吗?有些句子很长。

shirubei commented 10 months ago

我没有特意去关注这个,自动切分感觉已经可以了。

shirubei commented 8 months ago

别的网友提的问题和得到的解决方案,感觉有用,还没验证,先加链接 #448

shirubei commented 8 months ago

追记: 1 对标注结果文件 short_character_anno.txt 或 long_character_anno.txt,一定要进行校对,看看系统自动判断的汉字是不是跟声音文件能对得上,以提高最后的效果 2 使用一个长语音文件,让系统自动切割成小段的语音的时候,更容易出现标注不准确的情况,需要好好地确认。 @shirubei 请教一下,校对需要用空格增加断句吗?有些句子很长。

感觉最后要弄一下