WaveNet 是生成原始音频波形的深层生成模型。这项突破性的技术已经被 Google DeepMind 引入(https://deepmind.com/blog/generate-mode-raw-audio/),用于教授如何与计算机对话。结果确实令人惊讶,在网上你可以找到合成声音的例子,电脑学习如何用名人的声音与人们谈话。
所以,你可能想知道为什么学习合成音频是如此困难。听到的每个数字声音都是基于每秒 16000 个样本(有时是 48000 个或更多)建立一个预测模型,在这个模型中学习基于以前所有的样本来重现样本,这是一个非常困难的挑战。
尽管如此,有实验表明,WaveNet 已经改进了当前最先进的文本到语音(Text-To-Speech,TTS)系统,降低了英语和普通话之间 50% 的差异。
更酷的是,DeepMind 证明了 WaveNet 可以教会电脑如何产生乐器的声音,比如钢琴音乐。下面给出一些定义。TTS 系统通常分为两个不同的类别:
原则上,WaveNet 可以看作是一堆卷积层(已经在前面章节中看到了二维卷积图像),而且步长恒定,没有池化层。请注意,输入和输出的结构具有相同的尺寸,所以 ConvNet 非常适合对音频声音等连续数据进行建模。
然而,实验表明,为了达到输出神经元中的感受野大尺寸,有必要使用大量的大型滤波器或者不可避免地增加网络的深度。请记住,一个网络中一层神经元的感受野是前一层神经元对其提供输入的横截面。由于这个原因,纯粹的卷积网络在学习如何合成音频方面效率不高。
WaveNet 的关键在于所谓的扩张因果卷积(有时称为带孔卷积),这就意味着当应用卷积层的滤波器时,一些输入值被跳过。例如,在一个维度上,一个具有扩张 1、大小为 3 的滤波器 w 将计算如下所示的加权和。
简而言之,在扩张值为 D 的扩张卷积中,通常步长是 1,你也可使用其他的步长。下图给出了一个例子,扩大(孔)尺寸为 0,1,2:
由于引入“孔”这个简单的想法,使得堆叠多个扩张的卷积层与指数增加的过滤器、学习长距离输入而不用担心有一个过深的网络成为可能。
因此,WaveNet 属于卷积网络,其卷积层具有各种扩张因子,使得感受野随深度呈指数增长,有效地覆盖了数千个音频时间步长。
当训练时,输入是来自人类说话者的录音。这些波形量化为一个固定的整数范围。WaveNet 定义了一个初始卷积层,只访问当前和之前的输入。然后,有一堆扩大的卷积层,仍然只能访问当前和之前的输入。最后,有一系列密集层结合了前面的结果,接下来是分类输出的 softmax 激活函数。
在每个步骤中,从网络预测一个值并将其反馈到输入中。同时,计算下一步的新预测。损失函数是当前步骤的输出和下一步的输入之间的交叉熵。
NSynth是最近由 Google Brain 小组发布的一个 WaveNet 的演变,它不是因果关系,而是旨在看到输入块的整个上下文。如下图所示,神经网络确实是复杂的,但是作为介绍性讨论,知道网络学习如何通过使用基于减少编码/解码期间的误差的方法来再现其输入就足够了:
本节直接使用网上的代码来演示(https://github.com/tensorflow/magenta/tree/master/magenta/models/nsynth),你还可以从 Google Brain 中找到一些。
WaveNet 是一种卷积网络,卷积层具有各种扩张因子,使得感受野随深度呈指数级增长,因此可以有效地覆盖数千个音频时间步长。NSynth 是 WaveNet 的一种演变,其中原始音频使用类似 WaveNet 的处理来编码,以学习紧凑的表示。然后,这个紧凑的表示被用来再现原始音频。
一旦学习如何通过扩张卷积创建一段紧凑的音频,可以发现其中的乐趣,比如说: