简介

WaveNet利用神经网络系统对原始音频波形(Raw SoundWave)建模该网络。基于WaveNet生成的音频质量优于目前所有的文本转语音(Text-to-Speech,TTS)系统,将计算机输出音频与人类自然语音差距缩小50%。最常用的TTS方法是拼接式语音合成(Concatenative Synthesis):先录制单一说话者的大量语音片段,建立一个大型语料库,然后简单地从中进行选择并合成完整的大段音频、词语和句子。这种“机械式”方法使得计算机输出音频经常产生语音毛刺、语调的诡异变化、甚至结巴,并且无法调整语音的语调,强调性音节或情绪。对于这种方式来说,一种新的声音,是需要一个新的完全数据库的。
另外一种方法是所谓的参数化方法,利用数学模型对已知的声音进行排列、组装成词语或句子来重新创造音频,其中生成数据所需的所有信息都存储在模型的参数中,因此语音的内容和特征都可以通过该模型的输入进行控制。但是,到目前为止,参数 TTS 往往听起来都不如拼接 TTS 那样自然——至少在英语等语音的合成上是这样。现有的参数模型往往是通过将它们输出经过信号处理算法(被称为语音编码器(vocoders))来生成音频信号。

WaveNet 神经网络架构选择直接建模音频信号的原始波形,一次处理一个样本。除了能够产出听起来更为自然的声音,使用原始波形意味着 WaveNet 可以建模几乎任何类型的音频,包括音乐。

WaveNet:

研究者通常会避免对原始音频进行建模,因为波形波动得非常快:每秒通常有 16,000 甚至更多个样本,而且在许多时间尺度上都存在重要的结构。在这些结构中(完全自回归模型),对每一个样本的预测都会受到之前所有样本的影响(用统计学的话来说:每一个预测分布的前提是所有先前的观察),这显然是一个具有挑战性的任务。
谷歌今年初发布的 PixelRNN 和 PixelCNN 模型表明不仅一次一个像素式地生成复杂的自然图像是可能的,而且也可以一次一个颜色信道(colour-channel)地生成,这需要对每张图像进行数千次预测。在这启发下他们将二维 PixelNet 调整为一维的 WaveNet。
WaveNet 的结构的结构:

![WaveNet 的结构](https://img-blog.csdn.net/20161020202303230) 这是一个完全卷积的神经网络,其中的卷积层有不同的膨胀系数( dilation factors),这让其感受野(receptive field)可在深度(depth)上**指数式地增长**并可覆盖数千个时间步骤(timesteps)。 在训练时间内,其输入序列是由人类说话者录制的真实波形。训练之后,我们可以对这个网络进行采样以生成合成的语音。在采样的每一个时间步骤,都会从该网络所计算出的概率分布中取出一个值。然后这个值会被反馈到输入,并为下一个步骤生成一个新的预测。像这样一次一步地构建样本具有很高的计算成本,但我们发现这对生成复杂的、听起来真实感强的音频而言至关重要。 使用谷歌的一些 TTS 数据集训练 WaveNet,所以我们能评估其表现。与谷歌目前最好的 TTS 系统(parametric 和 concatenative)和使用平均意见得分(Mean Opinion Socres,MOS)测试的人类语音相比,下图显示了 WaveNet 从 1 到 5 的质量表现。MOS 是一个主观的声音质量测试的标准测量方法,包含带有人类受试者的盲测(在 100 条测试语句上的超过 500 个评级)。就像我们看到的那样,在英语和汉语普通话上,WaveNet 减少了顶尖水平与人类水平之间的差距,减小的这个差距超过了 50%。 无论是汉语还是英语,谷歌目前的 TTS 系统被认为是全球最好的,所以使用一个模型对两者都有改进是一件非常重大的成就。 ![这里写图片描述](https://img-blog.csdn.net/20161020203417440) **知道说什么** 为了使用 WaveNet 将文本转化为语音,我们需要让WaveNet知道待识别的文本中是什么。我们通过将文本转换为一序列的**语言特征**和**语音特征**(包含了当前音素、音节、词等方面的信息)并将其输送到 WaveNet 中实现这一点。这意味着网络的预测不只以先前的音频样本为条件,也以我们想要它说的文本为条件。 如果我们在没有文本序列的情况下训练网络,它仍能生成语音,但现在它需要编造它所说的内容。 注意,非语音声音,比如呼吸和动嘴产生的声音,有时也会被 WaveNet 生成。这反映出了原音频模型的更强大的适应性。就像你能从这些样本中听到的那样,一个简单的 WaveNet 能够学习许多不同声音的特性,不论男性女性。为了保证它知道使用给定话语的哪些声音,我们将对说话者的识别作为该网络的条件之一。有趣的是,我们发现在多个说话者中建模一个说话者的训练要比单个说话者的训练更好,表现出了一定形式的迁移学习(transfer learning)。 通过改变说话者身份,我们能使用 WaveNet 用不同的声音说同样的事,语音片段省略。 类似地,我们能为模型提供额外的输入,比如情绪或口音,使得语言更加多变且有趣。 **制造音乐** 因为 WaveNet 可被用于建模任何音频信号,我们认为用它来生成音乐也会很有意思。和 TTS 实验不同,我们没有调节该网络的输入序列,以告诉它该播放什么(比如,一个音乐评分);相反,我们只是让它生成任何其想生成的东西。当我们在一个古典钢琴曲的数据集上训练它时,它产出了一个如下的让人惊叹的样本(此处音频省略,可以看后文实践生成的音乐)。 WaveNet 为开启了 TTS、音乐生成和广义上的音频建模的大量可能。可以使用深度神经网络一个时间步骤一个时间步骤地直接生成在所有的 16 kHz 音频上都是有效的,这个事实非常让人惊讶,更不要说其表现还优于当前最佳的 TTS 系统。我们很高兴看到下一步我们能用它来做什么。

原理

WaveNet利用真实的人类声音剪辑相应的语言语音特征来训练其卷积神经网络(convolutional neural networks),让其能够辨别这两方面(语言和语音)的音频模式。使用中,对WaveNet系统输入新的文本信息,也即相对应的新的语音特征,WaveNet系统会重新生成整个原始音频波形来描述这个新的文本信息。

该网络可基于所有给定的样本和可能的额外参数的条件下,通过建模条件概率(conditional probability)来生成音频波形的下一个样本。
在一个音频处理步骤之后,其输入波形会被量化到一个固定的整数范围内。然后这个整数振幅(integer amplitudes)会被独热(one-hot)编码以生成一个形状的张量(num_samples, num_channels)。
每个卷积层只能获得当前和之前的输入,然后减少信道维度(channel dimension)。
该网络的内核被构建为一个因果扩张层(causal dilated layers)的堆叠,其中每一层都是一个扩张的卷积(dilated convolution,即带有 hole 的卷积),它只能获取当前和过去的音频样本。
所有层的输出通过一系列密集的后处理层(postprocessing layers)被结合起来并扩展回原来的信道数量,后面再跟上一个 softmax 函数将这些输出转换成一个分类分布(categorical distribution)。
其损失函数是每个时间步骤的输出和其下一个时间步骤的输入之间的交叉熵(cross-entropy)。
在这个 repository 中,该网络的实现可以在 wavenet.py 文件中找到。

安装和生成

1.wavenet
wave介绍
先用一个短视频介绍一下wavenet效果
http://v.qq.com/x/page/w0328zc2azc.html

2.下载tensorflow-wavenet
读者自己先配置好tensorflow
git clone –recursive https://github.com/ibab/tensorflow-wavenet

3.代码目录
wavenet_params.json 这是配置模型的一些相关参数

4.安装依赖包
注意,需要先安装TensorFlow,且版本要在TensorFlow 0.10及其以上,0.8版本的坑,我踩过了,在读取参数的时候,会出现参数数量不匹配的错误。请务必注意,TensorFlow的版本。
此外,还需要安装librosa,以支持音频的读写操作。除了TensorFlow需要自行安装之外,其他的安装依赖可以通过以下命令行完成。

pip install -r requirements.txt

5.下载语料库
语料库有10个g,解压后有12个g左右,请预备好足够的空间,机器不太行的可以忽略此步。
VCTK-Corpus.tar.gz
语料库的介绍

5.准备语料
我在这里选择一小段的钢琴语料做训练,piano_sample.wav。当然也可以采用上述语料库中的其他音频。注意,这里只支持wav格式的音频。
cd tensorflow-wavenet
mkdir corpus #corpus #用于存放多个训练的.wav文件

6.开始训练
查看各个参数的含义:

python train.py --help #--batch_size,--num_steps,--learning_rate等等参数

开始训练:

python train.py --data_dir=corpus  --logdir=logdir

如果采用默认的参数:
python train.py –data_dir=corpus –logdir=logdir进行训练的话,个人经验,大约8个小时以上。(在虚拟机下面,4G内存,双核处理器)。
wavenet_params.json文件则是用以配置模型参数,在训练和生成过程中,该模型参数需要一致。
训练过程截图:
这里写图片描述

7.模型
训练过程中在logdir有train文件,train文件里有会生成训练model。
如下图所示:
这里写图片描述

8.生成模拟声音
用generate.py脚本和对应的模型生成模拟声音。这些模型在训练的时候,生成于logdir文件夹下。参数 --samples指定生成的音频样本数量(16000相当于1秒,此为默认的缺省值)。--wav_out_path 指定生成音频的位置。在其之后增加附加参数--save_every 参数则可以实现对正在进行的wav文件,每n个样本保存一次。
python generate.py –wav_out_path=generated.wav –samples 160000 ./logdir/model.ckpt-xxx #–samples 16000 16000相当于1秒
默认的生成方式是最快的,其实现是基于 Fast Wavenet库。从上述链接可以查看具体的实现逻辑。该方法生成的音频所需要的时间,大概可以缩短到几分钟之内。
如果不采用快速的方式的话:

python generate.py --samples 16000 model.ckpt-1000 --fast_generation=false

生成结果截图:
这里写图片描述

9.本次训练的效果放在附件
测试数据1:
piano_sample.wav #样本
generated.wav #生成模拟声音
下载地址:
训练数据和产生的声音

测试数据2:
有歌手唱的非纯曲调音乐,比如训练的是李宗盛、林忆莲 - 当爱已成往事.wav
对于训练模型进行生成,生成的是带有强烈杂音的。不像纯音乐生成的音乐是纯粹的音乐。所以,是需要先将人声去除,用纯曲来进行训练。
下载地址:
带有和声的训练数据和生成结果

第二部分 文本转为语音

文本转语音(TTS)。当被应用于文本转语音时,该系统可以得到当前最佳的表现,人类听众评价它在英语和汉语上比当前最好的参数(parametric)和拼接(concatenative)系统所生成的音频听起来都显著更为自然。
【有待补充!尚未进行】

本文项目地址:
https://github.com/ibab/tensorflow-wavenet
https://deepmind.com/blog/wavenet-generative-model-raw-audio/
https://github.com/Zeta36/tensorflow-tex-wavenet

拓展项目地址
https://github.com/llSourcell/Music_Generator_Demo/blob/master/README.md

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