端到端合成论文——声学模型——Tacotron

端到端合成论文——声学模型——Tacotron

==Wang, Yuxuan, et al. “Tacotron: Towards end-to-end speech synthesis.” arXiv preprint arXiv:1703.10135 (2017).== Google citations: 1430

知乎 Tacotron&Tacotron2——基于深度学习的端到端语音合成模型

语音合成-从入门到放弃.pdf 第 5 章 声学模型

解决什么问题
  • 语音合成有很多组件(pipelines)(前端文本处理、声学模型、声码器)(multi-stage model),通常构建、设计这些组件难度较高。而一个集成的端到端TTS系统(single model)有很多好处:
    • 可以减轻了费力的特征工程的需要;
    • 可以用更多的属性、特征(比如说话人id特征、语种特征、情感特征),因为可以在模型输入用这些特征,使得整个模型都有这个特征信息,而不是只在某些component用到,其他component没用到;
    • 适应新数据也可能更容易;
    • multi-stage model的每个component都可能会出错(预测错),只要一个组件错误,就会影响整个系统的,使得整个系统的出错可能性比起single model来得更高;
用了什么方法
  • 提出端到端语音合成模型,直接从characters 合成语音,该模型叫 tacotron。只要给<文本,音频>训练对pair,就能训练得到一个效果较好的语音合成器。逐帧生成语音(帧级别),因此比样本级别自回归方法生成语音来得快得多。
效果如何
  • 直接输入的是文本characters,直接预测输出的是逐帧的音频谱raw linear spectrogram;

  • 英语MOS分3.82,自然度naturalness方面优于工业上的参数系统;

  • 很好训练,随机初始化去训练就能得到不错的模型;

  • 改进了原始端到端结构(vanilla seq2seq paradigm )

存在什么问题
  • 效果相比于wavenet没有明显提升;

模型总体结构

输入文本characters(不是音素序列,是字符序列),输出预测的逐帧的谱 raw linear spectrogram。

模型总体结构包括一个encoder,一个attention-based 的 decoder,一个后处理网络post-processing net;

image-20221107153002024

image-20221108170533821

ENCODER

输入文本序列characters,one-hot -> embedding -> pre-net -> CBHG module -> attention

Encoder pre-net

输入character序列,做embedding,经过非线性变换(激活函数),经过dropout,bottleneck层(加速收敛,减少过拟合,提高泛化性);

CBHG MODULE

CBHG是conv bank highway gru

CBHG模块作为encoder的其中一部分,提取pre-net的输出序列(一些非线性变换后的特征),到更高阶特征;

CBHC模块包括一组一维卷积,然后残差连接,然后highway层,作为双向GRU的输入;

1-D convolutional filters 一维卷积

作用类似unigram、bigram,K-grams,用来提取上下文信息,提取局部信息;

实现是用$K$个滤波器,其中第$k$个滤波器长度是$k$;举例:$k=1$,只卷当前的字符;$k=2$,卷前后两个字符;$k=K$,卷前后范围$K$个字符,因此就是一组滤波器长度不一样的卷积组;

每个滤波器卷积都对应一个输出(步长为1(保持原始的时间分辨率)),把所有滤波器卷积输出都堆叠(stack)在一起,相当于提取了不同范围上下文信息了(multi-scale那意思);再沿着时间轴做max-pooling,相当于做了smooth平滑操作,让相邻帧更像一点;

highway networks (Srivastava et al., 2015)

image-20221108104125133

DECODER

自回归

image-20221108173745272

Decoder RNN

输入是 Attention RNN的输出 和 context vector 拼接起来的向量,经过GRU,得到输出;

而context vector来自Attention RNN的输出作为query,encoder作为key,做attention操作得到的向量;

预测输出是80维的mel谱。不是直接输出频谱spectrogram,因为波形谱的可能性很多,size很大,256维?生成很耗时,而mel-spectrogram虽然损失了信息,但是相比spectrogram就小了很多,且由于它是针对人耳来设计的,因此对最终生成的波形的质量不会有很多影响。

