GitHub:Plachtaa/VITS-fast-fine-tuning

一、介绍:

这个代码库会指导你如何将自定义角色(甚至你自己),加入预训练的VITS模型中,在1小时内的微调使模型具备如下功能:

  1. 在 模型所包含的任意两个角色之间进行声线转换
  2. 以 你加入的角色声线 进行中日英三语 文本到语音合成。

本项目使用的底模涵盖常见二次元男/女配音声线(来自原神数据集)以及现实世界常见男/女声线(来自VCTK数据集),支持中日英三语,保证能够在微调时快速适应新的声线。

二、使用教程

项目支持

  • 从 10条以上的短音频 克隆角色声音
  • 从 3分钟以上的长音频(单个音频只能包含单说话人) 克隆角色声音
  • 从 3分钟以上的视频(单个视频只能包含单说话人) 克隆角色声音
  • 通过输入 bilibili视频链接(单个视频只能包含单说话人) 克隆角色声音

声线转换

  • 任意角色(只要你有角色的声音样本) (注意:声线转换只能在任意两个存在于模型中的说话人之间进行)

三、配置环境

conda create -n vits python=3.8
conda activate vits
conda install -y -c anaconda cmake
conda install -y -c msys2 msys2-conda-epoch
conda install -y -c msys2 m2w64-gcc
pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117
pip install imageio==2.4.1
pip install moviepy
pip install --upgrade youtube-dl
pip install pillow
pip install -r requirements.txt

四、模型下载

官方提供了一些预训练模型支持的语言范围。具体的差异如下:

  1. CJE: Trilingual (Chinese, Japanese, English)
    • 这个模型是三语言的,意味着它在中文、日文和英文上都进行了训练。
    • 可能在涵盖这三种语言的任何文本上都表现得相对较好。
    • 对于那些需要处理或识别这三种语言中的任何一种的任务,这可能是一个好的选择。
  2. CJ: Dualigual (Chinese, Japanese)
    • 这个模型是双语的,只在中文和日文上进行了训练。
    • 可能在涵盖中文和日文的文本上表现得相对较好,但对英文可能不那么有效。
    • 对于只需要处理中文和日文的任务,这可能是一个更专注的选择。
  3. C: Chinese only
    • 这个模型只在中文上进行了训练。
    • 在处理中文文本上可能表现得非常好,但对日文和英文可能不那么有效。
    • 对于只涉及中文的任务,这是一个高度专注的选择。

选择哪一个模型取决于您的具体需求。例如,如果您的应用只涉及中文,那么选择“Chinese only”可能是最佳选择,因为模型可能更加专注和精确。但如果您的应用需要处理三种语言的文本,那么选择“Trilingual”模型可能更有意义。

官方下载

To download CJE model, run the following:

wget https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/pretrained_models/D_trilingual.pth -O ./pretrained_models/D_0.pth
wget https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/pretrained_models/G_trilingual.pth -O ./pretrained_models/G_0.pth
wget https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/configs/uma_trilingual.json -O ./configs/finetune_speaker.json

To download CJ model, run the following:

wget https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/D_0-p.pth -O ./pretrained_models/D_0.pth
wget https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/G_0-p.pth -O ./pretrained_models/G_0.pth
wget https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/config.json -O ./configs/finetune_speaker.json

To download CJ model, run the following:

wget https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/D_0.pth -O ./pretrained_models/D_0.pth
wget https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/G_0.pth -O ./pretrained_models/G_0.pth
wget https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/config.json -O ./configs/finetune_speaker.jso

网盘下载

关于此项目的模型,本站已为您下载并整理好。如果你不方便通过官网下载,可以使用本站所提供的网盘下载地址。

模型名称模型描述下载地址
C仅支持中文点击下载
CJ支持中文+日语点击下载
CJE支持中文+日语+英文点击下载

本站已为您修改好名称,所以你下载后,不用修改文件名字。

不用全部都下载,仅下载CCJCJE其中一个即可,假如你下载的是CJE,那么你将会得到三个文件,分别是D_0.pthG_0.pthfinetune_speaker.jso,将D_0.pthG_0.pth这两个文件移动至项目根目录下的pretrained_models文件夹内,然后将finetune_speaker.jso文件移动至项目根目录的configs文件夹内,模型安装完成。

