了解单音素、三音素、决策树主要从几个问题出发:
(1)什么是音素?
以前的音标现在也可以叫音素,而且现在正广泛的把音标叫音素。 每一种语言中的音素都是不一样的,即使是同种语言中,方言的音素也是不一样的。音素应该与人体的发音严格的区分开,因为音素是指一个有规律的有限的发音系统而人体的发音则是无限的。 以英语为例,英语共有48个音素,其中元音20个,辅音28个。英语辅音和元音在语言中的作用,就相当于汉语中的声母和韵母。记录语音音素的符号叫做音标。音标可以分为两种,即严式音标和宽式音标。一般学习语言使用宽式音标即可,比如广泛运用的英语国际音标。而对于语音、音韵等专业研究来说,用严式音标则最大可能地记录任意一种语言的语音。 音素是构成音节的最小单位或最小的语音片段,是从音质的角度划分出来的最小的线性的语音单位。在语音学与音韵学中,音素一词所指的是说话时所发出的声音。音素是具体存在的物理现象。国际音标(这里指的是国际语音协会制定的国际音标,注意同英语国际音标区分)的音标符号与全人类语言的音素具有一一对应。
(2)单音素训练?
每个音素建立一个HMM模型。
GMM是用来训练声学模型,HMM是用于解码。其中声学模型就是用一个混合高斯分布来拟合一个音素。HMM呢就是通过Viterbi或B-W算法来对状态进行解码,给出最可能的状态序列。但GMM与HMM间的连接却一直不清楚。这里尝试对此给出流程总结:
1) 首先我们有一系列的特征序列,o1,o2,o3,o4,o5,o6,o7…,这些特征若为MFCC,则每一帧的维度都为39.
2) 对特征序列根据标注进行对齐。上面我们知道在初始时采用的是均匀对齐,在这里为了理解方便我们给出几轮迭代后的可能对齐方式,其中上面是可观察量,下面是HMM的状态,因此我们就可以求出HMM的参数-转移概率:
3) 首先应该明白,在单音素GMM训练中,每一个HMM状态有一个对应的GMM概率密度函数(pdf),所以有多少个HMM状态,就有多少个GMM,也就有多少组GMM参数。在知道了特征序列和对齐序列后,找出某一个HMM状态对应的所有观测(比如状态8对应的o2, o3, o4,在kaldi中则是找到某一transition-id对应的所有观测),也就得到了该状态对应的GMM所对应的所有观测。知道了该GMM对应的所有观测、该GMM的当前参数,就可以根据GMM参数更新公式更新GMM参数了,比如知道了状态8对应的观测o2, o3, o4,那么将其带入EM更新公式中即可.
问题:单音素建模没有考虑协同发音效应,也就是上下文音素会对当前的中心音素发音有影响,会产生协同变化,这与该音素的单独发音会有所不同(数据统计也就有所不同)
每个音素建立一个HMM模型
(3)三音素训练:
基于单音素 训练 三音素模型:
由单音素GMM我们得到训练数据的对齐文件,但是单音素GMM中的TransitionModel tm1和三音素GMM中的TransitionModel tm2不同,两者的每个数据成员都不一样,所以要把用tm1的tid(transition-id)表示的对齐转换成tm2的tid表示的对齐。([kaldi]这就是convert-ali的作用。要看懂convert-ali,首先要对TransitionModel理解的比较清楚。建议先搞明白TM再去看该程序的代码。 ) 根据tid能知道当前是哪个音素的哪个HMM状态(知道tid和对应的TM,由id2state_知道t-state,由state2id和tid只能t-idx,由t-state索引tuple_知道tuple,tuple保存音素、HMM state-id,也就知道了这两者),而无论该特征向量所对应的tid编号怎么变化,该特征向量对应的音素和HMM状态都是不变的。 从旧的tid转换成新的tid的流程大致如下:
(4)为什么需要状态绑定?
1)需要对三音素进行精细建模,则需要大量的数据,而实际上很难获得。
2)如果进行精细建模,则使得模型参数非常巨大。
举个例子: 假设音素表有50个音素,则需要的三音素总个数有:50×50×50=125,000;假设3个状态,每个状态对应1个GMM,1个GMM用8个高斯(44个参数=8 (8 1)×8/2),则1个三音素对应132个参数;总的模型参数有:16500000,显然模型参数非常大;另外,每个三音素的模型建立,如果要全覆盖,则需要很大的训练数据,一般很难覆盖到;所以,精细建模不太现实;需要状态绑定来减小参数。
(5)如何状态绑定?
两种方法:
1)传统的三音素方法就是模型绑定,也就是归一化三音素,使用一个后验平滑的方法。尽管如此,基于模型的上下文绑定是受限的,因为上下文音素不能单独的对待。
2)当前中心音素,如果上下文的发音类型相似,则对当前音素的影响是相似的,则可以将这些数据聚为1类;具体要如何制定这些规则(决策树规则),靠语言发音学家的经验知识。(音素判别,再到状态绑定) 对于节点分裂,需要寻找最佳的问题,按照looklikehood增加的原则。
* kaldi可以自动产生问题集,根据音素本身数据上的相似性,自动聚为一类,这不需要语言学知识。
(6)语音识别中的决策树?
在进行语音识别模型训练的过程中,首先进行的是单音素、单个高斯的模型训练。抛开单个高斯不说,单音素模型本身有很大缺点:没有考虑到本音素前后音素的发音对本音素的影响。比如,同样是一个音素iy,如果它前面的音素分别是h和p,那么iy这个音素在这两种情况下的发音会有所不同,那么模型参数也就会受到其影响,此时,如果用同一个模型来描述音素iy,那么就会不合理。
为了解决这个问题,采用三音素(triphones)模型,典型的三音素模型如下 [t-iy n],这表示iy音素前一个音素是t,后一个因素是n,模型[t-iy n] 用来表示这种情况下的音素iy模型,那么此时,这个三音素模型和 [t-iy ng] 不再表示同一个模型了,虽然他们都是表示音素 iy的模型,但是因为中心音素(此处为iy)的上下文音素不同了,所以此时它们其实是两个不同的模型。
如此以来,模型的数量会剧增。单因素模型时,假如我们只有40个音素需要建模,每个音素有3个HMM状态。但是在三因素模型中,最坏的情况是需要给40×40×40 个模型进行建模,当然这其中有很多是不可能或者不会在训练数据中出现的。但是相对于单音素模型来说,这个数目已经增加了很多倍,这就导致了一个问题:训练数据不足!那么如何解决因为模型数量增加而导致训练数据不足的问题呢?HTK使用了模型状态绑定的方法。所谓的模型状态绑定,就是让一些具有某些相似特征的模型的一些状态来共享一组模型参数,这样就能够有效的减少模型参数的数量从而解决训练数据不足的问题。
(7)使用决策树进行模型的状态绑定
在进行状态绑定时,我们首先要做的就是使用决策树进行聚类。具有相同类别的模型,他们的某一个状态可以共享一组参数。例如:对于音素iy,如果它的前一个音素分别是m和n,由于m和n发音比较像,所以模型[m-iy *]和[n-iy *]的第一个状态的参数就应该比较相似,那么我们就把这两个模型的第一个状态的参数进行绑定,也就是说这两个模型的第一个状态参数是相同的。那么到底如何确定那些模型的哪些状态可以共用一组参数也就是可以进行绑定参数?这就用到了决策树进行聚类,具有相同类别的状态就可以共用一组参数。
在这里,一定要注意,在建立决策树时,是对每个音素的每个状态都建立一个决策树, 而不是只对某一个音素来建立。这里,我们以音素ih的首状态为例,详细说明决策树的建立过程。
参考:
- 中科大硕士论文《面向服务机器人的口语对话系统和语言模型技术的研究》
- https://blog.csdn.net/weixin_33834910/article/details/86250348
- http://blog.sina.cn/dpool/blog/s/blog_6df8f2620102v0gb.html