HTS语音合成训练(三)-理论基础

HTS语音合成训练(三)- 总结

背景简介:

前两个月由于项目需要,进行了语音拼接合成相关技术的调研和HTS技术实践,从最初的看各种论文和找各种资料来了解相关技术,到实践HTS语音合成,调用hts_engine API实现模型参数提取供同事进行loss计算来选取最优片段,走了很多弯路,在此记录和总结TTS相关经验

1.技术发展路线简介

1.1.概述

语音合成(text to speech),简称TTS,主要作用是将文字转语音,先后经历了共振峰合成、LPC 合成、PSOLA 技术合成、HMM(Hidden Markov Model)语音合成、神经网络合成等方法

1.2.发展过程

相关资料:

论文:

1.2.1.相关概念

共鸣:物体因共振而发声的现象,例如两个频率相近的音叉靠近,其中一个振动,另一个也会发声,如下图,(好像中学时候做过的实验?)

**共振(resonance):**物理学上指特定频率和波长下,比其他频率和波长以更大的振幅做振动的情形,这些特定频率和[波长](https://baike.baidu.com/item/波长/829184)称之为共振频率和共振波长,一个系统有多个共振频率,在共振频率上振动会更加容易,在其他频率上振动更加困难

元音:英语音标就是记录音素的符号,是音素的标写符号,它的制定原则是:一个音素只用一个音标表示,一个音标只表示一个音素。英语是拼音文字,字母就表达语音。然而英语有40多个发音,却仅有26个字母。为了能准确标识发音,引入了语音符号,这些语音符号称作音标(Phonetic symbol)。国际音标分为两种:英式音标(DJ音标)和美式音标(K.K.音标)

浊音:当声带处于收紧状态,流经的气流使声带振动,这时产生的音是浊音,浊音是有具体意义的,例如元音,

浊辅音:浊辅音则不是由气流发出的声音/b/

清音:当声带处于放松状态,不伴有声带振动的音,称为清音,清音是无具体意义的音,如爆破音、摩擦音

清辅音:清辅音则是由于气流发出的声音,如/p/是清辅音,/b/是浊辅音,两者发音的口型相同,但是将手放于嘴前,会感受到/p/发出的气流,而/b/则不会

激励源与滤波器:气流与声门,等效为激励源,对应的是激励频率,也就是基音频率F0,声道等效为滤波器,对应是谐振频率

谐振频率:由于电容和电感充放电呈现出周期性特性,这个周期的频率就是”谐振频率“,在串联震荡回路中谐振频率下阻抗会迅速减小,并联振荡回路中,谐振频率下阻抗会迅速增大,由此可以形成各种不同的滤波器

  • 以图9—3(a)所示的滤波电路来说,当有信号从左至右传输时,L对低频信号阻碍小,对高频信号阻碍大C则对低频信号衰减小,对高频信号衰减大。因此该滤波电路容易通过低频信号,称为低通滤波电路。其特点可用图中的幅一频(UF特性f}}I线表示
  • 对于图9—3(b)所示的滤波电路来说,容易通过高频信号,所以称为高通滤波电路
  • 对于图9—3(c)所示的滤波电路,它利用C l和L1串联对谐振信号阻抗小、C2和L7并联对谐振信号阻抗大的特性,能让谐振信号f容易通过,而阻碍其他频率信号通过,所以称为带通滤波电路。该电路的这种特点可用图中的幅一频(U-F特性曲线概括
  • 对于图9—3(d)所示的滤波电路,它利用Cl和Ll并联对谐振信号阻抗大、C,和L,串联对谐振信号阻抗小的特点,容易让谐振频率以外的信号通过,而抑制谐振信号厂F通过,所以称为带阻滤波电路。该电路的特点可用图中的幅一频(U-F性曲线来概括

阻抗:主要由三部分组成,电阻,电容容抗和电感感抗,电阻对直流电起阻碍作用,电容和电感对交流电起阻碍作用,容抗隔直流,通交流,感抗通直流,阻交流

容抗计算公式:C表示电容,单位是法拉(F),f表示频率

XC=1/2πfC

感抗计算公式:L表示电感,单位是亨(H),f表示频率

XL=2πfL

1.2.2.声学基础和共鸣原理

1.2.2.1.声道共鸣机制

咽腔、口腔和鼻腔共同构成了声道,他们都是共鸣的器官,喉音(声门气流)自声带产生后,向上进入声道,经过对气体分子的压缩和稀释,声学特性(声道共鸣曲线)得到改变并产生输出声波

1.2.2.2.共振峰

通过构造器官的活动改变声道的大小和形状,声道的共鸣特性发生变化,因而在声音频谱中的一些频率得到了共振加强,而另一些则被削弱减幅,这些被加强的共振频率被称为共振峰,了解共振峰之间的相互关系对理解元音尤其重要,不同的元音对应不同的共振峰,对应不同的声道形状

1.2.2.3.构音三要素

在声道内,构音主要由三个要素构成:

  • 舌的收缩位置
  • 舌的收缩程度
  • 嘴唇的收缩

所有的元音和辅音都是根据声道形状和嘴唇的变化而形成

1.2.3.源-滤波器

参考论文:

  • 《基于HMM的单元挑选语音合成方法研究》

源-滤波器语音合成方法是基于声音是通过激励和滤波器产生的声学理论。整个过程分为:经过激励得到声源以及在声道中传播信号。激励源主要包括周期性激励和非周期性激励, 其中周期性激励用来产生浊音信号,非周期性激励也就是类似于噪声激励,用来产生清音信号,当同时使用这两种激励时会产生某些浊辅音信号,合成声音时根据语音的特征不同,选 择不同的激励源,通过改变声道参数进而改变合成语音的音色。源-滤波器语音合成主要有 两种实现方法:共振峰合成与线性预测分析合成,二者的区别在于声道模型不同

1.2.4.共振峰合成

参考论文:

  • 《基于HMM的单元挑选语音合成方法研究》

  • 《共振峰语音合成算法研究与实现》

20 世纪出现电子器件以来,语音合成技术就得到了快速的发展。1939 年 H.Dudley 制作 出了第一个电子合成器,它是利用共振峰原理制作的合成器,通过一些类似于白噪声的激励产生出非浊音信号,而通过周期性的激励产生出浊音信号,其中的模拟声道是一个10阶的带通滤波器,最后通过人为控制可以合成一些简单易懂的语音,共振峰模型是基于对声道的一种比较准确的模拟,该模型中语音生成的过程是在激励信号的激励下,声波经谐振腔(声道),由嘴或鼻辐射声波,声道传输频率响应上的极点称之为共振峰,而语音的共振峰频率(极点频率)的分布决定着声音的音色,音色各异的语音具有不同的共振峰模式,因此,以每个共振峰频率及其带宽作为参数,可以构成共振峰滤波器,再用若干个这种滤波器的组合来模拟声道传输特性(声道模型),对激励源发出的信号进行调制,再经过辐射模型就可以得到合成语音

虽然使用共振峰合成语音可以描述语音中最基本的部分以及描述自然流中的各种现象, 但是它却有明显的缺点,因为它将对声道的模拟作为基础,如果对声道模型的模拟不够准确,将会大大的影响合成语音的质量,因为共振峰参数并不能表征语音的自然度,所以合成出来的语音自然度不高,另外对于共振峰合成器的控制也比较复杂,一个好的合成器的控制参数高达几十个,实际操作起来也非常困难

1.2.5.拼接合成

参考论文:

  • 《基于HMM的单元挑选语音合成方法研究》

最开始的拼接合成是采用语音的编码技术,将一些语音编码或者直接存储起来得到语料库,在合成时解码组合输出即可,由于存放的是单个字的语音,语音逐字发音,语音单一,而由于人实际说话的自然流并不是各个孤立语音的 简单拼接,所以整体效果的自然度不高,一般主要用于自动报时、报站等应用

而真正的波形拼接合成方法并不是单纯的将语音拼接在一起,它还注重语音合成时的韵 律控制与修改,尤其是提出基音同步叠加方法后,使得拼接合成技术的质量提高,该方法在 拼接语音之前,对拼接单元按照上下文环境进行韵律的调整,使得语音的韵律符合上下文要 求,大大提高了语音合成的自然度和可懂度

随着计算机技术的迅猛发展以及海量数据库的提出,近年来大量使用基于大语料库的波形拼接合成方法,其核心思想是将海量的原始语音信号以及韵律信息存储到机器中,构成一 个庞大的语音库,在合成时根据待合成信息选取适当的算法规则,从语音库中挑选合适的 波形单元,经过波形编辑拼接以及平滑处理,并为其添加合适的上下文韵律信息,从而使得 合成的语音具有较高的自然度。大型数据库的引入使波形拼接语音合成技术有了很大的进步, 合成出的语音效果也有了质的突破,使用该技术既保持了原始语音的主要音段特征,又能 在拼接时灵活地调整语音的音高、时长等超音段特征,使得合成的语音非常接近人的原始 声音,因此该技术被人们广泛研究。

虽然波形拼接合成方法使得语音的自然度有了一定的提高,但是它也存在很大的缺陷, 即,要想合成出大量的高质量语音,则需要一个庞大的存储空间来存放各学科的语音信息以 及韵律信息,所以不易在嵌入式设备上实现,而且工作量非常大。另外,合成出来的语音非 常依赖于音库的制作质量,存在一定的稳定性问题,要想改变语音的特征,则需要建立新的 语音库,因此就加大了成本的需要,除此之外合成单元调整策略的不完备还会导致合成的语音的不连续

1.2.6.参数合成

参考论文:

  • 《基于HMM的单元挑选语音合成方法研究》

由于波形拼接合成方法存在的一些缺点,因此基于参数的语音合成方法再次得到了重视, 尤其是 20 世纪末以来,基于统计声学建模的语音合成技术迅速发展起来并且得到了广泛的 应用,其中隐马尔可夫模型(HMM)是最常用的声学统计模型形式。目前,HMM 是语音 领域中使用最广泛的方法,早期它主要被用于语音识别方面,并且技术已经非常成熟。后来 提出将 HMM 用于合成领域中也得到了成功的示例,该模型有自动化构建程度高以及合成效 果稳定等优点,已经成为语音合成技术研究的热门

基于 HMM 的语音合成系统结构简单,系统的训练基本上不需要语言学知识的指导,构 建时间短,构建过程也不需要人为过多干涉。整个系统主要分为模型的训练和语音的合成, 要训练 HMM 首先需要对语料库中的语音进行自动切分,然后进行参数(如,基频、时长或 频谱参数)提取,建立隐马尔可夫模型,合成语音时首先要对合成文本进行文本分析处理, 再根据 HMM 中的参数生成算法得到合成文本的参数,最后通过参数合成器得到语音。由于系统中并没有直接存储语音波形,而是存储语音的特征参数,所以需要的存储空间较小, 故该系统也非常适合应用于资源受限的嵌入式设备上。 虽然基于 HMM 的参数合成法相比传统的参数合成法简单易用,但是由于最终的语音还 是通过参数合成得到的,因此生成的语音与自然语音相比有着明显的差距,合成结果具有很浓的“机器味”,人们难以接受

1.2.7.神经网络合成

参考:

在HMM参数合成中,特征提取是使用传统决策树方法,声学模型是使用GMM-HMM,有了神经网络之后,对特征提取可以使用DNN网络来替代,HMM由RNN或者LSTM来代替,由此HMM被神经网络所取代

1.2.8.端到端合成

在引入神经网络之后,语音合成的基本流程和结构没有被改变,需要前端处理->声学模型->声码器这一套流程,但是,直到google推出tacotron端到端模型,将前端处理部分全部包含在模型中,模型输入为一段文字向量,输出为频谱,然后频谱通过Griffin-Lim算法生成音频

2.原理篇

2.1.特征提取

在HMM语音合成系统HTK中,需要用到两大特征来进行训练:

  • 语言学特征
  • 声学特征

语言学特征主要是文本的上下文关系如前后单词是什么,前后音素是什么等等,还有强制对齐之后音素的边界,声学特征主要是基频、MFCC特征和bap(Band Aperiodicity)特征

2.1.1.基音周期与基音频率

参考:

基音决定了语音的音调。汉语是一种有调的语音,同一句话,语调不同,意义差别非常大,准确的检测语音的基音周期,有利于“理解”话语中的意思

按照经典的语音激励模型,声带周期性的张开和闭合所需要的时间,就是指基音的周期(假如声带某次从开启到闭合的时间为4ms,那么,它的基音频率为250Hz)。很显然,要准确的检测基音周期,需要尽可能的先去掉声道模型和辐射模型的干扰

一般来说,男性的基音频率约为50Hz250Hz,女性的基音频率约为:100Hz500Hz,所以我们通常把基音频率的上限限制为500Hz,同时,又由于50Hz对应的是交流电的工频频率,难以去掉它的噪声干扰,所以这个频率检测时也不予考虑。综上,基音频率的检测范围在60Hz500Hz或者70Hz500Hz比较好。

基音频率:即后面所要讲到的傅里叶变换后的一次谐波分量的频率,可在文档中搜索基频查看

2.1.2.MFCC(Mel Frequency Cepstral Coefficents)特征

参考文献:

此部分涉及理论比较多,需要弄懂FTT(快速傅里叶变换)、同态信号处理、DCT(discrete cosine transform,离散余弦变换)等概念,下面是对参考内容的简单总结,如需详细了解可以看参考文献

2.1.2.1.FTT快速傅里叶变换

我们通常看到的语音波形图都是在时域上,也就是x轴是时间t,y是对应的值,跟通常函数类似,我们知道函数f(x)是可以通过泰勒公式进行展开的,如下

f(x)=f(x0)+f(x0)(xx0)+o(xx0)

如果x0​取0的话,就变成了关于x的n阶多项式了, 相应的x的一次、二次一直到n次方都会有一个系数如(xx0)​的系数为f(x0)​,如果我们用x1​到xn​次来代替时间轴上的1、2、3等时间轴的值,就得到了x轴上是x的n次方的表示形式,y的值也就变成了x的次方前面的系数,这样就将f(x)转变为了非时域形式,但是同样可以表征f(x),这里的f(x)是以x​、x1​...xn​​来表示,称为幂级数

f(x)如果是周期函数的话,还可以用三角函数如sin,cos来进行表示:

f(t)=A0+n=1[ancos(nωt)+bnsin(nωt)]

也可以写作:

f(x)=a0+n=1(ancos(2πnTx)+bnsin(2πnTx)),a0R

也叫做傅里叶级数,类比幂级数,这里展开成了关于cos和sin相关的式子,也就是x轴上的值变成了sin和cos,也叫做,与x的系数类似,sin和cos前面都有对应的系数,如:

f(x)1+4πsin(x)+0sin(2x)+43πsin(3x)+0sin(4x)+45πsin(5x)

此时对周期函数的拟合效果:

此时基,也就是展开后的与幂级数中x...xn对应的值为

{1,sin(x),sin(2x),sin(3x),sin(4x),sin(5x)}

他们对应的系数为

(1,4π,0,43π,0,45π)

在频域中表示为

则将周期函数f(x)时域图,通过傅里叶级数变换成了频域图,不管在频域还是时域,都表示同一个函数

那么上面的傅里叶级数和傅里叶变换有什么关系呢?

由于傅里叶级数只能表示周期函数,如下的非周期函数将不能表示

但是可以将此函数的周期T看作是无穷大

T=2πT=

则在T变化的同时函数图像变化如下

由于函数的基与周期的关系为cos(2nπTx)或者sin(2nπTx),当T​​逐渐增加时,基是逐渐减小的,则基的变化则如下图所示

这些频率会变得稠密,直到连续,形成连续曲线

上面这个对非周期函数让T​的形成连续频域的过程就是傅里叶变换

由以上的傅里叶级数公式,通过欧拉公式变换(欧拉公式可以将f(x)转为复数域,推导过程可以见参考文献),复数形式的傅里叶级数如下:

f(x)=n=cnei2πnxT

其中cn​为

cn=1Tx0x0+Tf(x)ei2πnxTdx

以上是傅里叶级数的复数形式,推导过程可见参考文献傅里叶级数到三角级数的详细推导

同幂级数时一样分析,现在基变成了ei2πnxT,也就是x轴坐标不再是时间t,也不是x1...xn,也不是cos2πnTxsin2πnTx,而是ei2πnxT,而基所对应的系数变为了cn,也就是频谱图中所对应的纵坐标的值(频率HZ),再将cn

表示为关于w=2π/T的函数F(w)​​

cn=1Tx0x0+Tf(x)ei2πnxTdxT=}F(ω)=12πf(x)eiωxdx

F(w)​​​​就是傅立叶变换(FT),得到的就是频域曲线

反傅里叶变换(IFT)公式则为

f(x)=n=cnei2πnxTT=}f(x)=F(ω)eiωxdω

