欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

构图逻辑

程序员文章站 2022-07-13 14:41:29
...

现在写写一般的构图逻辑,这里会介绍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,这两个虚节点层可以去掉。
优化以后就会得到如下图
构图逻辑
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;
};
相关标签: 语音识别