(一) 例子
<s> sil
</s> sil
北京 b eh_l i_l ji i_h ng_h
北方 b eh_l i_l f a_h ng_h
天气 ti aa_h nn_h qi i_h i_l
注:调用WriteTLex (tnet, "lex.dot")函数,可以生成相应的网络结构图。
(二) 主要结构
1. 节点
定义:
typedef enum _LexNodeType {
LN_WORDEND, LN_CON, LN_MODEL
} LexNodeType;
Node的三种类型:
node |
内容 |
对应的layer |
LN_WORDEND |
Pron(单词) |
WE |
LN_CON |
辅助节点,用于减少边的数量 |
AB YZ ZS SA |
LN_MODEL |
Hmm(model) |
A BY Z SIL |
5 special models: <s> Mod/WE, </s> Time, </s> Mod/WE
2. 层
定义:
typedef enum _LayerId {
LAYER_Z=0, LAYER_ZS=1, LAYER_SIL=2, LAYER_SA=3, LAYER_A=4, LAYER_AB=5,
LAYER_BY=6, LAYER_WE=7, LAYER_YZ=8
} LayerId;
9层结构如下:
层类型 |
含义 |
对应的节点类型 |
LAYER_Z=0 |
y-z+a |
2 |
LAYER_ZS=1 |
z+a或者z+sil |
1 |
LAYER_SIL=2 |
sil/sp |
2 |
LAYER_SA=3 |
sil+a或者z+a或者time |
1 |
LAYER_A=4 |
z-a+b或者sil-a+b |
2 |
LAYER_AB=5 |
a+b |
1 |
LAYER_BY=6 |
a-b+c b-c+d |
2 |
LAYER_WE=7 |
word |
0 |
LAYER_YZ=8 |
y+z |
1 |
层对应关系:
wordEndLayerId = LAYER_SA
spSkipLayer = LAYER_ZS
(三) 构建步骤
1. CollectPhoneStats()
收集A, B, AB, YZ;创建LAYER_AB和LAYER_YZ层
对于具有单个发音p的词条(如silience),会把z和p放在SA层和YZ层
节点里面存有两种类型的数据,一类是HLink,对应于三音素;另一类是pronid,对应于pronlist中的下标,可以通过pronid在pronlist里面找到该词条。
2. CreateAnodes()
创建LAYER_A,z-a+b节点;创建LAYER_SA,z+a节点
3. CreateZnodes()
创建LAYER_Z,y-z+a节点;创建LAYER_ZS,z+a节点
4. CreateSILnodes()
创建LAYER_SIL,sil节点用于连接SA和ZS
对于sil节点:对于每一个z+sil,新生成一个silnode,右边连接所有的sil+a。
对于sp节点:对于每一个z+a,新生成一个spnode,右边连接对应的z+a。
5. CreateBYnodes()
创建LAYER_BY,a-b+c节点;wordend节点也并入到LAYER_BY。
6. CreateStartEnd()
增加网络的起点和终点
<s>:新建sil的model节点(LAYER_Z);新建<s>的word节点(LAYER_SIL);连接sil+a
</s>:新建sil的model节点(LAYER_A);新建</s>的word节点(LAYER_AB);连接如下
7. 建立lmlatree
1) AssignWEIds()
对AB层一直到wordend层之间的节点进行编号pronID(word node)和lmlaId(其他node)。
2) InitLMlaTree()
新建lmlatree,对A层的节点进行编号:如果节点后面只有一条出边,该节点的lmlaIdx设为子节点的lmlaIdx(对应于简单节点);如果节点后面存在多条出边,该节点的lmlaIdx设为++tnet->lmlaCount,同时新建该节点对应的compNode(对应于复杂节点)。
3) ConvertTLex2Lex ()
初始化lmlatree中的简单节点:将net中的node的loWE和hiWE存放至lmlatree。
Lmlatree的节点结构如下图: