介绍一些compose算法,以及这部分的代码实现。

原理部分参考: 走进语音识别中的 WFST(二)

可以看下示例图:

我们先来看一下 Composition 的效果,图(a)和图(b)Composition 后生成了图(c),从这么简单的效果图我们大致可以看出来其实这个操作就是找出满足下面这个条件的转移:第一个 WFST 的某个转移上的输出标签等于第二个 WFST 的某个转移上的输入标签,然后把这些转移上的 label 和 weight 分别进行操作:

当然上面的大白话肯定是不严谨、不完全正确的,下面我们将结合下伪代码来介绍正确的生成方式。需要注意的是,这里是一个 epsilon-free 的算法,即第一个 WFST 的任意转移上的输出 label 不能为空(εε)并且第二个 WFST 的任意转移上的输入 label 也不能为空(εε)。

下图做了个流程的示范,笔写比较方便一点。其实只要认真看懂了上面的伪代码这边就可以跳过不看了。

下面在代码里验证一下刚刚的例子:

$ cat A.fst
a b 0.1
b a 0.2
a a 0.4
c a 0.3
b b 0.5
0.6
$ cat B.fst
b c 0.3
a b 0.4
a b 0.6
0.7
$ cat words.txt
a
b
c
    #注意,符号表不能有0
fstcompile --isymbols=words.txt --osymbols=words.txt A.fst|fstarcsort --sort_type=olabel > A.bfst
fstcompile --isymbols=words.txt --osymbols=words.txt B.fst|fstarcsort --sort_type=ilabel > B.bfst
fstprint A.bfst >A.fst.txt
fstprint B.bfst >B.fst.txt
fsttablecompose A.bfst B.bfst | fstarcsort > C.bfst
#fstcompose A.bfst B.bfst >C.bfst #两个之间结果是一样的
fstprint C.bfst > C.fst
fstdraw --width= --height= --isymbols=words.txt --osymbols=words.txt C.bfst > Cfst.dot    #画出dot图
fstdraw --width= --height= --isymbols=words.txt --osymbols=words.txt A.bfst > Afst.dot
fstdraw --width= --height= --isymbols=words.txt --osymbols=words.txt B.bfst > Bfst.dot
dot -Tpng Afst.dot > A.png          #画png图
dot -Tpng Bfst.dot > B.png
dot -Tpng Cfst.dot > C.png

这里已经我的注释里面了,符号表words.txt里是不能有0的,可以试一下,有0结果就会错了,猜测是fst默认0是终止吧,尽量我们不用0吧。

我们来看下生成的最终的png图,和例子是一样的。

A:    

B:    

C:    

wfst的compose算法的更多相关文章

  1. Docker入门(三)使用Docker Compose

    Compose介绍   Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排.Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 ...

  2. Dock的生态开源技术(Etcd&Machine&Compose&Swarm&Mesos&Kubernetes)

    Etcd CoreOS公司开源的高可用分布式键值数据库Etcd,该项目已经被广泛应用到分布式系统的一致性实现和服务发现中,基于Go语言实现. Etcd就是专门为集群环境设计,可以很好地实现数据一致性, ...

  3. 基于WFST的语音识别解码器

    学习语音识别有些时间了.老板要求我们基于Kaldi搭一个语音识别系统,在设备上通过MIC讲话,连着设备的PC的console上就能基本实时显示出讲话的内容.由于我们都是小白,刚开始可以要求低些,就用传 ...

  4. Docker 0x13: Docker 构建集群/服务/Compose/分布式服务栈

    目录 Docker 构建集群/服务/Compose/分布式服务栈 集群 初始化集群服务 安装docker-machine 管理节点和工作节点 docker集群构建完成 集群中部署应用 集群服务访问特性 ...

  5. Docker Compose 部署Nginx服务实现负载均衡

    Compose简介: Compose是Docker容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker Compose,不再需要使用shell脚本来启动容器.Comp ...

  6. 基于面绘制的MC算法以及基于体绘制的 Ray-casting 实现Dicom图像的三维重建(python实现)

    加入实验室后,经过张老师的介绍,有幸与某公司合共共同完成某个项目,在此项目中我主要负责的是三维 pdf 报告生成.Dicom图像上亮度.对比度调整以及 Dicom图像三维重建.今天主要介绍一下完成Di ...

  7. 【2018.07.29】(深度优先搜索/回溯)学习DFS算法小记

    参考网站:https://blog.csdn.net/ldx19980108/article/details/76324307 这个网站里有动态图给我们体现BFS和DFS的区别:https://www ...

  8. Docker Compose 部署 Redis 及原理讲解 | 懒人屋

    原文:Docker Compose 部署 Redis 及原理讲解 | 懒人屋 Docker Compose 部署 Redis 及原理讲解  4.4k  字    16  分钟    2019-10-1 ...

  9. 基于Docker Compose部署分布式MinIO集群

    一.概述 Minio 是一个基于Go语言的对象存储服务.它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,非常适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份数据和容器 ...

随机推荐

  1. BZOJ2653 middle(二分答案+主席树)

    与中位数有关的题二分答案是很常用的trick.二分答案之后,将所有大于它的看成1小于它的看成-1,那么只需要判断是否存在满足要求的一段和不小于0. 由于每个位置是1还是-1并不固定,似乎不是很好算.考 ...

  2. eclipse 安装报错

    14 11:17:13] ERROR: org.eclipse.equinox.p2.transport.ecf code=1002 Unable to read repository at http ...

  3. BZOJ 3993 [SDOI2015]星际战争 | 网络流 二分答案

    链接 BZOJ 3993 题解 这道题挺棵的-- 二分答案t,然后源点向武器连t * b[i], 武器向能攻击的敌人连1, 敌人向汇点连a[i],如果最大流等于所有敌人的a[i]之和则可行. #inc ...

  4. HGOI20180823 三校联考

    首测:220qwq(算差的好吧) 后来改了一个地方:300qwq(算慢的好吧) std被踩qwq 注意:输入数据第一行忘记输入n,亲脑补 题解: 多项式除法(若最后除出的答案为1那么就是成功),对于f ...

  5. JavaScript学习复习

    JavaScript 输出 使用 window.alert() 弹出警告框. 使用 document.write() 方法将内容写到 HTML 文档中. 使用 innerHTML 写入到 HTML 元 ...

  6. Django入门项目实践(下)

    5.设置应用程序的样式 安装django-bootstrap3. # untitled/untitled/settings.py # ··· INSTALLED_APPS = [ 'django.co ...

  7. 几种简单的排序算法(JAVA)

    几种排序算法(JAVA) 一.代码 package com.hdwang; import java.util.Arrays; /** * Created by admin on 2017/1/20. ...

  8. 8: springMVC ModelAndView 作用与功能解析

    Spring mvc视图机制 所有的web应用的mvc框架都有它定位视图的方式.Spring提供了视图解析器供你在浏览器中显示模型数据,而不必被拘束在特定的视图技术上. Spring的控制器Contr ...

  9. P1858 多人背包

    P1858 多人背包 题目描述 求01背包前k优解的价值和 要求装满 调试日志: 初始化没有赋给 dp[0] Solution 首先补充个知识点啊, 要求装满的背包需要初始赋 \(-inf\), 边界 ...

  10. Spark记录-Scala数组/List/Map/Set

    import Array._ import scala.collection.mutable.Set object DataStructure { def main(args:Array[String ...