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利用真实的人类声音剪辑和相应的语言、语音特征来训练其卷积神经网络(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