【Day10】 声音转换概述 - 再次出发!

前言

  • 在经过前面 9 天的准备之後,我们终於有些本钱可以涉足这个领域了,整理一下我们现在所掌握的
  1. 知道声音的特徵资讯藏在 Mel 里,也知道怎麽算
  2. 知道怎麽从 Mel 回到 Waveform,而且是用 MelGan 做到,避开了 Griffin Lim 的机器音问题
  3. 知道怎麽用 D_VECTOR 抽取出说话的人的资讯,然後用来分辨是谁在说话,而且就算有没看过的人也可以把它嵌入到空间里的不同位置

好耶! /images/emoticon/emoticon42.gif/images/emoticon/emoticon42.gif/images/emoticon/emoticon42.gif

声音转换可以干嘛?

在做之前总要先知道你做这个能干嘛吧

  1. 可能有些声带受损的人能透过这个技术变成正常的声音
  2. 可以个人化出自己喜欢的声音然後使用在有声书上之类的
  3. 可以用声音转换技术把原本的男声转换成女声,瞬间让你的资料变成 2 倍
  4. 可能有坏人会拿去做诈骗 XD
  5. 好玩

声音转换面临的主要问题

  1. 大部分的语音转换系统都假设有并行训练数据,就是两个说话的人必须要说出相同句子的语音对,无法接受非并行数据的训练,这样在声音转换的任务上就出现了第一道门槛 - 资料蒐集与对齐的困难。

  2. 在少数几个能处理非并行数据的现有算法中,能够用於多对多转换的算法就又更少了,但还是有像是 CycleGAN, StarGAN-VC 可以做到 (而且这两篇还是同一个作者)。

  3. 而在 AutoVC (2019)出现以前,没有任何语音转换系统能够执行零样本转换 (他们这样宣称),就是仅通过观察一个没听过的人的少数话语就可以转换成另一个人的声音。

传统的语音转换 ( 例如:用 NMF 将频谱分解为与说话人有关的和说话人无关的特徵 ) 的问题正被重新定位为风格转换问题,将音质视为风格 (style),将说话的人视为领域 (domains)。

解决非并行数据的方法

  • 一段声音讯号里头,包含了很多不同面相的资讯,它包含了 "讲话内容" 的资讯,也包含了 "说话的人" 的资讯,要是可以把一段声音 "说话的人" 的资讯以及 "讲话内容" 的资讯给取出来,那我就可以随意的组合出我想要的声音,也完全不用管训练内容是否并行了。(这种做法也被称为 Feature Disentangle)

我们昨天做的 D_VECTOR 就是萃取出 "说话的人" 的资讯模型

  • 整个流程看起来就会像下面一样,这大概就是 AutoVC 的架构,其中 Content Encoder 跟 Decoder 就是一组 AutoEncoder

  • 然而 CycleGAN 与 StarGAN-VC 的作法并不是这样做的,他们在训练的时候就希望能够直接从 A 的声音转成 B 的声音,也正因为这样的原因,他们是无法做零样本转换的。你可以参考这篇看他们怎麽做,但其实就跟在处理图片的时候一样,只是资料换成声音而已。

声音转换的问题描述

我们假设语音是由以下随机过程产生的。

   说话的人身份 U 是从一群人 pU(·) 中抽取的随机变量 

内容是指语音和韵律信息

   内容向量 Z = Z(1 : T) 是由联合内容分布 pZ(·) 得出的随机过程。      

在给定说话的人身份和内容的情况下,X(t) 就可以代表语音波形的一个样本,或者语音频谱图的 1 帧

语音片段 X = X(1 : T) = pX(·|U, Z)  它表示了发出 Z 内容的说话人语音的分布情况   

接着,再假设大家讲话的长度一样

H(X|U = u) = hspeech = constant, 

现在,假设两组变量 (U1 , Z1 , X1) 和 (U2 , Z2 , X2) 是独立且同分布的随机样本则 (U1 , Z1 , X1) 属於源说话的人,(U2 , Z2 , X2) 属於目标说话的人。

声音转换模型的目标就是设计一个转换器,它产生转换输出 X1 → X2 ,保留 X1 中的 "讲话内容" (Z1),但匹配目标 "说话的人" 的声音特徵 (X2)。

# 理想的语音转换器应该具有以下理想的性质
pXˆ1→2 (·|U2 = u2, Z1 = z1) = pX(·|U = u2, Z = z1)
  • 当 U1 和 U2 都出现在训练集中时,问题就是一个标准的多说话人转换问题,已经有一些模型解决这个问题了。

  • U1 或 U2 不在训练集中时,问题就变成了零样本语音转换问题,这就是 AutoVC 解决的困难。

小结

今天我们了解到声音转换的困难,也知道非并行数据的解决办法了,就是两种,Feature Disentangle 跟直接硬转,但硬转的下场就是不能够做零样本转换,接着就等明天让我们更详细的钻研 AutoVC 吧!

参考资料

AutoVC 论文

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


<<:  [Day10]Cubes

>>:  从零开始的8-bit迷宫探险【Level 2】Xcode 开发环境介绍

[DAY28]番外篇-使用fetch发送请求

大家好,距离完赛越来越近了,过完最後一天的双十连假,心情也开始忧郁了QQ,还好本系列复杂的文章差不多...

第二十天:在 TeamCity 上执行 Build Scan

昨天介绍了 Gradle 的 Build Scan 功能,让我们可以清楚的了解 Build 过程中的...

[13th][Day2] 变数

about variable 不管在哪一个程序语言中,我们都需要变数,有了基本的变数,才可以进行数值...

【Day 07】C 的输入输出函式

输入输出函式(printf、scanf)是 C 语言中非常重要、也很常用到的函式。如果要用到这两个函...

30 - 有效的使用 Observability 的资料 (4) - 使用 Elastic Observability 追纵及观察问题的心得

有效的使用 Observability 的资料 系列文章 (1/4) - 透过 Machine Le...