if not exist %USERPROFILE%\.cache\whisper mkdir %USERPROFILE%\.cache\whisper

执行完上面的代码之后,我们可以通过在CMD执行下面的代码自动打开模型目录

start %USERPROFILE%\.cache\whisper

将我们下载完成的模型文件解压缩,然后将解压后的文件移动damo文件夹下即可。

音频准备

以下简单点来说,准备至少20个时间小于10秒大于2秒音频,格式可以是wav或者mp3,然后将这些文件放在一个文件夹内,把这个文件夹压缩一下,就可以了。

比如站长用了一些自己之前的音频素材,共计26个,简单裁切了一下,每个都在10秒以内,然后压缩成ZIP格式,结构如下。

Drug.zip
├───Drug
├ ├───Aydio_1.wav
├ ├───Aydio_2.wav
├ ├───Aydio_3.wav
├ ├───...
├ ├───Aydio_25.mp3
├ └───Aydio_26.wav

最后,将这个ZIP文件夹压缩包移动至项目根目录的monotonic_align文件夹下即可。

—————————————————————————————————————————————————

以下是官方所提供的帮助描述,可选择性参阅。

这个项目支持多种语音上传选项,您可以根据您拥有的数据选择一个或多个选项。

  • 短音频可以打包成单个.zip文件,文件结构如下所示:
  • Your-zip-file.zip
  • ├───Character_name_1
  • ├ ├───xxx.wav
  • ├ ├───…
  • ├ ├───yyy.mp3
  • ├ └───zzz.wav
  • ├───Character_name_2
  • ├ ├───xxx.wav
  • ├ ├───…
  • ├ ├───yyy.mp3
  • ├ └───zzz.wav
  • ├───…
  • └───Character_name_n
  • ├───xxx.wav
  • ├───…
  • ├───yyy.mp3
  • └───zzz.wav
  • 请注意,音频文件的格式并不重要,只要它们是音频文件即可。质量要求:>=2秒,<=10秒,尽量少包含背景声音。数量要求:每个角色至少10个音频,建议每个角色有20个以上。
  • 长音频文件以角色名命名,只应包含单个角色的声音。可以接受背景声音,因为它们将会被自动删除。文件名格式为{CharacterName}_{random_number}.wav (例如 Diana_234135.wav,MinatoAqua_234252.wav),必须是 .wav 文件。
  • 长视频文件以角色名命名,只应包含单个角色的声音。可以接受背景声音,因为它们将会被自动删除。文件名格式为{CharacterName}_{random_number}.mp4 (例如 Taffy_332452.mp4,Dingzhen_957315.mp4),必须是 .mp4 文件。 注意:CharacterName 必须仅使用英文字母,random_number 是用来识别一个角色的多个文件的,这是必须添加的。它可以是 0~999999 之间的随机整数。
  • 一个.txt文件包含多行{CharacterName}|{video_url},格式应如下所示:Char1|https://xyz.com/video1/ Char2|https://xyz.com/video2/ Char2|https://xyz.com/video3/ Char3|https://xyz.com/video4/

一个视频应只包含单个说话者。目前支持从 bilibili 获取视频链接,其他网站尚未经过测试。

音频放置

以下内容,根据自身情况选择,如果你和站长一样,素材都是短音频,那么只看第一个即可;如果你是长音频看第二个;如果你的素材是视频文件则看第三个。

将我们刚刚准备好的ZIP格式压缩文件,移动到目录./custom_character_voice/下;

短音频

如果你是Windows系统,执行如下代码,对其进行解压。

powershell -command "Expand-Archive -Path './custom_character_voice/你的压缩包文件名称.zip' -DestinationPath './custom_character_voice/'"

如果你是Linux系统,执行如下代码,对其进行解压。

unzip ./custom_character_voice/你的压缩包文件名称.zip -d ./custom_character_voice/

此时你的custom_character_voice文件夹内,将会出现已解压完成的音频文件。

长音频

如果你是Windows系统,执行如下代码,对其进行解压。

powershell -command "Expand-Archive -Path './custom_character_voice/你的压缩包文件名称.zip' -DestinationPath './raw_audio/'"

如果你是Linux系统,执行如下代码,对其进行解压。

