声明:转载请声明作者,并添加原文链接。
简介
这篇博客主要解读WaveNet 语音识别/合成算法。 这篇论文另辟蹊径, 主要使用dilated casual CNN 而不是LSTM 去实现语音算法, 非常值得学习。 主要内容可以总结如下
1. WaveNet 通用模型介绍, 不只是针对于语音模型
2. WaveNet 实验结果介绍
3. 实战tensorflow WaveNet 的实验过程, 实战选择的是 WaveNet ASR. 主要原因是ASR 的标注比较容易判断, 而语音合成text-to-speech很不好判断, 主要通过人工打分。
本文实战代码是 https://github.com/buriburisuri/speech-to-text-wavenet, WaveNet 论文是https://arxiv.org/pdf/1609.03499.pdf
WaveNet 模型
通用WaveNet
这里dilated casual convolution 翻译成带洞因果卷积。带洞对应的就是dilated, 就是和普通卷积步长stride 不同, stride会更大一些, 这样关注的范围 (receptive field)就变大了. casual 对应的就是因果,主要就是不要用未来的输出/结果做当前的输入。 这个方法对比RNN, 好处就是可以并行计算, 提高预测训练速度。 但是这个方法还是有他本身的局限性。 在测试时,需要使用自回归 当前的输出语言当做输入进行下一时刻的计算 (auto regressive) 限制了他的速度。下面这个图, Fig. 2 解释了自回归的特点, 即当前的输出会当做下一时刻的输入进行计算。
Fig. 3 这里介绍了多层的带洞卷积wavenet. 这样做的目的就是提高感受视野(receptive field). 比如Fig. 3的output, 就是基于16 个Input 产生的, 这样感受视野会远远大于dilation =1 的多层网络。 WaveNet 的文章里用的dilation 是1, 2, 4, …, 512, 1, 2, 4, …, 512, 1, 2, 4, …, 512, 这个相当于有30层带洞卷积, 能关注的视野也就很大了。 具体计算,1,2,4,...512 需要有1024个输入。 那么1024*3/(16*1000), 就能关注192ms的信息了, 对于16kHz 的声音信号。
WaveNet的整体结构就如Fig. 4 所示, 其中包含了残差连接,和gated activation unit.这个就是图中的两路, tanh 和sigmoid 的计算。 其他也没什么复杂的啦。
Conditional WaveNet
前面讲的都是WaveNet 的通用属性,还没涉及到text-to-speech 或者speech recognition. 文章这里加了个h, 就是用来加一些依赖关系。 比如添加声音ID, 音乐器械的信息之类的。 对于text-to-speech, h 的信息就应该是 语音/语言特征值了。这里要说下, 由于使用了提前算好的特征值, WaveNet不是端到端的训练。
WaveNet 实验结果
WaveNet 这里的实验结果是主观测试, 判断生成的生意是否听起来自然。打分如下。
1: Bad, 2: Poor, 3: Fair, 4: Good, 5: Excellent
所以也就是算所有人打分的平均值啦。
实战tensorflow WaveNet
使用的代码再次强调 https://github.com/buriburisuri/speech-to-text-wavenet
模型架构
Fig. 5 WaveNet-ASR
这里使用的是MFCC feature. MFCC 如果不了解, 读者可以去学这个课。
https://nlp.stanford.edu/courses/lsa352/lsa352.lec6.6up.pdf
CTC loss 在我以前的博客中有讲解过。
整体的架构 就如Table, Layer 1, 2 就是front layer, 主要是全连接层+bn, 接下来Layer3-10 就是一个block, 这样的block 有 15个。 这些block 的区别就是dilation 不同。 dialtion 会从1, 2, 4, 8, 16 这样改变,重复三次, 就是15个block.
数据集
这个实验使用的数据集是
Libir speech http://www.openslr.org/12/http://www.openslr.org/12/
这个实验我跑了一会就停止跑了, 需要的计算资源太大了, 跑出结果需要三四天。