本文最后更新于:2023年12月5日 下午

做了大量准备工作之后,本文记录使用原神语音训练中文 VITS 模型的流程。

工作流程

  1. 按照 原神——提瓦特大陆语音分类识别 获取角色音频和声音识别结果
  2. 使用项目 vits_chinese 训练 VITS模型

这里说一下为什么用 vits_chinese ,网络上大多数用的都是 VITS(CjangCjengh版),但我觉得这个仓库大半年没有维护,Torch 版本老旧,模型比较大,而 vits_chinese 相比而言维护勤奋一些,而且支持知识蒸馏,降低了 infer 代价,也想走一条和大家不一样的路线尝试一下。

TTS 标注规范

标注时听音频根据发音人的语感,对音频的停顿节奏进行标注。
共四个标注符号:#1、#2、#3、#4

  1. #1无停顿,正常分词。
  2. #2拉长音或短暂停顿,语意未完
  3. #3语意完整的较明显停顿,语调下降,可做为句末音
  4. #4句末,及每个编号对应句子结尾的标注

下载项目

clone 项目

1
git@github.com:PlayVoice/vits_chinese.git

下载模型

BaiduYun: https://pan.baidu.com/s/1Cj4MnwFyZ0XZmTR6EpygbQ?pwd=yn60

Google: https://drive.google.com/drive/folders/1sioiNpebOLyCmHURgOgJ7ppWI7b-7Rb5?usp=sharing

下载好的模型 vits_bert_model.pthprosody_model.pt 放到 bert 文件夹

搭建环境

1
2
3
4
5
pip install -r requirements.txt

cd monotonic_align

python setup.py build_ext --inplace

生成语音标注

根据 原神——提瓦特大陆语音分类识别 筛选的音频,使用 科大讯飞语音识别 结果,运用 Python 识别中文生成带声调的拼音 的方法,按照 vits_chinese 仓库的音频标注规范,生成语音标注,我贴上我的示例代码,仅供参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import mtutils as mt
import pypinyin


def make_chinese_label(xf_res):
chinese_label = ''
pure_chinese_str_list = list()
chinese_char_num = 0
for sub_sentence in xf_res[:-1]:
pure_chinese_str = ''
for sub_data in sub_sentence:
cw = sub_data['cw']
assert len(cw) == 1
cw = cw[0]
if len(cw['w']) > 1:
chinese_label += cw['w']
chinese_label += '#2'
pure_chinese_str += cw['w']
else:
single_char = cw['w']
if single_char in [',', ',', '、', ':', '?','?', '!', '!']:
chinese_label = chinese_label[:-1] + '3'
chinese_label += single_char
else:
chinese_label += single_char
chinese_label += '#1'
pure_chinese_str += single_char
pure_chinese_str_list.append(pure_chinese_str)
chinese_char_num += len(pure_chinese_str)
chinese_label = chinese_label[:-1] + '4'
chinese_label += xf_res[-1][0]['cw'][0]['w']
return chinese_label, pure_chinese_str_list, chinese_char_num


def make_pinyin_label(pure_chinese_str_list):
sub_res_str_list = list()
for pure_chinese_str in pure_chinese_str_list:
pinyin_sub_res = pypinyin.lazy_pinyin(pure_chinese_str, style=pypinyin.STYLE_TONE3, neutral_tone_with_five=True)
sub_res_str = mt.str_connection(*pinyin_sub_res, connect_char=' ')
sub_res_str_list.append(sub_res_str)
result_str = mt.str_connection(*sub_res_str_list, connect_char=' ')
return result_str


if __name__ == '__main__':
role_name = '云堇'
dir_list, file_list = mt.get_dir_file_list('fea/classified_data_plus/')
match_num = 0
match_dir_path = None
for dir_path in dir_list:
if role_name in dir_path:
match_num += 1
match_dir_path = dir_path
assert match_num == 1
print(match_dir_path)

xf_match_res = mt.json_load('xf_rec_results.json')

role_wav_path_list = mt.glob_recursively(match_dir_path, 'wav')
match_pair = list()
loss_pair = list()
for role_wav_path in mt.tqdm(role_wav_path_list):
key = mt.OS_basename(role_wav_path)
if key in xf_match_res:
match_pair.append([key, xf_match_res[key]])
else:
loss_pair.append(key)