==每个decoder step,不是预测一帧,而是预测多帧!输出多帧,并且是不重叠的帧;==这样做的好处是可以大大缩减计算量(不减少的话,一个样本得输出几百帧),并且发现可以加速模型收敛(因为用的RNN预测,RNN对于几百帧的输出不友好,对于较少帧数的输出比较友好,并且帧数长了,产生需要的时间也是线性增加的);每次预测r帧,decoder的序列长度变为1/r长;

==推理过程开dropout==模拟推理过程可能出错的情况!!不是每次都用RNNR概率最大的那个值,而是需要增加随机性;(其他比如GPT2,是通过在输出的概率分布的采样,来作为输出,来增加随机性);

怎么知道合成完了?通过一个二分类器(输出一个标量数值,通过阈值判断),每次把RNN输出送进分类器,判断是否结束;

image-20221108174036419

post-processing network and waveform synthesis

输入整个mel谱序列,通过decoder的non casual CBHG生成linear-scale spectrogram,linear spectrogram和waveform相比只少了一个phase信息(只差一个linear transform),因此不用很强的再后处理(vocoder),只用一个较为简单的Griffin-Lim algorithm,来增加相位信息,输出幅度谱;

用Griffin-Lim algorithm 进行相位估计,然后做逆短时傅里叶变换(STFT);

decoder CBHG可以替换成其他module来生成其他东西,比如换成wavnet那样的vocoder,就是直接输出波形了;

之所以需要post-processing,而不是靠RNN来输出linear spectrogram,是因为RNN是从前向后的(单向)(预测到某一个step时,可能发现前面预测错了,但是没法改了),然后加一个CBHG,可以看从前向后和从后向前的信息,这样会更好;

两个loss,都要最小化

image-20221108174727511

这里voceder理解成不在主模型外的,是单独的一个模块(单独训练好的);

细节参数

模型参数

image-20221108110927345

训练参数

评价

tacotron相比于wavenet,主要是在输入上需要的信息少了,也能起到好的效果,这对于人们训练一个语音合成系统减少了很多工作量,输入只要字符序列就可以了(训练时只要字符序列和音频pair);


==Shen, Jonathan, et al. “Natural tts synthesis by conditioning wavenet on mel spectrogram predictions.” 2018 IEEE international conference on acoustics, speech and signal processing (ICASSP). IEEE, 2018.== citations:1958

解决什么问题

-

用了什么方法
  • 提出Tacotron2,在tacotron基础上输出mel谱,再用改进的wavenet vocoder来生成波形;
效果如何

-

-

存在什么问题

-

模型结构

主要有两部分组成,Spectrogram Prediction Network 和 WaveNet Vocoder 。

Spectrogram Prediction Network类似tacotron的结构,然后把tacotron的decoder重的CBHG替换成了wavenet vocoder;

image-20221108123420015 image-20221109102922783

Spectrogram Prediction Network

可以理解为声学模型

encoder

输入字符序列 👉 embedding(512维) 👉 固定滤波器长度的卷积(512个滤波器,滤波器长度5*1,3层卷积,(每次看5个character)) 👉 BN ReLu 👉 BLSTM

这里没有采用tacotron1中的CHBG模块,也能取得好效果,看来卷积滤波器长度变化不是特别重要?

再送入注意力机制生成编码向量,这里用的是location-sensitive attention(LSA)位置敏感注意力,该注意力机制的对齐函数为:
$$
\operatorname{score}\left(s_{i-1}, h_j\right)=v_a^T \tanh \left(W s_{i-1}+V h_j+U f_{i, j}+b\right)
$$
其中, $v_a, W, V, U$ 为待训练参数, $b$ 是偏置值, $s_{i-1}$ 为上一时间步 $i-1$ 的解码器隐状态, $h_j$ 为当前时间步 $j$ 的编码器隐状态, $f_{i, j}$ 为上一个解码步的注意力权重 $\alpha_{i-1}$ 经卷积获得的位置特征, 如下式
$$
f_{i, j}=F * \alpha_{i-1}
$$

其中,$\alpha_{i-1}$是经过 softmax 的注意力权重的累加和。

decoder

自回归循环神经网络,每个step输出一帧

