在转换和训练,这些 model 的输入是不同的。
(a) 训练期间:
来源语音 (X1) 被送入内容编码器 Ec(·),来源语音的另一段声音 (X1') 送入语者编码器 Es(·),最後解码器跟内容编码器最小化 reconstruction error (见下面说明)。
(b) 转换期间:
来源语音 (X1) 被送入内容编码器 Ec(·)。目标语者的语音 (X2) 送入语者编码器 Es(·),最後解码器产生转换结果。
其中
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)
同一个人但说不同的话,他们的 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)
一段语音里包含了两种讯息 - 语者的特徵 (涂满灰色) 以及说的内容(斜线)
(a) -> (c) 在训练时目标跟来源都是一样的人
(a)当瓶颈太宽时,内容会包含一些来源语者的特徵
(b)当瓶颈过窄时,内容会丢失,导致重构不完善
(c)当瓶颈刚好时,可以实现完美的重构,嵌入的内容不包含来源语者特徵
(d)实际转换过程中,输出不应包含来源语者的特徵,因此转换质量应与进行自我重构时一样高
(a)内容编码器
输入: 80 维的梅尔倒频谱图 X1 与语者特徵 Es(X1) concatenate。
进 3 个 5X1 的 Conv + BN + ReLU ,out_put_channel = 512
进 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
最後把得到的 MEL 转回 Waveform 就完成了,因此要特别注意的是,拿来训练 Auto_VC 的 MEL 就已经是可以用 MelGan 或其他 Vocoder 转换的 MEL 了!
明天开始我们就试着用官方的 pytorch 版本 run 吧!
>>: 33岁转职者的前端笔记-DAY 11 一些网页切版技巧的小笔记-Part 2
上一篇我们成功安装完 GraphQL client,并在首页显示出文章列表了。功能做完,接下来要来切...
先看一下有哪些api 下面列出这次用到的openapi, 可以看到他有一个共通的domain htt...
常见的非同步问题(不限於 AJAX) 回呼地狱 写法不一致 无法同时执行(jQuery有并行语法,但...
出於书本 Chapter 5. Social Engineering 常见的社交工程攻击 向使用者宣...
这篇是回头讲一些不在 Google Search Console 的 『KPI』,有时会发现这些更重...