前言
随着电子竞技不断被正名,近几年的热度也在不断攀升,越来越多的公司和创业者开始关注和投入到电竞生态链。从资讯、数据、赛事到工具、组建战队都可以找到不少创业公司在深耕这个领域。
今天这篇主要围绕在电竞内容,我们能通过AI技术做怎样的尝试。电竞内容抽象上说就是信息通过不同媒介呈现出来的效果,一个人可以从视觉、听觉等多个方面接收不同媒介的信息。因此在视觉上我们可以通过文字、图片甚至视频来表达电竞比赛的精彩瞬间、战队、队员的集锦或者积分排行版;在听觉上我们可以播报战报,解说比赛。
那怎样能把电竞内容做的有趣一些,而不是现在各大内容平台互相爬着无聊的文字内容。我们试想今天你想了解一场LGD对阵OG的比赛,是简单的文字内容有意思还是用may皇的声音播报出来更有趣呢?如果把生成的战报用不一样的声音播报出来,这样是不是能更加丰富电竞内容的体验?
接下来,为大家介绍google deepmind的研究成果Tacotron,text to speech的语音合成技术。
Tacotron
Tacotron-1网络模型
在介绍Tacotron网络模型前,我们先对声音等这类连续信号的处理先形成一个抽象的概念。
Seq2Seq
- encoder-decoder处理流程
seq2seq是RNN网络中的一种特殊模型,主要可以用于以下一些场景:
- 文本翻译
- 文本语义分析
- 聊天机器人
- 图片caption生成
这类连续数据场景也被扩展到文本转语音或者语音识别的场景。宏观上我们可以理解为所有这类场景都是使用encoder-decoder的处理架构。如下图:
处理顺序:
- 输入数据,通过encoder网络生成state vector
- state vector输入decoder网络输出最后的内容
其中encoder和decoder分别由各自的RNN网络构成。
- Tacotron网络模型介绍
根据上述的encoder-decoder架构,对应到Tacotron的网络模型如下:
encoder
左侧部分为Encoder, 目的是将输入的文本生成可用于attention-based的decoder网络可用的连续特征向量。
首先将输入文本通过独热编码转换成连续向量,再通过pre-net的非线形转换以及CBHG子网络输出state vector。
decoder
什么是Attention-based model
根据论文介绍,作者使用Bahdanau attention-based模型来生成最终的输入decoder网络的输入。实际Bahdanau attention模型也是基于encoder-decoder架构的一种特征提取网络。
根据网络模型图,encoder每层生成的中间状态都会作为decoder网络的输入,并且用在每一次decoder RNN迭代中。
什么是Griffin Lim算法
对于最后生成声谱图,通过GL算法转换成波形数据。GL算法的核心是短时距傅立叶变换将声谱图从频率维度转换为时间维度,即拥有相位信息的声音信号。
在声谱图中前后两帧的频谱在时间上有一定的重叠,GL则是用迭代的方式利用前一次的频谱迭代计算当前迭代的信号,让生成的声音信号的声谱图与原声谱图的均方差达到最小。
从第三步可以看出,每次通过前一次迭代的相位P计算出的信号后,再通过原声谱图做反短时距傅立叶变换计算新的相位P,通过多次迭代得到使生成的声谱与原声谱最相近的相位值。
Tacotron-2网络模型
在Tacotron的网络模型上,主要用LSTM替换了CBHG,同时对于生成的声谱图,通过训练Wavenet模型将声谱图转成声波图。
因为Wavenet是用的PixelRNN对连续数据进行训练,涉及到多层的dilation(下一篇会详细介绍),训练需要的steps比较大,过程耗时;实验验证100k的steps训练Tacotron-2,再用GL进行合成,音质效果还不错,噪声几乎没有,如果是单语言单speaker的模型可以简化。
Tacotron-2 loss训练到0.8以下,wavenet loss在5以下,生成的语音效果就比较好。
Tacotron-2生成的波谱图需要用Griffin Lim进行合成,用作Wavenet的训练样本。Griffin Lim存在一部分缺陷:
- 声音可能存在变形
- 无法通过单模型合成多语言和多speaker的声音
相反,通过Wavenet加入language和speaker的embedding,可以通过单模型实现多语言和多speaker,同时也支持speaker转多语言(比如不会说英文的speaker,带入speaker标识和英文标识进行语音合成)。
另外如果自定义的训练集样本比较少,注意把hparams.py里的test_size改为None, test_batches设置为合适的值。
代码结构
本次分析的代码仓库为https://github.com/Rayhane-mamah/Tacotron-2,根据自己的项目,hparams和训练集做了相应的处理。
repo使用tensorflow实现,要保证wavenet训练正常,经过验证要使用tensorflow&tensorflow-gpu==1.10的版本,>=1.10版使用不了gpu且wavenet会报错。
另外也可以用tf2重写一遍,代码会更加的清晰和整洁一些。(一键代码升级方式https://www.tensorflow.org/guide/upgrade)
Tacotron-2 主要结构
|-- train.py
|-- synthesize.py
|-- hparams.py
|-- preprocess.py
|-- wavenet_preprocess.py
|-- datasets
|-- tacotron
|-- train.py
|-- synthesize.py
|-- synthesizer.py
|-- models
|-- modules.py
|-- tacotron.py
|-- custom_decoder.py
|-- helpers.py
|-- attention.py
|-- architecture_wrappers.py
|-- utils
|-- wavenet_vocoder
|-- train.py
|-- synthesize.py
|-- synthesizer.py
|-- feeder.py
|-- models
|-- wavenet.py
|-- modules.py
|-- mixture.py
|-- gaussian.py
训练相关入口为train.py,执行流程如下: (合成逻辑相似)
- 入参解析
一般训练只需用到mode、tacotron_train_steps与wavenet_train_steps,超参基本是复用默认值,根据显卡的配置,对batch_size,frames及output_steps进行适当调整,如果是要做到单模型支持多语言和多speakers还需要对wavenet的local condition和global condition进行配置。
这里需要注意配置的其实是steps,即学习的数量而不是epochs的配置,我理解特别是在wavenet采用pixelRNN的模型,像语音这类一维线性且连续的数据,训练是很耗时,所以控制粒度在step会更容易分阶段比对训练结果。
- hparams解析
hparams大致分为6个部分:
1. 基本环境配置包括硬件能力的设置
2. Audio相关配置,e.g 声谱图配置,采样率,Griffin Lim算法配置等
3. Tacotron模型配置,下文介绍模型会具体解释部分参数
4. Wavenet模型配置,下文介绍模型会具体解释部分参数
5. Tacotron训练配置
6. Wavenet训练配置
- 判断训练状态(tacotron与wavenet)
启动训练之前,会校验训练状态。训练状态以日志方式提供,在logs-Tacotron-2目录下stat_log, 分别判断tacotron,wavenet的训练情况以及声谱图输出目录。
如果需要增量训练,调整steps参数后,删除state_log或者更改某个模型的状态为0即可。
-
执行训练
-
源代码的网络模型实现
tacotron-2模型主要参考tacotron/models里的tacotron.py和modules.py两个文件。
分别定义里一个3层卷积网络和一个双向RNN网络
结束语
到此,希望对电竞内容感兴趣的同学能有所启发和收获。电竞领域结合AI技术相信会成为未来一个主要方向,也是增加企业技术壁垒的必经之路。
本篇主要是介绍Tacotron的基本概念、网络模型和其中涉及到的一些算法。下一篇会重点介绍Wavenet的网络模型。
欢迎讨论。
参考
ogle.github.io/tacotron/](https://google.github.io/tacotron/)