Flowavenet:A Generative Flow for Raw Audio

1.abstract&&introduction:

现有的TTS大部分用wavenet作为解码器合成语音,但是显著的缺点在于slow auto-regressive sampling scheme,因此难以在实时应用中用起来。Kingma等对此改进提出IAF(inverse auto-regressive flow),可以实现并行化采样,实现了实时合成,这种方法不仅需要一个概率蒸馏(probability distillation)预训练t的eacher网络,而且需要额外的loss作为辅助项。如果仅仅使用概率蒸馏损失 ,student网络会收敛到teacher特殊分布的一种情况,产生一个次优的性能。

本文提出一个基于flow的生成网络FloWaveNet,仅仅需要一个最大似然损失,就可以稳定的训练,并行化的生成高质量的语音。因为flow transformation的特征,模型本身就具有并行化的特性。可以在TTS的语音合成中作为wavenet的完全替代品。

作者直接开放了源代码以及生成语音:https://github.com/ksw0306/FloWaveNet

2.FloWaveNet

单独一个网络,多个context block模块,每个模块中包含多个可逆变换。

2.1. Flow based generative model

这部分主要参考“NICE: Non-linear Independent Components Estimation“实现

用一个假设的分布通过函数去模拟实际语音信号的分布,的分布是已知的,建模这个函数

z用于模拟表示x的分布情况 ,z的分布是先验已知的,训练得到,然后求逆得到,就可以通过输入随机采样得到信号。

公式中的改变项–jaccobi行列式也是一个条件分布。wavenet将mel谱作为局部条件c,实际是条件概率的预测

只有在满足这两个条件的时候,并行采样才可以实现

(1)转换函数的jaccobi矩阵是容易计算的;

(2)可逆函数容易计算,逆函数是希望得到的生成模型 ;

为了使得函数f满足 这两个条件,用多个wavenet的affine coupling layers组成的 flow operation堆叠完成这个建模过程。

行列式的计算比 函数求逆更难一些,因此先从求jaccobi行列式出发。又因为三角行列式等于对角线元素的乘积这一特性,想办法把函数的jaccobi矩阵转成三角矩阵。

2.2. Affine Coupling Layer

RealNVP提出的affine coupling layer可以满足以上的2个要求,affine layer在保持了函数双向变化的同时维持了并行采样的可行性。每一层的参数变化都是,保留一半通道的数据直接输出,将另一半送到下一层。

正变换过程

在这里插入图片描述

反变换过程(双射变换 )
在这里插入图片描述
m和s是共享的神经网络,由wavenet的dialted conv生成。满足了(2)f函数的可逆性

jaccobi矩阵是下三角形,由对角矩阵元素组成,满足(1)jaccobi矩阵容易计算。

change order操作就是在每个flow之前,将和交换,随机打散,确保在接下来的flow操作中,各个通道的数据彻底融合。

2.3. Context Block

是FloWaveNet的核心部分,squeeze将时间维度减半,channel加倍,这个操作也使得感知野加倍,类似于wavenet的dialted conv。upper-level的模块可以建模长时信息,lower-level的模块可以建模高频信息。flow操作包括activation normalization、affine coupling layer,change order。

2.4. Activation Normalization

实际上就是对输入batch的数据的归一化处理,减均值除方差。目的是使得多层flow的网络训练变得稳定。
在这里插入图片描述

==这个图非常非常重要!!==是整个网络model的核心说明

  • 输入x,c,首先进行squeeze操作,将x,c的由原来的 ( b s , n c h a n n e l , T ) (bs,n_channel, T) bs,nchannel,T变成 ( b s , n c h a n n e l ∗ 2 , T / 2 ) (bs, n_channel*2, T/2) (bs,nchannel2,T/2)
  • 进入flow流
  • Actnorm : 首先将x的各个维度数据进行归一化,0均值,1方差
  • AffineCoupling : 仿射耦合变换
    将(x,c)各自分成两块 ( x a , x b ) (x_a, x_b) xa,xb), ( c a , c b ) (c_a, c_b) (ca,cb),然后做正变换

参考:
【1】细水长flow之NICE:流模型的基本概念与实现
https://kexue.fm/archives/5776
【2】细水长flow之RealNVP与Glow:流模型的传承与升华
https://kexue.fm/archives/5807

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值