开启辅助访问
 找回密码
 立即注册

[细读经典]HiFi-GAN for TTS vocoder

wlhwww888 回答数3 浏览数1015
前言/简介


注意,HiFiGAN是负责从”梅尔谱“转语音信号的。
如果是文字转”梅尔谱“,则需要类似tacotron2,fastspeech1/2这样的模型。

刚才也在资深看到一台同样介绍HiFi-GAN的:

这个坑是2021年10月份挖的,终于在每日娱乐闲逛刷视频之余,抽出时间学下这个HiFi-GAN了。
这是发表在NeurIPS 2020上的文章。
小二,上酒~~



韩国的大神的作品,感觉最近几年,无论是neurips或是iclr, icml等,韩国总有不少不错的papers。牛。
这一篇是Kakao公司的,不要读成“卡靠”哈(哈哈),人家是“卡卡奥”。

萌熊,from Kakao

上面这个萌熊就是他们家的宠物了。(汗,这个感觉和line的熊很像啊。。。)

背景:

GANs已经被用于raw waveforms的生成(vocoder阶段,类似于从梅尔谱到最终的音波,声音文件的阶段)。但是:
效果上还赶不上(1)自回归vocoder,(2)流(flow)方法。
关于flow-based vocoder,我之前写过一篇nvidia的waveglow 论文的学习笔记:
新方法:

本论文提出来HiFi-GAN,其(1)高效,(2)高保真,地实现“语音合成”。
核心的点:modeling periodic patterns of an audio -> enhancing sample quality,即:对语音中的“周期模式”进行建模,从而可以提升样本质量
效果:

MOS上,可以类比人的水平!并且可以在单个V100 GPU上,生成比真实时间快167.9倍的22.05kHz的语音!也就是说,生成1秒的语音,只需要大概1/168=0.006秒的时间。这个真实太赞了!是面向实际应用的!
此外,即使是在CPU上,(缩减版的)HiFi-GAN也可以产生比真实时间快13.4倍的语音。而且这个语音的质量可以媲美“自回归模型”。

代码URL:

以及demo示例:

简介部分就先略过了。为了节省时间,直接看HiFi-GAN的牛比之处!Audio samples from "HiFi-GAN: Generative Adversarial Networks for Efficient and High Fidelity Speech Synthesis"简介部分就先略过了。为了节省时间,直接看HiFi-GAN的牛比之处!
HiFi-GAN


概要

一台生成器,两个判别器
一台判别器负责multi-scale,多刻度
一台判别器负责multi-period,多周期
生成器和两个判别器是通过对抗学习的方法训练的,新增加了两个损失函数来提高训练的稳定性和提高模型的性能。

生成器


生成器是一台“纯的”卷积神经网络。输入是梅尔谱,然后一直用卷积(transposed convolutions)来上采样,一直到输出的序列的长度和原始波形的时域分辨率相同为止。
每个transposed convolution的后面,接的是一台multi-receptive field fusion (MRF)【多感受野融合】模块。
下图是生成器的示意图。注意,白噪声没有作为该生成器的输入。(即,输入只有梅尔谱):

HiFi-GAN中的生成器的示意图;注意:这是在说,Dr是有三个维度,具体取值可以参考Table 5,例如[[1,1], [3,1], [5,1]])

生成器中的MRF

Multi-Receptive Field Fusion,多“感受野”融合模块。
两个要点:

  • MRF输出的是,多个残差块(|kr|个块)的输出的“相加”(上图中的那个“圆圈+”号!);
  • 每个残差块,使用不同的kernel size,以及膨胀率(dilation rates),从而构成多样的“感受野”模式。
上图中,也绘制了,第n个残差块的样子(最右边):
首先,m遍历从1到|Dr[n]|(第n个残差块的最大膨胀率);
其次,l遍历从1到|Dr[n, m]|;
然后,历经一台Leaky ReLU,和一台卷积,其kernel size为:kr[n] * 1,而且膨胀率为Dr[n, m, l](注意:这是在说,Dr是有三个维度,具体取值可以参考Table 5,例如[[1,1], [3,1], [5,1]])
最后,有个“圆圈+”的残差运算。