unzip ./custom_character_voice/custom_character_voice.zip -d ./raw_audio/

此时你的raw_audio文件夹内,将会出现已解压完成的音频文件。

视频

如果你是Windows系统,执行如下代码,对其进行解压。

powershell -command "Expand-Archive -Path './custom_character_voice/你的压缩包文件名称.zip' -DestinationPath './video_data/'"

如果你是Linux系统,执行如下代码,对其进行解压。

unzip ./custom_character_voice/custom_character_voice.zip -d ./video_data/

此时你的video_data文件夹内,将会出现已解压完成的音频文件。

音频处理

视频转音频【可选】

如果你的训练素材是视频,那么执行如下代码,这将会自动把你的视频格式素材转换为音频;如果不是视频格式,可以跳过此步骤。

python scripts/video2audio.py

自动降噪【可选】

如果你的训练素材包含杂音等问题,那么执行如下代码,这将会自动对你的音频开启降燥并输出保存;如果你的训练素材本身就比较干净,可以跳过此步骤。

python scripts/denoise_audio.py

音频标注【必须】

如果你的训练素材是短音频,那么执行如下代码,这将会自动对你的音频进行文本识别。值得注意的是,这是短音频,而且你需要修改其中预训练模型的内容。比如站长使用仅支持中文的模型,那么就更改为C--languages "{预训练模型}"更改后的格式为--languages "C"

python scripts/short_audio_transcribe.py --languages "{PRETRAINED_MODEL}" --whisper_size large

如果你的训练素材是长音频,那么执行如下代码,这将会自动对你的音频进行文本识别。值得注意的是,这是长音频,同样需要你修改其中预训练模型的内容。

python scripts/long_audio_transcribe.py --languages "{预训练模型}" --whisper_size large

执行以上其中任何一行代码之后,稍等片刻,你将会看到如下内容。

D:\dataddd\VITS-fast-fine-tuning\ENV\lib\site-packages\whisper\timing.py:58: NumbaDeprecationWarning: The ‘nopython’ keyword argument was not supplied to the ‘numba.jit’ decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.

D:\dataddd\VITS-fast-fine-tuning\ENV\lib\site-packages\whisper\timing.py:58: NumbaDeprecationWarning: The 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. The implicit default value for this argument is currently False, but it will be changed to True in Numba 0.59.0. See https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit for details.
  def backtrace(trace: np.ndarray):
100%|█████████████████████████████████████| 2.87G/2.87G [14:17<00:00, 3.60MiB/s]
Detected language: zh
这里是通过音频01识别出来的文本内容
Processed: 1/26
Detected language: zh
这里是通过音频02识别出来的文本内容
Processed: 2/26
...省略中间内容...
Processed: 24/26
Detected language: zh
这里是通过音频25识别出来的文本内容
Processed: 25/26

Detected language: zh

这里是通过音频25识别出来的文本内容

Processed: 25/26

执行完成后,你将会在项目根目录下看到一个名称为short_character_anno.txt的文本文件,文件内容就是通过音频识别之后的文本。

./custom_character_voice/Drug/processed_0.wav|Drug|[ZH]这里是通过音频01识别出来的文本内容[ZH]
./custom_character_voice/Drug/processed_1.wav|Drug|[ZH]这里是通过音频02识别出来的文本内容[ZH]

...省略中间内容...

./custom_character_voice/Drug/processed_2.wav|Drug|[ZH]这里是通过音频24识别出来的文本内容[ZH]
./custom_character_voice/Drug/processed_3.wav|Drug|[ZH]这里是通过音频25识别出来的文本内容[ZH]

如果识别的结果并不准确,个别音频文字识别错误,可以直接手动修改,然后记得保存。

重新采样【必须】

执行如下命令,将会自动对音频素材重新采样,这可以保持所有音频采样率一致,无论如何,一定要执行这一步。

python scripts/resample.py

辅助模型

关于是否使用辅助模型,这个需要根据自身情况进行选择。

  • 使用辅助模型
    • 你的音频训练素材少于100条,或大部分音频素材质量较差,建议使用辅助模型。
  • 无需辅助模型
    • 你的音频训练素材样本量大于100条,希望训练速度可以更快,或者只有二次元角色,那么则无需辅助模型。

辅助模型