如果需要知道详细推导过程,请看参考文献傅里叶级数(FS)、傅里叶变换(FT)快速傅里叶变换(FFT)及量子傅里叶变换(QFT)之间推导关系

由以上的傅里叶变换式子可以看出,如果想要得到F(ω)​,需要对f(x)​的值与eiωx​的值做积,由于上面的假设是dx​取​到+​​,而真正计算机在计算的时候并不能取到无穷,所以上述式子会变成离散形式

F(w)=t=0T1f(t)eiwt

也就是离散傅里叶变换(DFT)的函数式

如果计算上述式子,例如T​取8,则需要计算8个f(t)​与8个eiwt​相乘才能得出F(w)​的值,即频谱图,此时计算效率为O(n2)​,需要消耗大量的计算机资源,改进点就是利用eiwt​在单位圆上的性质,利用分治法进行改进,具体改进方式可查看参考文献中十分简明易懂的FFT(快速傅里叶变换,改进后的时间复杂度为O(nlog2n)​,也就是快速傅里叶变换

2.1.2.2.同态信号处理

同态信号处理作用之一是从混响中提取真实的声音,那什么是混响呢?

混响主要用于唱卡拉OK,增加话筒声音的延时,产生适量的回声,使唱歌的声音更圆润更优美,歌声不那么“干”

我们的目的在ktv唱歌的时候提取出真实的声音,而不是混响

如果在时域中,可以将真实声音信号设为s(n)​​​,混响信号设为x(n)​​​,由于在房间内会产生回波,所以回波信号设为h(n)​​​​​,假设回波信号的方程已知,混响信号由回波信号和真实信号组成,方程如下

x(n)=s(n)h(n)

其中,*代表卷积,卷积公式如下

(fg)(t)=τf(τ)g(t+τ)dτ

时域中如果已知x(n)h(n)s(n)​​不好求得,所以将其通过傅里叶变换转为频域中,因为时域中卷积对应这频域中乘积,如果不懂可以见参考文档中为什么频域中相乘对应这时域中卷积?,会有详细推导,于是公式变成了如下

X(z)=S(z)×H(z)

然后对频域中函数取对数得到

X(z)=logX(z)=lnS(z)+logH(z)

这样就将频域中的乘法变换为加法,然后再进行反离散傅里叶变换

IDFT(log(X(k)))=IDFT(log(S(k)))+IDFT(log(H(k)))

假设得到的时域信号如下

x(n)=s(n)+h(n)

此时的时域信号x(n)则为倒谱,由于x(n)h(n)是已知的,所以可以得到s(n)​的值,也就分离出了我们想要的真实声音信号的倒谱

2.1.2.3.DCT离散余弦变换

本节可以看参考文献DCT离散余弦变换

这篇文章主要让我懂了些关于高频和低频的知识,当我们在音频信号处理中,需要对频谱进行低频滤波处理获得音频信号的包络,因为音频信号的低频部分代表了包络而高频部分代表了频谱的细节,为什么呢?

个人理解,例如我们在进行频谱转换的时候,如果是采用泰勒公式展开,低频部分也就相当于x的一次方、二次方、三次方这样的值,高数里面一般对某个值做极限近似处理的时候,一般都是取前面的值,如sinx

sinx=xx33!+x55!+(1)1x2m1(2m1)!+R2m

当极限x->0时,我们可以将x约等于x,也就是说x已经代表了sinx,或者说由于sinx满足收敛条件,所以展开式中后面展开项是越来越小的,只用前面的几项就能代表sinx​函数的大致位置了,同理,由于傅里叶级数需要满足狄利克雷条件,即

给定连个实数级数{an}和{bn​}​,如果级数满足

  • anan+1>0
  • limnan=0
  • |n=1Nbn|M​,对于所有正整数N

其中M​是某个常数,那么级数n=1anbn​​收敛

也就是说傅里叶级数是递减的,取级数的前几个值,就可以代表周期函数f(x)​,而后面的几项由于值较小,更多的是更细节上的微调,也就理解了为什么说低频部分代表包络,高频部分代表细节了

还有一个启发就是对基频和谐波的理解,刚开始学习并不知道什么是基频什么是谐波,通过查阅文献傅里叶变换(一)——认识傅里叶变换和结合自己理解有了新的发现

再看傅里叶级数公式

f(t)=A0+n=1[ancos(nωt)+bnsin(nωt)]

而这里的A0​​​也就是常说的直流分量,当n=1时,式子变成了

f(t)=A0+a1cos(ωt)+b1sin(ωt)

如果我们使用三角函数的知识,设三角形的两直角边为a1​和b1​​​,则斜边为a12+b12,设为c1,则此时sinα=a1/c1cosα=b1/c1,则分别将a1b1替换则f(t)变成

f(t)=A0+c1sin(φ)cos(ωt)+c1cos(φ)sin(ωt)

化简后可以得到

f(t)=A0+c1sin(ωt+φ)

这里的c1sin(wt+φ)​​称为一次谐波分量,也成为基波,它的频率也就是基频基准频率,一次代表傅里叶级数中的n取1,谐波也指正弦或余弦波,其中φ​​​​​为相位,也说明了傅里叶变换成频谱图只包含了c1​​到cn​​的值,并没有包含相位φ​​​,于是完整的转换还需要一个相位谱,则完整的图如下

2.1.2.4.MFCC原理

上面讲完了需要了解的知识点,就可以讲MFCC原理了,结合梅尔频率倒谱系数(MFCC) 学习笔记,很全面很详细的一篇入门文章,我们可以有更深入的理解

首先语音信号是时域函数,与我们通常看到的波形图一致

通过FTT快速傅里叶变换可以将时域转为频域

频域中的主要频率成分也就是共振峰(formants),而共振峰决定着音色,所以可以用来分辨不同人的声音

而这些共振峰是在频谱图的包络中,所以我们需要将频谱图中的包络提取出来

我们在离散余弦变换中讲过,包络主要是频谱的低频部分,频谱细节是在高频部分,我们只需要将包络提取出来后经过低频滤波器进行滤波就可以得到低频部分,而怎么进行提取呢?用到的就是前面讲的同态信号处理的方法,假设频谱由两部分组成:

  • 包络
  • 频谱细节

假设两者是通过频域中乘积的形式(时域中卷积)

至于为什么要这样假设本人也不知道,有兴趣可以去找找资料

X[k]=H[k]E[k]

然后取对数,就变成了两者相加,再进行滤波就得到了低频的倒谱(cepstrum)(如有疑惑请参考同态信号处理)

Mel频率分析就是基于人类听觉感知实验的。实验观测发现人耳就像一个滤波器组一样,它只关注某些特定的频率分量(人的听觉对频率是有选择性的)。也就说,它只让某些频率的信号通过,而压根就直接无视它不想感知的某些频率信号。但是这些滤波器在频率坐标轴上却不是统一分布的,在低频区域有很多的滤波器,他们分布比较密集,但在高频区域,滤波器的数目就变得比较少,分布很稀疏

总结就是我们要将普通频谱转换为Mel频谱,于是有了如下公式:

mel(f)=2595log10(1+f/700)

得到Mel频谱之后,由于我们的目标依然是分离出包络,所以还是继续进行取对数,然后进行反傅里叶变换变成时域信号,这样就得到了Mel倒谱(Mel Frequency Cepstral)

那么什么是Mel倒谱系数(Mel Frequency Cepstral Coefficents)呢?

上面的步骤是对频谱取对数,然后进行反傅里叶变换,如果将反傅里叶变换改成DCT离散余弦变换

ci=2Nj=1Nmjcos(πiN(j0.5))

如果用反傅里叶变换将频域变为时域,那么为什么不是反DCT变换而是DCT变换呢?

一般取12-16阶系数(HTK中为13),也就是前第1阶到第13阶系数(系数为13)或其他如2到13阶系数(系数为12),即cos前面的系数作为MFCC系数,也就是倒谱系数(Mel Frequency Cepstral Coefficents)

前面还有预加重、分帧、加窗等操作这里就不过多介绍了,请参考声学特征(二) MFCC特征原理

2.1.2.4.bap特征

bap全称为Band Aperiodicity,可以参考语音合成vocoder(四) aperiodicity参数,由于做的的拼接合成,所以此参数没有详细研究

2.1.3.HMM原理

参考文献:

前面介绍了我们训练所需要准备的数据的原理,如基频F0,MFCC特征,忽略了前端处理中语言学特征的原理讲解,由于在HTS训练中,使用的是festival进行前端处理,如果大家感兴趣,可以参考festival文档

现在我们的语言学特征、MFCC、F0、Bap特征都已经准备好了,接下来进行训练则需要知道HMM的工作原理

2.1.3.1.什么是HMM

这里推荐一个讲解非常好的博客一文搞懂HMM(隐马尔可夫模型) ,里面对HMM模型进行了很生动的讲解,所以这里就不再赘述

总结一下就是有三个骰子和一串从这三个骰子中摇出的数字,我们需要知道这串数字中每个数字是由第几个骰子摇出来的,这个时候我们就可以对此问题用HMM进行建模,将3个骰子看作是3个隐状态(state),将这串数字看作是观测状态(observation),通过前后向算法、EM算法或Baum-Welch算法、维特比算法来求解最大概率骰子序列

2.1.3.2.HMM推导

标记说明:

  • I为隐藏状态序列
  • O为观测状态序列
  • it​为t时刻的隐藏状态
  • ot​​​为t时刻的观测状态
  • Q={q1,q2,...qN}​​​​为状态集合,即有规定的N个隐藏状态,例如一般在英文语音合成中用3个隐藏状态,中文语音合成中用五个隐藏状态
  • V={v1,v2,...vm}​为观测集合
  • aij​​​​为转移概率,即P(it+1=qjit=qi)​,t时刻隐藏状态为qi​的​概率转移到t+1时刻隐藏状态为qj​​的概率
  • bj(k)​​为发射概率,即P(ot=vkit=qj)​​,t时刻隐藏状态为qj​到观测状态为vk​的概率

如果初次学习HMM,建议可以先看看b站的HMM讲解和公式推导

推导过程中主要涉及的理论知识有:

  1. 概率论中简单的联合概率公式

P(a,bc)=P(ab,c)P(bc)

​ 推导:

P(a,bc)=P(a,b,c)P(b,c)P(b,c)P(c)=P(ab,c)P(bc)

  1. 齐次马尔可夫假设:任意时刻t的隐藏状态只依赖于前一时刻的隐藏状态,与其他时刻隐藏状态及观测状态无关(初始时刻的隐藏状态由参数π​​​决定)

    至于为什么初始状态概率为π​​​,暂时未知,印象中概率论中对马尔可夫链推导中有用到,这里没有进行详细研究​​

P(itit1,it2,,i1,ot,,o1)=P(itit1),t=2,3,,T

  1. 观测独立假设:任意时刻的观测只依赖于该时刻的马尔科夫链状态,与其他观测及状态无关

    P(otot1,ot2,,o1,it,it1,,i1)=P(otit),t=1,2,,T

HMM中三个问题:

  1. 概率计算问题:给定模型参数λ=(π,A,B)​​​和观测序列O=(o1,o2,,oT)​​​,其中π为初始转移概率,A为转移矩阵,B为观测矩阵,计算在模型在λ下观测序列O出现的概率P(Oλ)​​​ (前后向算法)

  2. 参数估计问题:仅已知观测序列O,求λ, 即P(λO)(EM或Baum-Welch算法)

  3. 预测问题/推理问题/decoding:已知Oλ ,求I=(i1,i2,,iT),即P(IO,λ)​ (维特比算法)

一、概率计算问题-求解P(Oλ)

P(Oλ)=P(ot,ot1,ot2,,o1λ)

假设我们有N​​个隐状态,则根据边缘概率分布和联合概率分布的关系即联和概率之和为边缘概率,可以得出,对隐状态I​​​​​(当作联合概率)求和加入到概率中不影响最终概率(边缘概率)

P(Oλ)=IP(O,Iλ)=IP(OI,λ)P(Iλ)

这里的P(O,Iλ)可以使用观测独立假设进行变形,即:

P(O,Iλ)=P(otot1,ot2,,o1,it,it1,,i1λ)P(ot1,ot2,,o1,it,it1,,i1λ)=P(otit)P(ot1,ot2,,o1,it,it1,,i1λ)=P(otit)P(ot1it1)P(ot2,ot3,,o1,it,it1,,i1λ)==t=1Tbit(ot)

P(Iλ)​​可使用齐次马尔可夫假设进行变形(这里的初始转移概率为πi​​,其中i=1Nπi=1​​),即:

P(Iλ)=P(it,it1,,i1λ)=P(itit1,,i1,λ)P(it1,,i1λ)=P(itit1)P(it1,,i1λ)=...=πit=2Tait1it

带入原式子中得:

P(Oλ)=IP(OI,λ)P(Iλ)=It=1Tbit(ot)πit=2Tait1it

由于I=(i1,i2,,iT),则将I展开得:

P(Oλ)=i1i2...iTt=1Tbit(ot)πit=2Tait1it

由于i的隐藏集合中有N​种取法,所以此算法的时间复杂度为O(NT)​​,会随时间出现指数级增长,所以就需要更加高效的算法,即前向算法后向算法

前向算法的推导

现在定义一个αt(k)​​表示为:

αt(k)=P(o1,o2,,ot,it=qkλ)

则所有的it​的取值集合为边缘概率,即​:

P(Oλ)=k=1NP(o1,o2,,ot,it=qkλ)=k=1Nαt(k)

现在已知P(Oλ)​​是由αt(k)​​​表示,即与时序t相关,我们推导得出递推公式为:

αt+1(j)=k=1NP(o1,,ot+1,it=qk,it+1=qjλ)==k=1NP(ot+1o1,,ot,it=qk,it+1=qj,λ)P(o1,,ot,it=qk,it+1=qjλ)

则根据观测独立假设

P(ot+1o1,,ot,it=qk,it+1=qj,λ)=P(ot+1it+1=qj)=bj(ot+1)

则根据齐次马尔可夫假设

P(o1,,ot,it=qk,it+1=qjλ)=P(it+1=qjo1,,ot,it=qk,λ)P(o1,,ot,it=qkλ)=P(it+1=qjit=qk)P(o1,,ot,it=qkλ)=akjαt(k)

带入αt+1(j)​式子得:

αt+1(j)=k=1Nbj(ot+1)akjαt(k)

分析时间复杂度,由于时间序列为T,首先需要循环时间T,然后有两个嵌套得对N求和,则总共得时间复杂度为O(TN2)

后向算法的推导

前向算法是从前向后推导,则后向算法是从后向前推导

首先定义后向概率(即上图中的紫色部分)

βt(k)=P(ot+1,,oTit=qk,λ)...β1(k)=P(o2,,oTi1=qk,λ)

则在模型已知情况下观测概率P(Oλ)βt(k)之间的关系

P(Oλ)=P(o1,,oTλ)=k=1NP(o1,,oT,i1=qkλ)=k=1NP(o1,,oT,i1=qk,λ)P(i1=qkλ)=k=1NP(o1,o2,,oT,i1=qk,λ)P(o2,,oTi1=qk,λ)=k=1NP(o1,i1=qk,λ)P(i1=qkλ)P(o2,,oTi1=qk,λ)=k=1Nbk(o1)πkβ1(k)

由于

α1(k)=P(o1,i1=qkλ)=P(i1=qkλ)P(o1i1=qk,λ)=πkbk(o1)

即对于t=1的时序

P(Oλ)=k=1Nα1(k)β1(k)

则时序为t时

P(Oλ)=k=1Nαt(k)βt(k)

现在假设已知所有的βt+1(k)来推导βt(k)

βt(k)=P(ot+1,,oTit=qk,λ)=j=1NP(ot+1,,oT,it+1=qjit=qk,λ)=j=1NP(ot+1,,oTit+1=qj,it=qk,λ)P(it+1=qjit=qk,λ)=j=1NP(ot+1ot+2,,oT,it+1=qj,it=qk,λ)P(ot+2,,oTit+1=qj,it=qk,λ)akj=j=1NP(ot+1it+1=qj,λ)P(ot+2,,oTit+1=qj,it=qk,λ)akj=j=1Nbj(ot+1)βt+1(j)akj

则推导出βt+1(k)βt(k)之间的关系,如果要求P(Oλ)需要求出β1(k),而β1(k)需要求β2(k),依次类推,直到第T个,也就是T*N次循环可以求出β1(k),再进行N次循环则得出P(Oλ),所以时间复杂度为O(TN2)​​

二、参数估计问题-求解P(λO)

本节首先需要用到EM相关知识,请结合EM算法原理及推导(EM算法)The EM Algorithm两篇文章来进行理解和推导,第二篇文章还讲到了在混合高斯模型(GMM)中的应用,GMM也是在后面需要与HMM一起介绍的知识,这里就不重点介绍了

总结上面两篇文章,EM算法主要是用来解决存在隐变量,通过极大似然估计无法直接求参数的问题,通过E步骤先确定一个变量值,然后通过M求出最大化参数,再通过E步骤确定新的变量值,通过M步骤最大化参数,如此循环,直到参数变换小于某个设定的阈值为止,此外,也有使用Baum-Welch算法的,原理EM相同,在此就不做过多介绍

EM中E步骤中的Q函数表达式如下

Q(λ,λ(t))=EIO,λ(t)[logP(O,Iλ)]=IlogP(O,Iλ)P(IO,λ(t))

通过前面的推导我们得到了如下公式

P(Oλ)=It=1Tbit(ot)πit=2Tait1it

可推出

P(O,Iλ)=t=1Tbit(ot)πit=2Tait1it

将式子带入Q得

Q(λ,λ(t))=I[log(πi)+log(t=2Tait1it)+log(t=1Tbit(ot))]P(IO,λ(t))

由模型得参数为λ=(π,A,B)π为初始转移概率,与公式中蓝色部分对应(左),A为转移矩阵,与公式中红色部分对应(中),B为观测矩阵,与公式中绿色部分对应(右),这里以π的更新为例进行讲解,AB的更新雷同,可以参考文章HMM公式推导

求解πt+1

π(t+1)=argmaxπIlogπi1P(O,Iλ(t))=argmaxπi1i2iTlogπi1P(I,Oλ(t))=argmaxπi1logπi1i2iTP(iT,,i2,i1,Oλ(t))=argmaxπi1logπi1P(i1,Oλ(t))

上面式子中πi由于是初始概率,所以只跟第一个时刻有关,标记改为了πi1,从第三步到第四部的变化,是根据边缘概率和联合概率的关系,由于有约束条件i=1Nπi=1​​),这里成了条件极值的求解

