抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

(接上篇博客)做完数据集,我们手里现在有训练集(train set)和测试集(test set)音频文件,以及对应的拼音文本,接下来就可以跑Tacotron2来训练模型了。

2. 训练模型 & 合成语音

Tacotron2项目地址点击这里

HiFi-GAN项目地址点击这里

本篇博客训练模型&合成语音基于以上两个开源项目,再次感谢原作者!

2.1 Tacotron2简介

简单讲一讲Tacotron2,它是由google推出的从文本中合成语音的神经网络结构,也就是一个语音合成(Text To Speech,TTS)框架,可以实现端到端的语音合成。Tacotron2与其前代Tacotron类似,比较重要的一个区别是在编码器模块中引入了一个双向LSTM层和卷积层,相比原来的CBHG堆叠结构和GRU循环层更为简洁。

模型主要由两部分组成:

    1. 声谱预测网络:特征预测网络,包含一个编码器和一个引入注意力机制(attention)的解码器,作用是将输入字符序列预测为梅尔频谱的帧序列。
    1. 声码器(vocoder):将预测的梅尔频谱帧序列转换产生时域波形样本,算是WaveNet的修订版。

原项目中的声码器我们暂时不用(上面地址提供的Tacotron 2就是没有wavenet的版本),因为有更好的工具HiFi-GAN。

代码实现详解有很多博客可以参考((16条消息) Tacotron2 论文 + 代码详解_HJ_彼岸的博客-CSDN博客_tacotron2),这里只要知道我们是用Tacotron2生成梅尔频谱,在此基础上结合我们输入的字符序列(也就是对应的拼音文本)训练模型。

特别注意一点:Tacotron 2是基于tensorflow1.5版本运行的,如果是自己电脑上配置环境的话,务必将python版本降到3.7以下!否则将会无法安装tensorflow1.5,除了tensorflow有硬性版本要求之外,其他依赖都可以安装最新版本——反复配置环境治好了我的精神内耗

如果你不想和我一样配置好几天环境的话,我推荐最好使用google colab,一键解决环境问题,下面会说到。

2.2 HiFi-GAN简介

简单说下,声码器的作用就是将梅尔频谱转换成语音信号,和上面是对应的。

为什么我们没有用上面Tacotron2的声码器呢,主要原因就是现在有很多更优秀的声码器供我们选择。

早期比较有名的声码器WaveNet,它是一种自回归卷积神经网络,合成的效果非常好可以说和人类发声非常相似,但有个致命的缺点——合成速度太慢。直到2020年项目作者开发了这套基于GAN(生成式对抗网络)的神经网络声码器,从作者的论文里可以找到,HiFi-GAN在GPU上可以以比实时速度快167.9倍的速度生成22.05 kHz的语音,在CPU上可以以比自回归模型快13.4倍的速度生成语音,这就是它的牛逼之处。

HiFi-GAN主要有一个生成器和两个判别器,具体结构就不说了,知道一下生成器和两个判别器是通过对抗学习的方法训练的,新增加了两个损失函数来提高训练的稳定性和提高模型的性能。有能力的小伙伴可以看原论文(HiFi-GAN: Generative Adversarial Networks for Efficient and High Fidelity Speech Synthesis)了解详情。

需要注意一下作者使用VCTK数据集进行实验,测试了3个模型(V1、V2和V3),简单来说V1是最优模型,作者发布的预训练模型以及相应的配置文件都是以V1模型为基础的。我在这篇博客使用的HiFi-GAN模型g_02500000就是作者的预训练模型,配置文件为config.json

HiFi-GAN预训练模型与配置文件下载地址:

UNIVERSAL_V1 - Google 云端硬盘

2.2 注册谷歌colab和谷歌云盘

训练模型是一件非常消耗算力的过程,因为涉及到图形处理,我们要用GPU进行加速。我的笔记本GPU非常拉跨,跑模型立马爆显存,因此我个人比较推荐白嫖谷歌colab上面的免费专业级GPU(Nvidia K80),免费用户只能用这一种GPU,至少比我的笔记本好多了。

需要注意下colab最大连接时长是12小时,12小时后会强行关闭GPU连接,因此需要注意下你是什么时候开始用GPU跑模型的,并且及时保存数据。关闭后要等待24小时才可以继续使用GPU,所以理论上可以用三个号不间断白嫖GPU资源(我特地申请了4个谷歌号)你只需要偶尔切换屏幕看下是否有谷歌的人机验证就行

