构图逻辑
现在写写一般的构图逻辑,这里会介绍ci-phone的,同时也会介绍cd-phone的构图逻辑。
- 一般介绍
- ci-phone构图
- cd-phone构图
下面先介绍下技术背景,主要应用在解码过程中,也就是语音识别;譬如唤醒、命令词都可以应用。对于一个词的发音序列
word : phn1 phn2 phn3
word: A B C D E ... Z
其中A就是词头,Z就是词尾。
先介绍ci-phone的逻辑。
上面就是ci-phone的构图逻辑。
上面的图中会有虚节点,这样就会有层的概念。
AB YZ ZA 为虚节点层:
ZA-AB之间为词头区
AB-YZ之间为词中区
YZ-ZA之间为词尾区
一般构图逻辑上来看:
注意首先将所有的word全部遍历一遍,获取所有的词头,词尾等。
- 先构建虚节点层,AB YZ ZA
- 构建词头区
- 构建词尾区,这里可以加上词尾标记。
- 构建词中区,词中区在最后一条边上,就是出词点。
对于图的操作,还需要做进一步的优化
- 前向合并:这里在构建的时候就可以操作,就跟构建前缀树一样
- 后向合并:图构建好以后再来处理
- 词前推:构建好以后再来处理
在构建词中区的时候,现获取词头的部分,按照发音序列然后走到词尾时,获取词尾部分获取词尾的结点,这样就可以构建一条path了。
注意其中还有些问题,需要特殊处理的问题:
- silence如何添加,主要在词尾区的构建过程中。
- 单个phone的问题,单独处理,同时加上silence
- 两个phone的问题,直接连接词头词尾,并加上出词点。
以上就是构建的一般逻辑了。
下面介绍ci-phone的构图逻辑。
- 构建虚节点层,AB其实就是A,YZ其实就是Z,ZA退化成一个虚结点,可以加快裁减。
- 构建词头区,所有的phone_A,并且连接ZA-phone_A,phone_A-AB
- 构建词中区,这里可以加上词尾标记。AB-phn_B-phn_C…-YZ
- 构建词尾区,YZ-Z-ZA,
- silence处理,YZ-Z-sil-ZA;也就是在Z-ZA之间加上sil
对于上图中,将上图加上start_node 以及end_node,基本上就可以得到整个graph了。
同时由于AB YZ,这两个虚节点层可以去掉。
优化以后就会得到如下图
AB YZ都已经默认去掉了。
在Z的后面,还有一条边链接了sil,这里是加入了silence的结点。
对于one的处理也是一样的,建立该phn结点以后,然后添加silence结点。
上面简单介绍了ci-phone的构图逻辑了,下面接着介绍cd-phone的构图逻辑。
这里会涉及到left-context以及right-context,同时了也会涉及到silence的问题,最后再加上start_node, final_node,这样整个图就可以得到了。
下面贴一下代码了,也就是图的node,以及arc
struct Node;
// debug arc
struct Arc {
// dest node
Node* dest;
// inlabel
int32 label;
};
// Struct Node defines one state in graph.
struct Node {
// node label
int32 label;
// node id
int32 node_id;
// trans tag, use for transval
int32 trans_tag;
// next_arcs.
std::vector<Arc*> next_arcs;
};
上一篇: MATLAB GUI 语音信号分析系统
下一篇: HMM+GMM语音识别
推荐阅读