这里面,有几个可调节的参数:

  • 隐层维度,hu;
  • transposed卷积的核函数尺寸,ku;
  • MRF中的卷积的核函数尺寸,kr;
  • MRF中的膨胀率Dr。
这几个参数的取值,都可以根据“合成效率”和“样本质量”的平衡来进行调节。

【思考】这个MRF的设计,或是很赞的,感觉糅合了多个sizes的卷积,以及多种膨胀率,从而可以更好地从不同的窗口来提炼梅尔谱的特征信息,用于生成最后的原始音波。简单总结:“很胖”!

感觉还不过瘾。。。因为不少细节,还不清晰。
看看他们的附录A里面的图,和关于四种参数的取值的例子。

生成器的图的细化版本。把MRF的周边,绘制的更详细了。

上面是细化后的生成器的图。可以看到,把MRF的周边(前后)绘制的更加详细了。
特别是:

  • 进|ku|个模块之前的,一台7*1的卷积层,其膨胀率为1,hu个频道;
  • 出来的时候,先走Leaky ReLU;
  • 然后又是一台7*1的卷积,1个channel;
  • 最后走一台非线性激活函数,Tanh。

然后看一下四种参数的取值:

三种不同配置下的生成器,以及分别的hu, ku, kr, Dr的取值

可以看到:
其一,隐层维度,hu;这个的取值,是一台标量,例如512, 128, 以及256。
其二,transposed卷积的核函数尺寸,ku;这是一台列表集合,那么生成器中的l=1, 2,3,4,即一共四个[leaky ReLU + Transpose 卷积+MRF]的“块”,然后,每个“块”里面的卷积的kernel size的取值为16, 16, 4, 4。即:

V1配置下的生成器的展开示意图

其三,MRF中的卷积的核函数尺寸,kr;列表集合。这是“并行”三种卷积,卷积核大小分别为3,7,11。卷积之后,相加。
其四,MRF中的膨胀率Dr。这个值是三个维度为(3,3,2)的张量。
把上面两个点结合起来,并且进一步在V1配置下,展开生成器的一台MRF的构造为:

一台MRF的展开示意图,三个残差块,每一块又分别展开成三个部分,每个部分里面,又包括了“两次”“leay ReLU+卷积层”的重复

上图,是一台MRF的展开示意图:

  • 三个残差块,
  • 每一块又分别展开成三个部分,
  • 每个部分里面,又包括了“两次”“leay ReLU+卷积层”的重复。卷积层的卷积核的size,取值分别为3,5,11。膨胀系数分别为1,3,5。
  • 如此,就实现了“多感受野”下,对最初的输入的梅尔谱的特征进行建模的目的。
上面的这个图,字体太小了,分别截屏一下看看:

n=1的时候的MRF的细节展开网络结构

n=2的时候的MRF的展开

n=3的时候的MRF的网络展开

判别器

识别真实语音中的“长距离依赖”是tts中比较关键的点。
例如,一台“音素”可能持续100ms(0.1秒),这就涉及到2200个采样点的相互关联的建模的问题。也就是说,第一台采样点和最后一台采样点,都率属于这个“音素”,那么他们之间也存在所谓“长距离依赖关系”。
之前的工作,为了解决上面的长距离依赖问题,有使用扩张“感受野”的方法。
但是,本文中,关注的是另外一台问题!而这个问题目前为止还没有被好好研究对待过。
这就是,多种周期的正弦波,是合成一台语音的核心要素!(考虑傅里叶变换的时域到频域的转换!)
即:语音数据里面的多样的周期模式(diverse periodic patterns),需要被建模

故此,本文提出了MPD: multi-period discriminator(多周期判别器)。它包括几个“子判别器”,每个判别器负责一部分周期信号。
更进一步,为了更好地捕捉连续的patterns,以及长距离依赖,本文也使用multi-scale discriminator(MSD),这个是在MelGAN (Kumar+2019)里面被提出来的。【这个关于MSD的坑,neurips 2019的文章,概要如下:】

通过MPD和MSD的相结合,本文的判别器,和生成器一起,取得了更好的效果。

