本文最后更新于:2024年5月7日 下午
做了大量准备工作之后,本文记录使用原神语音训练中文 VITS 模型的流程。
工作流程
- 按照 原神——提瓦特大陆语音分类识别 获取角色音频和声音识别结果
- 使用项目 vits_chinese 训练 VITS模型
这里说一下为什么用 vits_chinese ,网络上大多数用的都是 VITS(CjangCjengh版),但我觉得这个仓库大半年没有维护,Torch 版本老旧,模型比较大,而 vits_chinese 相比而言维护勤奋一些,而且支持知识蒸馏,降低了 infer 代价,也想走一条和大家不一样的路线尝试一下。
TTS 标注规范
标注时听音频根据发音人的语感,对音频的停顿节奏进行标注。
共四个标注符号:#1、#2、#3、#4
- #1无停顿,正常分词。
- #2拉长音或短暂停顿,语意未完
- #3语意完整的较明显停顿,语调下降,可做为句末音
- #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.pth
和 prosody_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)
|
核心训练命令
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 attribute ‘version‘
|
能见到这个提示,应该是使用tensorboard;
setuptools
版本问题,setuptools
版本过高导致的问题
- 卸载
setuptools
1
| pip uninstall setuptools
|
- 安装低版本
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/