label_result_str_list = list()

for match_item in mt.tqdm(match_pair, desc="生成标注: "):
key = mt.get_path_stem(match_item[0]).replace(' ', '_')
data = match_item[1]['data']
chinese_label, pure_chinese_str_list, chinese_char_num = make_chinese_label(data)
first_line = key + '\t' + chinese_label
second_line = '\t' + make_pinyin_label(pure_chinese_str_list)
if chinese_char_num > 2:
label_result_str_list.append(first_line)
label_result_str_list.append(second_line)

mt.file_write_lines(label_result_str_list, 'gt_label/' + role_name + '_gt_1.0.txt', overwrite=True)
pass

注意: 在语音识别结果中会有阿拉伯数字,需要想办法转成中文。

本事要是有10分 --> 本事要是有十分

整理标注示例

整理后的标注需要是这种格式:

1
2
3
4
5
6
3011_00035	不然#2#1#1#1#1每日#2#1功课#4
bu4 ran2 ke3 gan3 bu4 wan2 mei3 ri4 de5 gong1 ke4
1013_00252 小时候#3,我#1#1父亲#2来过#2一次#2#1#1#3,记得#2#1#1#1#1#1#1#3,爬到#2山顶#2#1#1已经#2#1#1不行#2#4
xiao3 shi2 hou4 wo3 sui2 fu4 qin1 lai2 guo4 yi1 ci4 tian1 heng2 shan1 ji4 de5 zhe4 zuo4 shan1 hao3 gao1 hao3 gao1 pa2 dao4 shan1 ding3 shi2 tui3 yi3 jing1 suan1 de5 bu4 xing2 le5
3011_00085#3,你们#2#1#1#1报社#2#3?为什么#2之前#2#1#1见过#4
a5 ni3 men5 shi4 na3 jia1 bao4 she4 de5 wei4 shen2 me5 zhi1 qian2 dou1 mei2 jian4 guo4

将对应音频文件放到 data/waves 文件夹中(需要转换为 16k 采样率)

准备训练数据

1
python vits_prepare.py -c ./configs/bert_vits.json

训练

核心文件为 train.py,我的多线程总出问题,建议将 main() 方法改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

def main():
"""Assume Single Node Multi GPUs Training Only"""
assert torch.cuda.is_available(), "CPU training is not allowed."

n_gpus = torch.cuda.device_count()
os.environ["MASTER_ADDR"] = "localhost"
os.environ["MASTER_PORT"] = "40000"

hps = utils.get_hparams()
run(0, 1, hps)
# mp.spawn(
# run,
# nprocs=n_gpus,
# args=(
# n_gpus,
# hps,
# ),
# )

核心训练命令

1
python train.py -c configs/bert_vits.json -m bert_vits

需要配置好标注、配置文件等信息。

预训练

可以使用官方推荐的数据直接训练来练手以及生成预训练模型:

1
2
download baker data: https://www.data-baker.com/data/index/TNtts/
change sample rate of waves to 16kHz, and put waves to ./data/waves

音频生成

我用云堇的音频文件训练了 VITS 模型,训练好后可以尝试输出,10000 个 Iter 后输出了一个模型,迫不及待试了一下。

核心文件为 vits_infer.py,该文件需要配置配置文件和模型路径,之后会根据配置加载语音生成模型,将 vits_infer_item.txt 中的中文转为语音,这里贴几段示例:

1
2
3
遥望星空作文独自坐在乡间的小丘上,看着阳光渐渐变暗,听着鸟鸣渐渐变弱,触着清风渐渐变凉。
时光总是慢慢地偷走我们的容颜,渐渐地有些人终将离我们而远去。
白色的樱花纯洁高尚,红色的樱花热烈奔放,绿色的樱花清晰澹雅,花开的美丽与快乐,花落的烂漫与潇洒都蕴藏着樱花的人生智慧。

还是有点云堇的意思的 ~

错误填坑

以下错误基本上都是在 Win 10 系统下的问题,在 Ubuntu 过程无比丝滑,建议直接在 Linux 搞,不要在 Windows 里折腾。