MelGAN 论文作者list,有斑鸠哥大神

看下MelGAN的架构(生成器和判别器的样子):

MelGAN中的生成器和判别器

这个生成器和判别器(若干个)中规中矩。生成器中主要是残差网络+上采样卷积的架构。判别器中,主要是下采样加卷积。

然后,本文使用的特征匹配Loss,在MelGAN中也更早用到了:

MelGAN中的,面向生成器的,特征匹配Loss(feature matching loss)。

判别器中的MPD


MPD是若干“子判别器”的混合。每个“子判别器”只接受一台输入语音的“等间隔的样本”(equally spaced samples? 这个是啥意思?)这个space的“周期”被给定为p【何意?】
”子判别器“设计的目的,就是捕捉一台输入语音的不同部分的不同的(区分于其他部分的)隐含的结构。
这里的周期被设置为[2,3,5,7,11],从而避免重叠。
如下图(b)所示,我们首先把一维度的长度为T=12的(例如,T个frames)原始语音信号,塑型为二维的数据,其宽度为p=3,高度为T/p=12/3=4(只不过,这里的“宽度”是行的个数;“高度”是列的个数。)。然后,在这个二维数据上应用2D卷积。

MSD和MPD的“子模块”的示意图

在应用二维卷积到这个[3, 4]的矩阵的时候,我们限制在width轴上(即宽度上)的核函数size=1,从而保证每行之间“互不干扰”。这也对应了,”独立地处理周期性的样本(process the periodic samples independently)“这个”初心“。形式化的表示就是:

右上部分,给出了k=3的时候,所谓k*1=3*1的卷积的应用范围(红色矩形框)

每个”子判别器“中,堆砌了若干【带步幅的卷积层,以及使用Leaky ReLU激活】。
随后,weight normalization应用于MPD。
通过把输入语音信号重塑为二维数据,而不是对语音的周期性信号进行采样,MPD的梯度可以被传播到输入语音的每个时间步。【也就是说,如果是采样的话,那么无法保证每个时间步都被选择,从而也无法保证每个时间步都被更新梯度】

判别器中的MSD

MSD=multi-scale discriminator,多刻度判别器
鉴于MPD只接受没有交集的(不同周期的)样本点,我们还需要引入MSD从而可以连续地评估(real/fake分类)语音序列。
MSD包括了三个”子判别器“,分别在不同的输入刻度上运算:

  • 原始语音;
  • 进行了*2 average-pool的语音;
  • 进行了*4 average-pool的语音。
如上面的图中的(a)所示。【数了一下,上图中,应该是4个点进行一次”平均池化“,那不应该是第三个”子判别器“吗?】
MSD中的每个子判别器,是若干,带步幅的,成群的卷积层,加上Leaky ReLU激活函数。
判别器的size,通过减小步幅以及增加更多的层数,来被增大。
第一台子判别器,直接作用到原始的语音信号;而且这个子判别器中没有用weight normalization(权重标准化),而是用的谱标准化(spectral normalization,Miyato+ 2018)。据报告,使用谱标准化,可以使得训练更加稳定。【赞!稳定最重要,一般训练GAN,经常出现不稳定的问题。。。】
后续的两个”子判别器“,都应用了权重标准化。

也就是说,MPD是在原始音波的无交集的采样点上执行运算;但是,MSD是在平滑后的波形上面执行运算。两者有相辅相成之妙。

MPD中的周期为p的一台”子判别器“的展开图

上图中,给出了MPD中的周期为p的一台”子判别器“的展开图。鉴于l=1,2,3,4,所以有四个”卷积+Leaky ReLU“的模块的堆积。(居然没有残差。。。)。
之后,是一台5*1的卷积,而且channels=1024。再接一台leaky ReLU和一台3*1的卷积(输出channel=1,对应了real/fake的判别)之后结束。

损失函数


判别器:真实samples分类为1,而来自生成器的分类为0;
生成器:尽量欺骗判别器,使得自个产出的波形被判定为越接近1越好。【类似于,”假钞“造的越逼真越好!】

被拆开的两个损失函数,都是期望最小化。