如果你希望训练时添加辅助模型,那么执行如下这一行。

python preprocess_v2.py --add_auxiliary_data <strong>True</strong> --languages "你的基础模型名称"

比如本站使用仅支持中文的模型,所以在里面填写为“C”,那么完整的命令应该如下所示。

python preprocess_v2.py --add_auxiliary_data <strong>True</strong> --languages "C"

如果你的基础模型为支持三语,那么就填写为CJE,不要删除双引号。

无需辅助模型

如果你不需要添加辅助模型,那么修改其中模型名称即可。

python preprocess_v2.py --languages "模型基础模型名称"

模型训练

这部分基本不需要进行什么调整,只需要在下方填写你的最大步数,然后执行即可。

站长看官方推荐差不多在100步左右,但站长使用填写了300步,也没有过拟合的现象出现,具体多少,大家可以自己调整,但建议不少于100步。

python finetune_speaker_v2.py -m ./OUTPUT_MODEL --max_epochs "训练时的最大步数" --drop_speaker_embed True

比如站长的300步,那么就更改上面的命令行为如下内容去执行。

python finetune_speaker_v2.py -m ./OUTPUT_MODEL --max_epochs "300" --drop_speaker_embed <strong>True</strong>

执行如上代码过后,你将会看到如下内容,这代表训练已经开始了。

INFO:OUTPUT_MODEL:====> Epoch: 290
  0%|                                                                                           | 0/28 [00:00<?, ?it/s]max value is  tensor(1.0018)
max value is  tensor(1.0166)
max value is  tensor(1.0118)
max value is  tensor(1.0069)
max value is  tensor(1.0177)
max value is  tensor(1.0063)
max value is  tensor(1.0029)
max value is  tensor(1.0142)
max value is  tensor(1.0136)
max value is  tensor(1.0152)
INFO:OUTPUT_MODEL:Train Epoch: 291 [0%]
INFO:OUTPUT_MODEL:[2.482151508331299, 2.197756290435791, 7.816839218139648, 13.189225196838379, 0.7478007078170776, 1.5003254413604736, 8120, 0.00019287939568115225]
  4%|██▉                                                                                | 1/28 [00:07<03:17,  7.32s/it]max value is  tensor(1.0018)
max value is  tensor(1.0069)
min value is  tensor(-1.0064)
  7%|█████▉                                                                             | 2/28 [00:08<01:29,  3.45s/it]max value is  tensor(1.0095)
 11%|████████▉                                                                          | 3/28 [00:08<00:55,  2.22s/it]max value is  tensor(1.0136)
max value is  tensor(1.0045)
max value is  tensor(1.0240)
 14%|███████████▊                                                                       | 4/28 [00:09<00:39,  1.64s/it]max value is  tensor(1.0305)
max value is  tensor(1.0348)
max value is  tensor(1.0169)
 18%|██████████████▊                                                                    | 5/28 [00:10<00:30,  1.34s/it]max value is  tensor(1.0013)
max value is  tensor(1.0004)
max value is  tensor(1.0110)
max value is  tensor(1.0052)
 21%|█████████████████▊                                                                 | 6/28 [00:11<00:25,  1.14s/it]max value is  tensor(1.0018)
max value is  tensor(1.0069)
?
?
?
 25%|████████████████████▊                                                              | 7/28 [00:11<00:21,  1.01s/it]max value is  tensor(1.0096)
max value is  tensor(1.0038)
 29%|███████████████████████▋                                                           | 8/28 [00:12<00:18,  1.06it/s]max value is  tensor(1.0107)
max value is  tensor(1.0158)
 32%|██████████████████████████▋                                                        | 9/28 [00:13<00:16,  1.13it/s]max value is  tensor(1.0118)
 36%|█████████████████████████████▎                                                    | 10/28 [00:14<00:15,  1.18it/s]max value is  tensor(1.0091)
max value is  tensor(1.0118)
max value is  tensor(1.0077)
max value is  tensor(1.0044)
INFO:OUTPUT_MODEL:Train Epoch: 291 [36%]

当Epoch达到300时,就代表你已经训练好啦。

模型训练完成之后,你可以在项目根目录下.\VITS-fast-fine-tuning\OUTPUT_MODEL文件夹内看到训练完成的模型。