Original error was: DLL load failed while importing _multiarray_umath

在为新的仓库配置Python 环境后,pip 安装包时报错:

1
Original error was: DLL load failed while importing _multiarray_umath: 找不到指定的模块。

这是由于 Python Ananconda 环境更换时路径配置不彻底导致的

  • 解决方案

需要将正确的 .anaconda\Library\bin 的路径加入到系统路径中

ValueError: check_hostname requires server_hostname

更换环境后 pip 安装包报错

1
ValueError: check_hostname requires server_hostname

通常是因为版本冲突等原因,查遍网上众多大佬总结的经验后,最终发现是由网络代理导致的问题,即我们通常说的vpn问题。

关掉VPN后问题解决。

AttributeError: module ‘distutils‘ has no attribute ‘version‘

运行仓库 train.py 文件时报错

1
AttributeError: module ‘distutils‘ has no attributeversion

能见到这个提示,应该是使用tensorboard;

  • 问题原因

setuptools版本问题,setuptools版本过高导致的问题

  • 解决方案
  1. 卸载 setuptools
1
pip uninstall setuptools
  1. 安装低版本 setuptools
1
pip install setuptools==58.0.4

No module named ‘monotonic_align.monotonic_align’

这是没有进入到 monotonic_align 文件夹中并执行安装命令导致的:

1
python setup.py build_ext --inplace

error: command ‘cl.exe‘ failed

在执行 python setup.py build_ext --inplace 安装过程中可能报错没有 cl.exe

这需要额外安装 C++ 编译环境并将 cl.exe 所在的文件夹添加到系统路径中

例如我的路径是:

1
D:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x64

fatal error C1356: 无法找到 mspdbcore.dll

在执行 python setup.py build_ext --inplace 安装过程中可能报错

1
fatal error C1356: 无法找到 mspdbcore.dll

参考:https://blog.csdn.net/jacke121/article/details/90614060

  • 解决方案

Vs2015和vs2017可以同下面的方法解决:

  • Vs2017解决方法:

    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE

    把:msobj140.d,mspdb140.dl,mspdbcore.dl,mspdbsrv.exe四个文件复制到:

    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x64

    有两个文件会提示覆盖,选择覆盖。

  • Vs2015解决:

    1.找到VS2015IDE的安装目录,以本人电脑上的目录为例:C.Program Files(x86)Microsoft Visual Studio14.0 Common7NDE

    2.将DE目录中的nsobj140.d,mspdb140.d,mspdbcore.d,mspdbsrv.exe四个文件复制到VC的bin目录下覆盖原有文件,以本人电脑为例VC/bin的目录为:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

    3.打开VS2015新建一个C++的win32控制台程序试一下是否还出现Link1171错误

    4.如果还出现这个错误,请将VC/bin目录加入到系统环境变量Path中用分号隔开,重启计算机。

python setup.py build_ext --inplace 缺这少那

一直报缺少各种头文件、dll、exe 等

没找到更好的办法,在本机找到文件,将头文件目录加到 --include-dirs 里,路径都在 "" 内 用 ; 隔开;

缺少的库目录就加到 --library-dirs 参数中

缺少的 exe 就加到系统 Path 路径中

1
python setup.py build_ext --inplace --include-dirs="F:\Windows Kits\10\Include\10.0.17763.0\ucrt;D:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include;F:\Windows Kits\10\Include\10.0.17763.0\shared" --library-dirs="D:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\lib\x64;F:\Windows Kits\10\Lib\10.0.17763.0\um\x64;F:\Windows Kits\10\Lib\10.0.17763.0\ucrt\x64;F:\Windows Kits\10\bin\10.0.17763.0\x64"

cl.exe 使用路径 C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x64 下的文件

参考资料



文章链接:
https://www.zywvvd.com/notes/study/deep-learning/tts/vits-chinese/vits-chinese/


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

使用原神语音训练中文 VITS 模型
https://www.zywvvd.com/notes/study/deep-learning/tts/vits-chinese/vits-chinese/
作者
Yiwei Zhang
发布于
2023年6月29日
许可协议