假设f(x,y)满条件g(x,y),求解f(x,y)极值的一般步骤为:

  1. 构建F(x,y)=f(x.y)+λg(x,y)

  2. 分别求出F(x,y)​​​对x,y,λ​​的偏微分

  3. 令偏微分等于0,由于有三个未知数x,y,λ,三个偏微分方程,可求出满足条件的x,y,λ

此方法成为拉格朗日乘子法

所以我们要求解的是π(t+1)​在满足i=1Nπi=1​​​条件下的极值,设构造函数为

L(π,η)=i=1Nlogπi1P(i1=qi,Oλ(t))+η(i=1Nπi1)

πi​求导,得:

L(π,η)πi=1πiP(i1=qi,O|λ(t))+η

令导数为0得:

P(i1=qi,O|λ(t))+ηπi=0

由于πi​在初始状态下的N​​​个值都是一样的,所以对N​个分量求导的结果都是一样的,将这些结果相加得到:

i=1NP(i1=qi,O|λ(t))+i=1nηπi=0

再利用π​的约束条件,就得到:

ηi=1Nπi=i=1NP(i1=qi,O|λ(t))

η=i=1NP(i1=qi,O|λ(t))

由于是对i的积分,所以由边缘概率和联合概率关系则可以去掉i1

η=P(O|λ(t))

