惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
Security Latest
Security Latest
NISL@THU
NISL@THU
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
Cybersecurity and Infrastructure Security Agency CISA
Cloudbric
Cloudbric
T
Threat Research - Cisco Blogs
大猫的无限游戏
大猫的无限游戏
C
CXSECURITY Database RSS Feed - CXSecurity.com
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
雷峰网
雷峰网
C
Cisco Blogs
V
Vulnerabilities – Threatpost
S
Security Archives - TechRepublic
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
J
Java Code Geeks
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Know Your Adversary
Know Your Adversary
博客园 - 叶小钗
腾讯CDC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
P
Palo Alto Networks Blog
博客园_首页
V
V2EX
WordPress大学
WordPress大学
Schneier on Security
Schneier on Security
月光博客
月光博客
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News
TaoSecurity Blog
TaoSecurity Blog
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
The Cloudflare Blog
罗磊的独立博客
美团技术团队
N
News | PayPal Newsroom
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Last Week in AI
Last Week in AI
K
Kaspersky official blog
Google Online Security Blog
Google Online Security Blog
S
SegmentFault 最新的问题
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Tailwind CSS Blog

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录 2025 Python 版本性能测试 Flutter Hello World Flutter 安装环境配置 Ubuntu VMware 硬盘扩容后 SMBus Host controller not enabled 报错问题解决 Python NetworkX 教程 Docker GPU 报错 - Failed to initialize NVML Unknown Error 解决方案 Python matplotlib 图表绘制 cuda-toolkit 安装替代 Cuda 与 Cudnn Jinja2 Python 利用 docxtpl 和 Jinja2 生成基于模板的 Word 文档 Docker 实现 CPU 核心隔离 LoFTR 基于 Transformer 的特征提取匹配算法 OmniGlue 特征匹配 SuperGlue 使用图神经网络学习特征匹配 Ubuntu 下将 xlsx 文件按照 sheet 转换为 图片 Python 使用 SQLAlchemy Python FastAPI 教程 openwrt 软路由配置安装 Nav2 地图文件(PGM/YAML)规范标准 3D OBJ 模型转换为 glb 瓦片格式 Python 源码 Redis 数据库介绍 Ubuntu 22.04 内核自动升级导致 MongoDB 7.0.12 错误记录 ubuntu 20.04 安装 ROS Noetic ubuntu 18.04 安装 ROS Melodic VMware Workstation Pro 个人免费版下载、安装、使用指南 Hybrid A-star 路径规划 Reeds-Shepp 曲线 Dubins 曲线 Linux kvm 虚拟机网络不通的问题解决方法 Ubuntu 自动内存清理 BiliBili 缓存视频转 mp4 Python 求解线性规划 3D Gaussian Splatting 官方源码实践记录 ImageMagick 教程 Ubuntu 22.04 安装 Colmap 对数几率 odds Ubuntu nmcli 网络管理工具使用指南 SuperPoint 自监督深度学习特征点提取 SyncTV Music Tag Web 在线音乐信息整理工具 ncm 格式转 mp3 MusicBrainz 音乐元数据百科数据库 Ubuntu 网络流量监控工具 私人云音乐平台 Navidrome 入门 手眼标定 四元数(Quaternions) OHTTPS 实现免费自动 https 证书申请、更新、部署 ubuntu 22.04 安装 CloudCompare 单机 KVM 虚拟机冷迁移 Ubuntu 22.04 使用 mdadm 实现软 raid 小鱼 一键安装 ROS-humble Fluid -46- 基于 Simpletex API 构建公式识别页面 公式识别 API 简介 -- Simpletex 使用 Python web 部署库 waitress 3D Gaussian Splatting for Real-Time Radiance Field Rendering Ubuntu Swap 简介与空间扩展 Ubuntu 24.04 安装 forticlient Clash Verge 使用 MongoDB 7.0.17 集群 Docker 构建源码 Error code - 2013. Lost connection to MySQL server during query 问题解决 Python 日志记录库 loguru 使用指北 Python 实现 Web 日志查看服务 MySQL LOAD DATA LOCAL INFILE 极速数据加载 Image size exceeds limit of 89478485 pixels 解决方案 Docker 使用 NVIDIA GPU 驱动错误解决 阿里云 docker 镜像仓库 Ubuntu中没有wired connected的解决方案 MinIO 简介 subconverter 代理订阅格式转换 修复 node –openssl-legacy-provider is not allowed in NODE_OPTIONS 错误
使用原神语音训练中文 VITS 模型
Yiwei Zhang · 2023-06-29 · via 又见苍岚

做了大量准备工作之后,本文记录使用原神语音训练中文 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
遥望星空作文独自坐在乡间的小丘上,看着阳光渐渐变暗,听着鸟鸣渐渐变弱,触着清风渐渐变凉。
时光总是慢慢地偷走我们的容颜,渐渐地有些人终将离我们而远去。
白色的樱花纯洁高尚,红色的樱花热烈奔放,绿色的樱花清晰澹雅,花开的美丽与快乐,花落的烂漫与潇洒都蕴藏着樱花的人生智慧。

Your browser does not support the audio element.

Your browser does not support the audio element.

Your browser does not support the audio element.

还是有点云堇的意思的 ~

错误填坑

以下错误基本上都是在 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/