D:\dataddd\VITS-fast-fine-tuning\OUTPUT_MODEL
└─D_8100.pth
└─D_8200.pth
└─D_8300.pth
└─D_8400.pth
└─D_latest.pth
└─config.json
└─githash
└─G_8100.pth
└─G_8200.pth
└─G_8300.pth
└─G_8400.pth
└─G_latest.pth
└─train.log

解释一下这里的内容,G_latest和D_latest就是最新训练出来的模型,至于其它带序号的模型版本,就是历史保存记录。

所以当你训练完成的时候,我们只需要G_latest.pthconfig.json这两个文件。

数据观测

备注:是否开启数据观测并不影响模型训练,如果你打开之后看不懂,那么运行了意义也不大,所以看情况是否选择要开启。

在你训练模型的时候,你可以通过如下方式,对训练过程进行观测。

不要关闭之前打开的正在训练的CMD窗口,新开一个CMD窗口,执行如下代码,激活该项目的Conda环境。

conda activate D:\dataddd\VITS-fast-fine-tuning\ENV

然后执行如下代码,导航CMD的路径为项目路径。

cd /d D:\dataddd\VITS-fast-fine-tuning

执行如下命令,这将会开启一个数据监测的网页。

tensorboard --logdir=./OUTPUT_MODEL

此时打开浏览器访问localhost:6006,你将会看到如下界面,在这个界面中可以实时观测Loss值等重要参数。

模型推理

我们刚刚训练完成时,所以当你训练完成的时候,已经在.\VITS-fast-fine-tuning\OUTPUT_MODEL目录下存G_latest.pthconfig.json这两个文件。

复制config.json文件至项目根目录.\VITS-fast-fine-tuning下,然后将其更名为finetune_speaker.json

此时在CMD中执行如下代码,将会自动在浏览器中弹出http://127.0.0.1:7860/模型推理页面。

python VC_inference.py --model_dir ./OUTPUT_MODEL/G_latest.pth --share <strong>True</strong>

我们先简单设置一下,然后生成一个测试音频听听效果。

左侧文本框中输入你想读出来的文字,然后在角色中选择我们训练的模型名称,语言中选择简体中文,其它保持默认,最后点击Generate!按钮。

下面是我们生成的音频,仔细听一下会发现,我们给出的文字为本示例由开源AI百科所提供,但实际生成的音频为zh本示例由开源AI百科所提供zh

出现这种问题的原因是,我们在准备训练素材阶段,自动对音频进行标注时,生成的文本文件short_character_anno.txt中,第一句的开头和结尾都存在[ZH]

./custom_character_voice/Drug/processed_0.wav|Drug|[ZH]这里是通过音频01识别出来的文本内容[ZH]

./custom_character_voice/Drug/processed_1.wav|Drug|[ZH]这里是通过音频02识别出来的文本内容[ZH]

…省略中间内容…

./custom_character_voice/Drug/processed_2.wav|Drug|[ZH]这里是通过音频24识别出来的文本内容[ZH]

./custom_character_voice/Drug/processed_3.wav|Drug|[ZH]这里是通过音频25识别出来的文本内容[ZH]

怎么办?删除每一行的[ZH]之后,重新训练吗?大可不必,我们仅需要将language选项的简体中文修改为Mix即可。

以下是将language选项的简体中文修改为Mix后,重新生成的音频效果。

讲真的,效果还是有点像的,还算说的过去,毕竟训练数据这么少,能达到这样的效果,已经非常不错了。

运行方式

在以后每次运行该项目时,只需要先激活我们刚刚所创建的Conda虚拟Python环境,然后运行启动文件即可。

在CMD中执行如下命令,强制切换至项目目录文件夹。

cd /d D:\dataddd\VITS-fast-fine-tuning

激活已创建的Conda环境,这样才可以正常使用该项目,否则将会自动调用系统中的默认Python。

conda activate D:\dataddd\VITS-fast-fine-tuning\ENV

执行如下代码,运行程序的GUI界面。

python VC_inference.py --model_dir ./OUTPUT_MODEL/G_latest.pth --share <strong>True</strong>

总结

此项目的效果非常不错,超越之前的音频模拟效果,但是操作比较繁琐,对于新手来说可能不太友好。