pre-net :2层FC + relu,作为信息瓶颈对学习注意力至关重要;

pre-net输出 和 attention context进行拼接,作为LSTM的输入;

LSTM输出再与 attention context进行拼接,通过线性变换进行投影,来预测一帧的target谱;

LSTM 的输出用来计算新的编码向量,最后新计算出来的编码向量与 LSTM 输出做拼接,送入映射层以计算输出。 ?

(attention context在decoder中用了两次)

输出有两种形式,一种是频谱帧,另一种是停止符的概率,后者是一个简单二分类问题,决定解码过程是否结束。为了能够有效加速计算,减小内存占用,引入缩减因子 r(Reduction Factor),即每一个时间步允许解码器预测 r 个频谱帧进行输出。解码完成后,送入后处理网络处理以生成最终的梅尔频谱;
$$
s_{f i n a l}=s_i+s_i^{\prime}
$$
其中, $s_i$ 是解码器输出, $s_{\text {final }}$ 表示最终输出的梅尔频谱, $s_i^{\prime}$ 是后处理网络的输出, 解码器的输出经过后处 理网络之后获得 $s_i^{\prime}$ ;

预测的target谱(mel谱)经过post-net(5层卷积),生成频谱帧;

image-20221109104613410

推理时,对decoder的pre-net开dropout!(本来网络里这个地方没有加dropout的,但是在推理过程中加了!)目的是为了在推理时输出能有变化;

没有用tacotron1中的reduction factor ($r$)

WaveNet vocoder

在 Tacotron-2 原始论文中,直接将梅尔频谱送入声码器 WaveNet 生成最终的时域波形。但是 WaveNet 计算复杂度过高,几乎无法实际使用,因此可以使用其它声码器,比如 Griffin-Lim、 HiFiGAN 等 。

  • [TODO] [声码器还不是很懂,这块还要再看一下]

loss function

  1. 进入后处理网络 post-net **前后 **的平方损失mse loss:

$$
MselLoss =\frac{1}{n} \sum_{i=1}^n\left(y_{\text {real }, i}^{\text {mel }}-y_{b e f \text { ore }, i}^{\text {mel }}\right)^2+\frac{1}{n} \sum_{i=1}^n\left(y_{\text {real }, i}^{\text {mel }}-y_{a f \text { ter }, i}^{\text {mel }}\right)^2
$$

​ 其中,$y_{\text {real }, i}^{\text {mel }}$ 表示从音频中提取的真实频谱 ,$y_{b e f \text { ore }, i}^{\text {mel }}$, $y_{a f \text { ter }, i}^{\text {mel }}$ 分别为进入后处理网络前、后的解码器输出,$n$ 为每批的样本数。

  1. 从 CBHG 模块中输出线性谱的平方损失:

$$
LinearLoss =\frac{1}{n} \sum_{i=1}^n\left(y_{\text {real }, i}^{\text {linear }}-y_i^{\text {linear }}\right)^2
$$

​ 其中, $y_{\text {real }, i}^{\text {linear }}$ 是从真实语音中计算获得的线性谱, $y_i^{\text {linear }}$ 是从 CBHG 模块输出的线性谱。

  1. 停止符交叉熵
    $$
    StopTokenLoss =-[y \cdot \log (p)+(1-y) \cdot \log (1-p)]
    $$

    其中,$y$为停止符真实概率分布, $p$ 是解码器线性映射输出的预测分布。

  2. $L2$ 正则化??
    $$
    RegulationLoss $=\frac{1}{K} \sum_{k=1}^K w_k^2
    $$
    其中$K$ 为参数总数, $w_k$为模型中的参数,这里排除偏置值、 RNN 以及线性映射中的参数。

    最终的损失函数为上述 4 个部分的损失之和,如下式:

$$
Loss = MelLoss + LinearLoss + StopTokenLoss + RegulationLoss
$$

实验结果

wavenet最好是用tacotron产生的谱作为输入进行训练,会比用真实谱进行训练的效果好(让wavenet知道tacotron产生的谱长什么样,才能得到最好的结果);

image-20221108175319842