现在写写一般的构图逻辑,这里会介绍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全部遍历一遍,获取所有的词头,词尾等。

  1. 先构建虚节点层,AB YZ ZA
  2. 构建词头区
  3. 构建词尾区,这里可以加上词尾标记。
  4. 构建词中区,词中区在最后一条边上,就是出词点。

对于图的操作,还需要做进一步的优化

  1. 前向合并:这里在构建的时候就可以操作,就跟构建前缀树一样
  2. 后向合并:图构建好以后再来处理
  3. 词前推:构建好以后再来处理

在构建词中区的时候,现获取词头的部分,按照发音序列然后走到词尾时,获取词尾部分获取词尾的结点,这样就可以构建一条path了。
注意其中还有些问题,需要特殊处理的问题:

  1. silence如何添加,主要在词尾区的构建过程中。
  2. 单个phone的问题,单独处理,同时加上silence
  3. 两个phone的问题,直接连接词头词尾,并加上出词点。

以上就是构建的一般逻辑了。
下面介绍ci-phone的构图逻辑。

  1. 构建虚节点层,AB其实就是A,YZ其实就是Z,ZA退化成一个虚结点,可以加快裁减。
  2. 构建词头区,所有的phone_A,并且连接ZA-phone_A,phone_A-AB
  3. 构建词中区,这里可以加上词尾标记。AB-phn_B-phn_C…-YZ
  4. 构建词尾区,YZ-Z-ZA,
  5. silence处理,YZ-Z-sil-ZA;也就是在Z-ZA之间加上sil

对于上图中,将上图加上start_node 以及end_node,基本上就可以得到整个graph了。

同时由于AB YZ,这两个虚节点层可以去掉。

优化以后就会得到如下图

逻辑架构图画什么 逻辑构架草图_逻辑架构图画什么_02


AB YZ都已经默认去掉了。

在Z的后面,还有一条边链接了sil,这里是加入了silence的结点。

对于one的处理也是一样的,建立该phn结点以后,然后添加silence结点。

上面简单介绍了ci-phone的构图逻辑了,下面接着介绍cd-phone的构图逻辑。

逻辑架构图画什么 逻辑构架草图_Arc_03


这里会涉及到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;
};