Facebook最近放出了一个音频生成模型Melnet,效果惊艳,大家可以到官方博客去听一下demo:https://sjvasquez.github.io/blog/melnet/
原文链接:MelNet: A Generative Model for Audio in the Frequency Domain
摘要
在音频波形上面捕捉高抽象度的结构比较困难,原因是一秒的音频包含几万个timesteps。但是在二维的时频表征上可以很好的捕捉长时依赖,例如频谱图。通过利用这种表征方法的优势,结合一个更具表达力的概率模型和多尺度生成步骤,作者提出了可以生成高保真音频的模型,并且可以捕捉长时结构。这个模型可以用作多种音频生成任务,包括非条件语音生成,音乐生成,文字到语音的合成,并且在这些任务上与以前的方法相比都有所提升。
1. 介绍
频谱图在时间轴上比波形要紧凑一个数量级,波形图上几万个时间步,在频谱图上只要几百个时间步就够了。所以使用频谱图可以捕捉更长的依赖。
但是,目前使用频谱图的模型存在音频保真度低的问题,因为音频的保真度与局部结构有关,使用频谱图可以更好的捕捉全局结构,但是相对就减弱了捕捉局部结构的能力。这就导致模型产生的频谱图的失真和过度平滑的人工痕迹问题。为了解决信息丢失问题,作者使用了原始分辨率的频谱图。而为了解决过度平滑,作者使用了具有高度表达力的自回归模型,对于时间维度和频率维度的分布都建模分析。
作者使用了多尺度的方法,由粗到细的生成梅尔谱。首先生成一个低分辨率,下采样过的梅尔谱,用它来捕捉高层的结构,然后反复迭代上采样过程来添加高分辨率细节。
2. 预备工作
这一节主要讲了一下mel谱表示法。另外作者说了一下如何提高mel谱的分辨率:要在时间轴上提升分辨率可以降低STFT的hop size,要在频率轴上提升分辨率可以增加mel频道(mel滤波器个数)。另外讲频谱图转换回时域信号,作者尝试了两种方法,Griffin-Lim[18]和基于梯度的转换算法[10],最终发现后者效果较好。
3. 概率模型
作者使用一个自回归的模型将频谱的联合分布分解成了条件分布的积。我们定义 x < i j x_{<ij} x<ij为 x i j x_{ij} xij之前的元素, i i i表示第几帧,按照时间顺讯, j j j表示频率的索引,顺讯是从低频到高频。联合分布的分解如下:
其中 θ i j \theta_{ij} θij是 x i j x_{ij} xij的单变量概率密度参数。我们认为每个因子分布是一个包含 K K K个组分的混合高斯分布。所以 θ i j \theta_{ij} θij包含 3 K 3K 3K个参数分别对应每个组分的均值 μ \mu μ,方差 σ \sigma σ和系数 π \pi π,所以最终的分布可以用如下的公式表示:
根据前人的研究[4]和[15], θ i j \theta_{ij} θij可以建模成一个神经网络的输出,看作一个关于 x < i j x_{<ij} x<ij的函数来计算。精确的来说,对于某个参数为 ψ \psi ψ的神经网络 f f f: θ i j = f ( x < i j ; ψ ) . \theta_{ij}=f(x_{<ij}; \psi). θij=f(x<ij;ψ).网络参数的最大似然估计可以通过以负的log-likelihood为损失的梯度下降计算。
为了保证网络输出的参数是合法的混合高斯模型。神经网络先计算一系列的未加限制条件的参数,然后在经过如下的变换(右边是网络输出参数,左边是经过变换的参数),这样就保证了标准差是正,并且系数和为1。
4. 网络架构
作者说模型架构参考了[45,49,48,5,41,36,7]这几篇文章。这些模型根据图片的空间轴逐像素的估计分布。本文跟这些模型的一个巨大区别是频谱图上沿着频率轴的平移不具备不相关性,所以无法使用2D卷积。另外根据[32,40],用多维循环网络对频谱图建模比用2D卷积更有利。所以作者全部使用循环架构。
类似Gated PixelCNN[48],网络是多stacks结构,这些stacks从输入的不同部分提取特征最终聚合成整个context x < i j x_{<ij} x<ij:
- time-delayed stack 计算并聚合所有前面帧的信息, x < i , ∗ x_{<i,*} x<i,∗
- frequency-delayed stack 使用当前帧前面元素的信息 x i , < j x_{i,<j} xi,<j,同时还使用了time-delay stack的输出,这样就使用了整个context x < i j x_{<ij} x<ij
这些stacks在网络的每一层互相连接,每层中time-delayed stack产生的特征会被当前层的frequency-delayed stack所使用。为了训练更深的网络,两个stacks都用了残差连接。最后一层的frequency-delayed stack被用来生成无约束参数 θ ^ \hat{\theta} θ^。下面这张图帮助大家理解,蓝色的箭头是time-delayed stack的循环连接,绿色的是frequency-delayed的循环连接,红色是层与层之间的连接(具体看figure 3)。具体的循环公式请看下文。
4.1 Time-Delayed Stack
time-delayed stack 使用多层多维RNNs来从 x < i , ∗ x_{<i,*} x<i,∗中提取特征。每个多维RNN由3个一维RNNs组成:一个沿着频率轴正向,一个沿着频率轴反向,一个沿着时间轴。参考图2,time-delayed stack的输出为这三个RNNs输出的级联(concatenation)。
作者使用 F l t \mathcal{F}^t_l Flt来表示第 l l l层的time-delayed stack的函数计算。在每一层,time-delayed stack使用上一层的特征图 h t [ l − 1 ] h^t[l-1] ht[l−1]来计算随后的特征图 F l t ( h t [ l − 1