课程主页:http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html

视频地址:https://www.bilibili.com/video/BV1RE411g7rQ?p=1

参考资料:https://blog.csdn.net/qq_44574333/category_10304412_2.html

备注:图片均来自于课件。

这次回顾P10至P11,这部分介绍了语音转换问题。

语音转换

简介

语音转换模式如下:

  • 输入:语音
  • 输出:语音

目标:

  • 保留内容信息。
  • 改变其他的信息。
    • 说话者。
    • 说话风格。
    • 增加可理解性。
    • 数据增强。

改变的信息

说话者

  • 不同的人说的同一句话有不同的效果。
  • Deep Fake:欺骗人/语音验证系统。
  • 实现个性化TTS(语音合成系统,即转换成任何人的声音)的一种简单方法。
  • 歌声转换。

说话风格

  • 情感。
  • 普通到Lombard。
    • Lombard的介绍可以参考视频。
  • 悄悄话转换到正常声音。
  • 歌唱技巧转换。

增加可理解性

  • 改善语音清晰度。
  • 口音转换。
    • 非母语使用者的语音质量和母语使用者的发音模式。
      • 例如将非标准的英语转换成标准的英语。
    • 可用于语言学习。
      • 听自己的声音更容易学习语言。

数据增强

如下方法可以将数据量增加:

  • 将男性的声音和成女性的声音互相转换。
  • 将有噪音的声音和无噪音的声音相互转换。

实现

通常输入和输出的长度相同,所以不需要Seq2Seq模型:

注意声学信号无法直接恢复成原本的声学信号,这部分还需要Vocoder:

这部分有两种方法:

  • 基于规则:Griffin-Lim算法。
  • 深度学习:WaveNet。

本讲不会介绍Vocoder。

分类

  • 成对数据(句子相同):

    • 难点是可能会缺乏数据,解决方法为:

      • 模型预训练。
    • 合成数据:
      • 收集一些人讲的句子,利用语音识别技术转换成文本,再将这些文本转换成声音。
  • 非成对数据(句子不同):

    • “音频风格转移”

    • 从图像风格转移中借鉴技术。

    • 具体分类:

      • 特征解开(Feature Disentangle)
    • 直接转换(Direct Transformation)
    • 本讲主要讨论非成对数据的训练,会具体介绍这两种方法。

特征解开(Feature Disentangle)

特征解开利用Encoder,Decoder思路:在编码器部分声音信号转换成内容和语者两部分,将两者作为解码器的输入,输出恢复成声音信号。

现在进行声音转换,只要将语者部分的更换即可:

训练方法和Encoder,Decoder类似:

这里有一个难点,如何保证两个Encoder分别抽取内容和语者的信息呢?

利用语者信息

去掉Speaker Encoder,将其替换为语者的one-hot向量(这里假设我们知道训练话语的使用者):

该方法的问题是,很难加入新的语者。

预训练Encoder

预训练Encoder:

  • Speaker Encoder:利用Speaker embedding(i-vector, d-vector, x-vector)。
  • Content Encoder:利用语音识别系统,例如HMM中DNN部分,该网络预测声音处于某个状态的概率分布。

对抗训练

在Content Encoder后接一个Speaker Classifier:

  • Content Encoder学会如何欺骗Speaker Classifier(尽可能抽取和语者无关的信息)。

设计网络结构

在Content Encoder中增加instance normalization(去除语者信息),具体来说:

  • 输入声音信号。
  • 一维卷积。
  • 对每个频道正规化。
    • 每个频道可以理解为某种特征,正规化减少了语者的信息。

在Encoder中增加adaptive instance normalization,在减少对内容的影响下,将语者信息加入到Decoder,具体如下:

  • 对Decoder的输出作用instance normalization。

    • 这一步去掉语者信息。
  • Speaker Encoder有两个输出$\gamma,\beta$,将其和Decoder的输出作用得到

    • 这一步增加语者信息。

图示:

2阶段训练

在实际中,AutoEncoder方法产生的声音效果不是特别好,老师说原因可能如下:

  • 训练的目标是产生AutoEncoder,不是进行声音转换。
  • 训练阶段Content Encoder的语者和Speaker Encoder的语者相同,但是测试的时候并不同。

为了解决这点,可以使用2阶段训练:

  • 第1阶段:
    • 训练阶段Content Encoder的语者和Speaker Encoder的语者不同。
    • 这样做的问题是,并没有正确答案,为了解决这点,就要依靠第二阶段。
  • 第2阶段(利用Gan的思路):
    • 增加一个Discriminator,判断声音是真实还是生成的。
    • 增加一个Speaker Classifier,判断语者是谁。
  • 补充:
    • 如果直接这样训练效果会不太好,一个解决方法是增加Patcher(补丁),将Patcher的输出叠加到Decoder的输出。

图示如下:

直接转换(Direct Transformation)

直接转换是指利用风格转换的思路,利用GAN的思想。

Cycle GAN

  • $G_{X\to Y}$:让$X$的声音接近于$Y$的声音。
  • $D$:判断$G$的输出是否属于$Y$。

但是这样训练,$G_{X\to Y}$很容易产生出$Y$使用最多的声音,解决这点的方法是增加$G_{Y\to X}$。

其他训练技巧:

  • 对于$G_{X\to Y}$,我们希望输入$Y$的声音也会返回同样的声音。

对称的,我们可以将$Y$转换成$X$的声音:

StarGAN

对于$N$个语者,Cycle GAN需要$N(N-1)$个模型,StarGAN就是为了解决这点:

  • 将声学信息和语者信息输入给$G$。
  • 将声学信息和语者信息输入给$D$。

整体结构:

  • 将声学信息和语者信息输入给$G$,得到新的声音。
  • 将同一个语者的信息和$G$的输出输入给$D$,判断当前声音是否属于该语者。

Blow

这部分老师没有介绍,这里留空后续补充。