则此时,π​为极大值,带入对πi​求导后令其为0的表达式得:

π(t+1)=argmaxπi1logπi1P(i1,Oλ(t))=P(i1=qi,O|λ(t))η=P(i1=qi,O|λ(t))P(O|λ(t))

由前向概率αt(k)​定义和βt(k)​定义可得到

αt(k)βt(k)=P(o1,o2,,ot,it=qkλ)P(ot+1,,oTit=qk,λ)=P(o1,o2,,otit=qk,λ)P(it=qkλ)P(ot+1,,oTit=qk,λ)=P(o1,o2,,ot,ot+1,,oTit=qk,λ)P(it=qkλ)=P(o1,o2,,ot,ot+1,,oT,it=qkλ)=P(it=qi,O|λ(t))

即得到π(t+1)​的表达式​

π(t+1)=P(i1=qi,O|λ(t))i=1NP(O|λ(t))=αt(k)βt(k)P(O|λ(t))

自此,就得到了πt+1的表达式,由于转移矩阵A和观测矩阵B​的表达式与此类似,就不再进行推导,详细的推导可以见HMM公式推导

3.预测问题/推理问题/decoding:维特比算法

初学者最好先理解维特比算法的原理,这里推荐如何通俗地讲解 viterbi 算法?,然后再看HMM公式推导关于维特比算法章节的解释,由于时间有限,所以不再做详细解释

2.1.5.GMM原理解释

这里就不做过多解释,可以给一篇个人觉得很赞的文章

2.1.4.原理篇总结

本篇主要是讲述了在进行HMM训练时我们需要准备的数据和数据的相关原理,本篇中主要为基频和MFCC等概念的理论解释,为想要入门的语音的同学提供学习相关资料

3.总结

本篇就是简要概述了下语音合成的路线,和相关的一些技术的理解,还有做了些从HTS-engine提取这些参数的工作和一些资料的整理,本篇的公式都没有一个标号,这个确实很不方便,由于时间关系,后面有时间整理吧,如有错误请大家指正哈~。

posted @   热风丶1921  阅读(736)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示