上面是通过注释的方式,简单解释了一下,论文中的两个损失函数。
L(D; G)是从D,即判别器,的角度来看的;
L(G; D)是从G,即生成器,的角度来看的。

梅尔谱Loss



梅尔谱损失函数,比较的是reference 语音的梅尔谱和通过生成器自动生成的梅尔谱之间的1-范数。

上面给出了,梅尔谱损失函数,比较的是reference 语音的梅尔谱和通过生成器自动生成的梅尔谱之间的1-范数。
这个损失函数,有助于生成器来根据一台输入的条件(an input condition)来合成一台真实世界的音波。并且可以稳定训练过程的早期阶段。
这个Loss只用于G,即生成器的”质量控制“。

特征匹配Loss



特征匹配Loss,对于G来说,当然是希望求和公式里面的1-范数的值,越小越好。

上面的公式中,T表示判别器中的层数。(这个有点不太好,最好用其他字母表示。。。因为前面,T已经是输入的音波的长度了。。。)

目的也是尽量让判别器在中间阶段,都不要”跑偏“:即,D的每个神经网络层都分不清”真币“和”假币“,那才对G最好了

最终的Loss



生成器的Loss是三合一;判别器的不变。

这里面有两个超参数,其中lambda_fm=2, lambda-mel=45。(45,这个有点诡异。。。)
考虑到,本文是使用了若干个(K个)判别器,那么上面的损失函数,还需要考虑多个D的情况。也就是说,我们需要在每个D出现的时候,把一台D,扩展为k=1...K个D。也就是说:

Loss的一台D被扩展为k=1...K个D的展开式。

从公式(5),(6),过滤到(7),(8)没啥难度。

实验


数据:LJSpeech data,这个是经典的英文数据了。包括13100个短的audio clips,大概24小时(单人女性)。
22kHz,而且是16-bit PCM。
sota基线包括了:

  • MoL wavenet;
  • waveglow
  • melgan
单张NVIDIA V100 GPU.

结果


精度和速度



HiFi-GAN和几个sota基线的对比,可看到,在精度和速度上都有优势!

上面的表格,给出了MOS和速度的评估。HiFi-GAN和几个sota基线的对比,可看到,在精度和速度上都有优势!
不过明显WaveNet和WaveGlow的结果,比他们的各自论文里面的结果要差一些的样子。。。

消融实验



消融实验分析,去掉MPD之后,效果下降最厉害。。。

上面的表格是消融实验分析。可以看到,MPD的作用最不能被无视!

扩展到未知speakers


VCTK数据集下,9个speakers的50个语音。

新speakers下的效果评估,HiFi-GAN已经非常接近于真实的Ground Truth了,赞一台!

可以看到,新speakers下的效果评估,HiFi-GAN已经非常接近于真实的Ground Truth了,赞一台!

端到端语音合成


效果在上面的Table 4中。
这里是用了tacotron2作为生成梅尔谱的工具。
可以看到,HiFi-GAN或是非常接近ground truth的!!!

总结和思考


本文有几个特点,一则是大量用了卷积网络,大大加快了解码速度,并且还能保证精度。
二则,提案了基于periods的MPD判别器,可以很好地对和周期相关的特征进行建模。并且引入了多刻度判别器。两者结合,MPD+MSD,效果更好。
三则,在生成器中,新增加了两个损失函数,一台是梅尔谱的相似度计算,另外一台是判别器的内部各层的特征值的比较,从而尽量保证,让判别器的各层都”犯迷糊“
最后,无论是精度或是速度,特别是参数规模,都显著好于几个sota的baselines。
本文的idea值得用!
nice work。

小二,上花生米。


码字不易,老铁们一键三联~~~ 也欢迎各种花式吐槽和拍砖。
使用道具 举报
| 来自湖北 用Deepseek满血版问问看
lanzichun | 来自上海
现在有比hifigan效果更好速度更快的模型吗
用Deepseek满血版问问看
回复
使用道具 举报
淡水血仞 | 来自北京
目前还没有发现。。。
回复
使用道具 举报
616kkkk | 来自北京
[赞同]
回复
使用道具 举报
快速回复
您需要登录后才可以回帖 登录 | 立即注册

当贝投影