Many-to-Many Voice Conversion based Feature Disentanglement using Variational Autoencoder

会议:2021 interspeech
作者:Manh Luong
单位:Vinai Research, Hanoi, Vietnam

代码实现

文章目录

abstract

基于VAE的说话人特征和内容的解耦,认为同一说话人两句话中的说话人信息是一样的,内容是不一样的。说话人特征+内容=一句话包含的信息。

method

# style_mu, style_logvar是同一个fc输出的维度split结果
# content_mu1, content_logvar1是同一个fc输出的维度split结果
style_mu1, style_logvar1, content_mu1, content_logvar1 = self.encode(x1)
z_content1 = self._reparameterize(content_mu1, content_logvar1, train)

# 同一个人另一句话的编码信息
style_mu2, style_logvar2, content_mu2, content_logvar2 = self.encode(x2)
z_content2 = self._reparameterize(content_mu2, content_logvar2, train)


# 说话人向量的 均值/方差 再次平均
style_mu2 = style_mu2.detach()
style_logvar2 = style_logvar2.detach()
z_style_mu = (style_mu1 + style_mu2)/2
z_style_logvar = (style_logvar1 + style_logvar2)/2
z_style = self._reparameterize(z_style_mu, z_style_logvar)

# 说话人向量和内容拼接
z1 = torch.cat((z_style, z_content1), dim=-1)
z2 = torch.cat((z_style, z_content2), dim=-1)

## parameters of distribution of sample 1
q_z1_mu = torch.cat((z_style_mu, content_mu1), dim=-1)
q_z1_logvar = torch.cat((z_style_logvar, content_logvar1), dim=-1)

## parameters of distribution of sample 2
q_z2_mu = torch.cat((z_style_mu, content_mu2), dim=-1)
q_z2_logvar = torch.cat((z_style_logvar, content_logvar2), dim=-1)

recons_x1 = self.decode(z1)
recons_x2 = self.decode(z2)

其中

# 高斯采样
def _reparameterize(self, mu, logvar, train=True):
   if train:
      epsilon = Variable(torch.empty(logvar.size()).normal_()).cuda()
      std = logvar.mul(0.5).exp_()
   	  return epsilon.mul(std).add_(mu)
   else:
      return mu
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值