这里为什么还推荐谷歌云盘呢,是因为谷歌云盘可以挂载到colab上,这样调用文件就非常方便,及时保存不用担心数据丢失。谷歌云盘提供15GB的免费空间,如果保存模型比较频繁的话可能不够用,但是我们可以申请无限量的团队盘(共享云端硬盘薅羊毛必备

2.3 使用colab训练模型 & 合成语音

我使用的colab笔记文件因为时间久远已经找不到出处了(后续如果找到会标注出来,向原作者致谢!),为了跑中文语音模型,自己也修改了很多参数和步骤,一一解释过于麻烦了….感兴趣的小伙伴可以看笔记文件。具体操作流程在底下的视频(或者点击此处看我的B站视频)。

所有工程文件和资源如下:

Tacotron2+HiFiGAN打包 链接:https://pan.baidu.com/s/1ngCUvifQM6ETwuG-NFQeGA 提取码:z6h3

400条派蒙语音测试集 链接:https://pan.baidu.com/s/1g0C0Ck4P_BxdTgMirKRc-g 提取码:5ew1

1800条派蒙语音训练集 链接:https://pan.baidu.com/s/1IDA4lppAJGHnophQAwkxNg 提取码:f2xk

需要提及一点,colab在2022年8月1号之后不再支持tensorflow1.5,请教大佬之后我将Tacotron2项目下超参数配置hparams.py改成如下即可正常运行:

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
83
84
85
86
87
88
import tensorflow as tf
from text import symbols

class hparams:
def __init__(self) -> None:
super().__init__()

################################
# Experiment Parameters #
################################
epochs = 3 #500
iters_per_checkpoint = 1000
seed = 1234
dynamic_loss_scaling = True
fp16_run = False
distributed_run = False
dist_backend = "nccl"
dist_url = "tcp://localhost:54321"
cudnn_enabled = True
cudnn_benchmark = True
ignore_layers = ['embedding.weight']

################################
# Data Parameters #
################################
load_mel_from_disk = False #实际上是区别用 numpy读wav ,还是用scipy读wav
training_files = 'filelists/zh_audio_text_train_filelist.txt'
validation_files = 'filelists/zh_audio_text_val_filelist.txt'
text_cleaners = ['english_cleaners']

################################
# Audio Parameters #
################################
max_wav_value = 32768.0
sampling_rate = 22050 #22050
filter_length = 1024
hop_length = 256
win_length = 1024
n_mel_channels = 80
mel_fmin = 0.0
mel_fmax = 8000.0

################################
# Model Parameters #
################################
n_symbols = len(symbols)
symbols_embedding_dim = 512

# Encoder parameters
encoder_kernel_size = 5
encoder_n_convolutions = 3
encoder_embedding_dim = 512

# Decoder parameters
n_frames_per_step = 1 # currently only 1 is supported
decoder_rnn_dim = 1024
prenet_dim = 256
max_decoder_steps = 1000
gate_threshold = 0.5
p_attention_dropout = 0.1
p_decoder_dropout = 0.1

# Attention parameters
attention_rnn_dim = 1024
attention_dim = 128

# Location Layer parameters
attention_location_n_filters = 32
attention_location_kernel_size = 31

# Mel-post processing network parameters
postnet_embedding_dim = 512
postnet_kernel_size = 5
postnet_n_convolutions = 5

################################
# Optimization Hyperparameters #
################################
use_saved_learning_rate = False
learning_rate = 1e-3
weight_decay = 1e-6
grad_clip_thresh = 1.0
batch_size = 2 #64
mask_padding = True # set model's padded outputs to padded values


def create_hparams(hparams_string=None, verbose=False):
return hparams

2.4 注意事项

    1. 训练的epoch不是越多越好,我个人经验epoch 超过400会发生过拟合,测试集loss会越来越大,当然这和数据集有着密切的关系。过拟合具体表现为合成语音有部分字无法发音。
    1. 每个epoch自动保存模型且会覆盖谷歌云盘的原文件,因此务必要隔一段时间保存到本地,以免错过最佳模型(或者你改代码,比如50 epoch保存一次)。
    1. 对于文本的处理,需要参考Tacotron 2项目下的text文件夹中的四个文件cleaners.py、cmudict.py、numbers.py和symbols.py,我是进行了最简单的设置,可以根据自己需要更改。
    1. 如果你原封不动用的我的工程文件,想在本地运行合成语音的推理程序,务必将cleaners选择english_cleaner(否则会出现古神的低语)
    1. 如果你是自己训练模型,个人认为筛选数据集非常重要,尽量把语气词和背景噪音去掉,否则效果会很差。
    1. 训练模型的参数可以根据GPU自行调整,batch_size是影响训练速度最大的因素,当你不确定显卡性能如何,请务必确保运行一段时间后显存没有炸(我就是运行以后直接睡觉了,醒来发现显存在运行半小时的时候炸了,我心态也炸了

其实这个模型效果仍然不是很让我满意,有电音的问题可以用HiFi-GAN再训练过滤一下,我是直接用的官方预训练模型,因此效果会差一点。由于现在开学了要忙着搞开题,最近也没时间再优化模型了,以后有想法会继续补充。

我自己有考虑过将模型传到服务器,用服务器cpu运行推理,摆脱colab的限制,但是服务器不堪重负…一运行推理运存就炸…github上有不少前人做过纯cpu推理的GUI(比如MoeTTS),亲测可行。

哦对了,我在做这个项目的时候,发现已经有人基于VITS做了同个游戏的端到端语音合成,甚至开发公布了API…不得不感慨这些大佬真的用心了,有API就意味着有更多的使用方式。我搭了个顺风车,通过搭建QQ机器人,写了个原神语音合成插件,效果是可以指定原神任何角色合成任意想说的语音并且发在QQ群里(没有什么技术含量,内行看个笑话),有空尽量更新出来吧!

2022/9/10更新

已将插件更新至我的github仓库,地址Phantom-Aria/zhenxun_plugin_tts: 真寻bot插件,原神角色语音合成tts (github.com)

由于代码写的比较幼稚,就不申请官方插件索引了

  • 适配绪山真寻bot

  • 功能:指定某原神角色合成想要说的话

  • 指令:[角色名]说/说过[文本]

2022/10/7更新
由于原API已下线,此插件不再生效,后续再更新

欢迎小伙伴们留言评论~