作者yoyololicon (萝莉大好)
看板DataScience
标题[徵文] FFTNet(含实作)
时间Sun Aug 12 21:55:05 2018
小弟之前没接触过这类autoregressive model,可能用语会不太精确
请鞭小力点> <
Abstract
FFTNet: A Real-Time Speaker-Dependent Neural Vocoder
这是一篇发表在今年icassp 2018的paper,其提出了一个由WaveNet衍生出来的model--
FFTNet,且做了两点改进:
1) 加快了生成速度,甚至可以realtime的生成
2) 产生的audio听起来比WaveNet更自然
论文以及audio档试听:
http://gfx.cs.princeton.edu/pubs/Jin_2018_FAR/index.php
I. Introduction
自从WaveNet问世後,大家发现直接用CNN合成waveform是可行的,在许多task也有不少成
功的例子(很多citations~)。但WaveNet最为人诟病的就是大量training时间以及非常慢的
生成速度。如果换成如mcc这样的acoustic feature,则training时间可以缩短;运算时间
上也有许多加速的方法。
FFTNet使用更简单的架构与更少的参数量,把生成的时间压到更低,使realtime生成变为
可行(摸斗嗨雅苦~)。
II. Method
2.1 WaveNet vocoder
这里大概讲述了WaveNet的架构,基本架构是多层dilated causal CNN,其dilation随着深
度指数成长,如下图:
https://i.imgur.com/Dtdz5Zz.jpg
随着层数(L)的加深,WaveNet能看到的sample数量会指数增加(2^L)。而每一层的output z
可以表示成一个gated架构
z = tanh(W_f *d x + V_f *d h) ⊙ sigmoid(W_g *d x + V_g *d h)
在这里x代表前一层的output,W_f和W_g分别是filter和gate的convolution kernels,
V_f和V_g则是对h (auxiliary condition)做convolve的1x1 kernels。最後再对z做1x1
convolution才是final output。加上skip connections、一些conv1x1和relu後接一个so-
ftmax,去predict当前sample的256个quantized後的值。
每次forward只能生出一个sample,速度hen慢,即使是加了cache的Fast WaveNet,每秒也
只能生200个samples。
2.2 FFTNet architecture
从WaveNet的图可以发现,和预测的sample相关的node连起来就像是个二元树,让人联想
到经典的演算法--FFT。FFT使用了divide and conquer的概念,将input分成更小段的子
input去做DFT。
N-1
令Σ x_n*e^(-2*pi*i*n*k/N) = f(n, N)
n=0
则f(n, N)可拆解成
f(2n, N/2) + f(2n+1, N/2)
=f(4n, N/4) + f(4n+1, N/4) + f(4n+2, N/4) + f(4n+3, N/4)
=...
如果我们将转换function f 换成 1x1 convolution,则会得出一个类似FFT的模型。
http://gfx.cs.princeton.edu/pubs/Jin_2018_FAR/fftnet.png
也就是将输入的讯号分成左右两边,各自做1x1 convolution再相加。
z = W_L * x[:N/2] + W_R * x[N/2:]
而gated的部分就用简单的relu代替,所以下一层layer的input
x = Relu(conv1x1(Relu(z)))
如果加上auxiliary condition,则
z = ... + (V_L * h[:N/2] + V_R * h[N/2:])
V_L和V_R也都是1x1 kernel。
※如果h不会随时间变化,则可以用一个weight V * h 取代。
将FFTNet当vocoder使用的时候,h就是f0和MCC。要生成当前时间t的sample x[t],FFTNet
的输入为之前生的N个sample x[t-N:t] (N = 2^L, L为model深度) 和往前一个step的fea-
ture h[t-N+1:t+1]。
最後接一个大小256的fully connected和softmax就完成惹。
2.3 Training Techniques
这边提了几个训练FFTNet和生成samples时需要的技巧。
2.3.1 Zero padding
训练时每段samples的前面多pad N个zeros。如果没加zero padding,model在生成时容易
有杂音,或是input非常微弱时会卡住。
2.3.2 Conditional sampling
选择softmax的output通常有两种方式,一种是argmax一种是random sampling from post-
terior。argmax可以选择出最小training error的答案,但是我们希望model的输出也有原
训练资料本身自然的noise distribution,例如没有人声时的waveform。於是采用random
sampling,并在有人声的部分於softmax前多乘上一个常数c,使distribution比较sharp;
没人声的部分就是原本的distribution。实验时c=2。
2.3.3 Injected noise
因为training error,model的output都会有一些noise,而生成的这些output都会喂回去
当作下个sample的input,於是noise越来越大,最後生出来的音档就会有啪嚓声。在训练
时加入noise可以加强model的稳定性。实验时观察到model的prediction常常只差上下一个
class,所以训练加的noise为平均值0,标准差1/256的高斯分布。
2.3.4 Post-synthesis denoising
由於前一阶段injected noise使model产出的sample在人声部分都有一点noise,於是作者
使用spectral subtraction noise reduction 当作post processing。这好像是高等DSP
才会教的东西,我也没有细看> <
3. Evaluation
作者用CMU Arctic dataset来训练model,详细的实验设定与细节就不多说惹。
总共比较了五种model:
1. MLSA filter (baseline)
2. WaveNet + zero-padding
3. FFTNet + zero-padding
4. WaveNet + all 2.3 techniques
5. FFTNet + all 2.3 techniques
实验时WaveNet和FFTNet的receptive field都一样(2048 samples)。
在主观测试中,加了所有2.3部分的FFTNet表现比原本好上许多,并且和WaveNet不相上下
,代表这些小撇步对FFTNet是需要的;而分数也显示2.3的techniques一样能improve Wav-
eNet的表现。
而作者也提到FFTNet在一颗i7的cpu上,只要0.81秒就能生出一秒长度的音档Σ(;゚д゚)
4. Conclusion
提出了一个简单且能快速生成audio的架构,并结合一套训练与post processing的技巧,
使这样简单的Model在当成vocoder时,能产生出state of the art的结果;而这些技巧也
能改善WaveNet的结果。
----
个人心得:
心得不知道要写甚麽,就来写点我对FFTNet的理解,还有一些疑问与实作上的问题ㄅ
在FFTNet架构的部分,如果把两个1x1的kernel结合,形成一个大小1x2,dilation=N/2的
kernel,则架构图可以重新表示成
https://i.imgur.com/NWfSTpz.png
如果将所有的node画出来
https://i.imgur.com/Vsotxec.png
再从反方向走回去
https://i.imgur.com/rAINJYk.png
就得到一个上下颠倒的WaveNet架构。
换言之,FFTNet是WaveNet的transpose,而且拿掉gated和skip connections。如果真是这
样,我觉得作者其实应该要放一个原本Wavenet dilated架构,但全部只有convolution和
relu的模型来比较。而且这样来说两个的complexity应该相去不远,那为甚麽FFTNet可以
做到real-time?实作时我生成的速度大约是每秒300个samples(有cache),跟WaveNet比虽
然快,但完全没有到realtime的程度。而github上我看其他人也差不多是这个速度。
这是我目前最大的疑问qq
鲁鲁有自己implement FFTNet放在github,还在施工中,不过目前生出来的sample大概跟
作者网站上原始的FFTNet差不多,也欢迎大家来逛逛我的repo~
https://github.com/yoyololicon/pytorch_FFTNet
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.241.48.227
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1534082114.A.474.html
1F:推 yiefaung: 推个 顺便问个real time要每秒几个sample 08/14 00:50
2F:→ yoyololicon: 至少16k 08/14 06:45
3F:推 joeyccc1: 每秒16k 高频就只能到8kHz 08/18 16:36
4F:→ yoyololicon: 对,处理语音资料这样就很够惹 08/19 09:37