【Day11】 AutoVC 简介

AutoVC 框架

  • AUTOVC 就是由上图三个 model 所组成,
    1. 内容编码器 Ec(·) 产生从语音中嵌入的内容。
    2. 语者编码器 Es(·) 产生从语音中嵌入的,(这边用的是 pretrain model,也就是 D_VECTOR)
    3. 解码器 D(·,·) 产生从内容和语者嵌入的语音。

在转换和训练,这些 model 的输入是不同的。

  • (a) 训练期间:
    来源语音 (X1) 被送入内容编码器 Ec(·),来源语音的另一段声音 (X1') 送入语者编码器 Es(·),最後解码器跟内容编码器最小化 reconstruction error (见下面说明)。

  • (b) 转换期间:
    来源语音 (X1) 被送入内容编码器 Ec(·)。目标语者的语音 (X2) 送入语者编码器 Es(·),最後解码器产生转换结果。

What is reconstruction error and Why this work ?

  • 下面是在 Autovc 里头用的 loss function

其中

  • reconstruction error 就是经过 Decoder 後的预测输出跟真实的 MSE。

  • content error 则是把经过 Decoder 後的预测输出丢进 Encoder 然後跟把真实也的丢进 Encoder 後的输出做 MAE

写出来的话就像这样

    encoder_out = encoder(x)
    decoder_out = decoder(encoder_out)
    # reconstruction error
    L_recon = mse_loss(x_real, x_decoder)
    # content error
    code_reconst = encoder(decoder_out)
    L_content = mae_loss(encoder_out , code_reconst)

以下说明这 Loss 为什麽有用

同一个人但说不同的话,他们的 speaker Embedding 我们假设 D_VECTOR 会处理到一模一样

 if U1 = U2 then Es(X1) = Es(X2)

不同人讲的话(不管内容是否一样),他们的 speaker Embedding 我们假设 D_VECTOR 会处理到完全不一样

 if U1 != U2 then Es(X1) != Es(X2).

{X1( 1: T)} 是有限的二阶矩阵遍历 (order-τ) 的马尔可夫过程,即

pX1(t)(·|X1(1 : t − 1), U1) = pX1(t)(·|X1(t − τ : t − 1), U1).

进一步可以假设 X1 是有限基数,将 n 表示为 C1 的维度,则 n 为

n = n* + T^2/3 where  n* is the optimal coding length of pX1(·|U1)^2

那麽下方的假设就成立了:
1. 对於每个 T ,存在一个内容编码器 Ec∗(·;T) 和解码器 D∗(·,·;T)
2. limT→∞ L = 0,KL 就是 KL-divergence  

这说明了如果帧数 T 足够大,且 n (瓶颈维度) 设置得当,则 loss function 将近似於理想转换

pXˆ1→2 (·|U2 = u2, Z1 = z1) = pX(·|U = u2, Z = z1)

更直观一点的解释 dim_neck

  • 一段语音里包含了两种讯息 - 语者的特徵 (涂满灰色) 以及说的内容(斜线)

    (a) -> (c) 在训练时目标跟来源都是一样的人

    (a)当瓶颈太宽时,内容会包含一些来源语者的特徵
    (b)当瓶颈过窄时,内容会丢失,导致重构不完善
    (c)当瓶颈刚好时,可以实现完美的重构,嵌入的内容不包含来源语者特徵
    (d)实际转换过程中,输出不应包含来源语者的特徵,因此转换质量应与进行自我重构时一样高

放大一点来看 AutoVC 结构

  • (a)内容编码器

    1. 输入: 80 维的梅尔倒频谱图 X1 与语者特徵 Es(X1) concatenate。

    2. 进 3 个 5X1 的 Conv + BN + ReLU ,out_put_channel = 512

    3. 进 2 个 cell = 32 的 BLSTM (合起来 = 64)

    接着进行对 bottleneck 的下采样,这两个就是输出

      dim_neck = 3
      # 以上图(e)来看的话 dim_neck = 3
      out_forward = outputs[:, :, :dim_neck]
      # 上图(f),同上
      out_backward = outputs[:, :, dim_neck:]
      # 实际上我的实验结果,dim_neck 的设定我觉得是
      (sample_rate/1000)*2    
    
  • (b) 语者编码器 (这个是没有要训练的 - D_VECTOR)

    根据前面的假设,语者编码器的目标是对同一个人的不同话语产生相同的嵌入,对不同的则产生不同的嵌入。在传统的多对多语音转换,这一步只需要 one-hot encoding 就可以了,但这里要达成零样本转换的话,Auto_VC 参考了Generalized end-to-end loss for speaker verification 中的设计

  • (c) 解码器

    输入:内容编码器的输出个别再上采样加上语者编码器的输出 Copy T 次 总共 3 个 concatenate

    1. 进 3 个 5x1 Conv + BN + ReLU, out_put_channel = 512
    2. 进 3 个 cell = 1024 的 LSTM
    3. 进 1 个 1X1 Conv, out_put_channel = 80 这边是第一个输出
    4. 进 4 个 5X1 Conv + BN + ReLU, out_put_channel = 512
    5. 进 1 个 5X1 Conv + BN + ReLU, out_put_channel = 80 这边是第二个输出
    6. 最後输出 = 第一个输出 + 第二个输出

最後把得到的 MEL 转回 Waveform 就完成了,因此要特别注意的是,拿来训练 Auto_VC 的 MEL 就已经是可以用 MelGan 或其他 Vocoder 转换的 MEL 了!

小结

明天开始我们就试着用官方的 pytorch 版本 run 吧!

/images/emoticon/emoticon09.gif/images/emoticon/emoticon13.gif/images/emoticon/emoticon14.gif/images/emoticon/emoticon22.gif/images/emoticon/emoticon28.gif


<<:  [13th][Day1] 前言

>>:  33岁转职者的前端笔记-DAY 11 一些网页切版技巧的小笔记-Part 2

Day11 TailwindCSS 介绍,在 Next.js 专案安装 TailwindCSS

上一篇我们成功安装完 GraphQL client,并在首页显示出文章列表了。功能做完,接下来要来切...

[Day 29] 实作-axios 串接api

先看一下有哪些api 下面列出这次用到的openapi, 可以看到他有一个共通的domain htt...

JS Promise DAY77

常见的非同步问题(不限於 AJAX) 回呼地狱 写法不一致 无法同时执行(jQuery有并行语法,但...

Day 8 - 社交工程 101

出於书本 Chapter 5. Social Engineering 常见的社交工程攻击 向使用者宣...

从 IT 技术面细说 Search Console 的 27 组数字 KPI (19) :10 个最好检查的排名因子 (SC外)

这篇是回头讲一些不在 Google Search Console 的 『KPI』,有时会发现这些更重...