语音识别——解码器(WFST、Lattice)

2023-11-01

       解码为给定声学观测序列O=\left \{ o_{1},o_{2},...,o_{T} \right \}的前提下,找到最有可能出现的词序列W=\left \{ w_{1},w_{2},...,w_{N} \right \},由贝叶斯得:

        W=argmax_{w}P\left ( W|O \right )=argmax_{w}P\left ( O|W \right )P\left ( W \right )

        解码的目的:从解码空间中找到一条或多条从初始状态到终止状态的最优路径。

        解码器是语音识别系统中的重要一环,主要解码方式有以下几种:

        1)动态解码器 (dynamic decoders):动态解码器使用广度优先搜索在原始的搜索网络中同时生成多条假设,并且依靠剪枝算法不会使网络变得太大。

        2)有限加权状态转换器 (weighted finte-state transducers ):加权有限状态转换器是使用有限状态自动机算法来表示和优化状态级网络结构,并用最短路径算法搜索得到的图结构。

        3)多通道搜索 (multi-pass search):最初使用词内二元语言模型。 可以使用一些简单的模型来生成多个假设;在第一遍获得的 N-best list 或词网格上使用更准确的词间模型重新评分假设。

基于Viterbi的原始动态解码器:

        基于Viterbi的原始动态解码器使用广度优先搜索在原始的搜索网络中同时生成多条假设,并且依靠剪枝算法不会使网络变得太大。

        动态解码网络仅仅把词典编译为状态网络,构成搜索空间。

        以一个四单词词典来举例,其词典包涵以下四个单词:

        构成的搜索空间可以分为:线性词典、树形词典

1)线性词典

        首先把词典中的所有单词替换为对应的音素状态序列,并联构成一个并联网络,再结合语言模型决定网络回环连接,如下是使用1-gram语言模型的解码网络示意图:

         使用2-gram、3-gram语言模型可以排除掉一些生僻组合,从而辅助解码过程剪枝计算,其解码网络示意图分别如下:

         其中的 sp 为单词间间隔。

        得到有词典构建的并联(回环)网络后,根据观测序列(语音信息)对状态序列进行横向扩展,x 轴为时间, y 轴为状态。

         图中,每三个状态代表一个音素。

        根据Viterbi算法,随着时间的推移,帧的移动,逐渐对其到最后一个词的最后一个状态,对比每条路径的累计概率,得到最优路径,即最终解码语句,解码结束。

        (HMM—解码问题(维特比(Viterbi)、A*、beam search )_weixin_43284996的博客-CSDN博客

        解码过程中可以通过令牌传递( Token Passing)等剪枝算法进行优化。

        但可以看出来,上述解码网络是所有单词的音素状态序列并联网络连接而成,如果词汇量很大,存储和计算复杂度都很高。

2)树形词典

        为解决线性词典的问题,提出了树形词典。

        对每个音素的每个状态建立一个决策树:

         树状结构是根据音素的路径去得到相应的单词,而非线性词典是先估计单词,再由单词进入对应的音素路径。(但是这使得语言模型使用总是在音素路径末端,这可以通过更早引入语言模型?)

        由于大量相同状态的节点被合并在一起,因此可以显著降低搜索空间的规模,减少解码过程的运算量。

总结:

        基于Viterbi的原始动态解码器对于大词典的解码过程,计算量大,解码速度慢。

        为了加速解码速度:

        一方面可以进行剪枝处理,在解码中选出最优路径,超过剪枝阈值的路径则直接删除,不再后续运算。

        另一方面可以把知识源预先编译成一个静态网络(WFST),在解码中直接使用。

基于WFST的Viterbi静态解码器:

        为了加快解码速度,可以把动态知识源提前编译好,形成静态网络,在解码时直接调用。
输入HMM状态序列,直接得到词序列及其相关得分。

        用H、C、L、G分别表示上述HMM模型、三音子模型、字典和语言模型的WFST形式。

(WFST简介及网络构建过程可见:加权有限状态转录机(Weighted Finite-State Transducer/WFST)_weixin_43284996的博客-CSDN博客

        此解码器中,声学部分(观测序列到HMM状态序列)还是需要根据输入特征单独计算,其他包涵在HCLG中的信息已经包涵在整个静态网络中,通过网络中转移弧的输入、输出、权重来表示。

        由于静态网络已经把搜索空间全部展开,它只需要根据节点间的转移权重计算声学概率和累计概率即可,因此解码速度非常快。

        解码过程使用了令牌传播机制Token passing,其实就是viterbi解码的通用版本。

        但实际使用过程中,很难保证viterbi解码解码的最优路径即是最合适的输出结果(例如:语言场景变化),故经常用 lattice 保存多种候选的识别结果,以便后续进行其他处理。

基于WFST的Lattice静态解码:

        在传统语音识别过程中,声学模型训练通常会占用很多资源,因此声学模型不会频繁的更新,这使得语音识别系统较难快速针对特定场景优化。另一方面,为保证解码效率,对解码图的剪枝是一个必要的步骤,常见的就直接使用beam search。考虑这两个问题便有了Lattice。

        在解码时,采用一些剪枝方法,使得最后获得N-best的路径,由这N-best的路径重新进行确定化等操作后得到的WFST就是Lattice。

        与HCLG一样,Lattice的输入为HMM状态,输出为单词序列。但在kaldi中,对Lattice的生成和存储做了优化,使其输入输出都是单词序列,并将HMM状态等信息存在transition中,因此,也通常称Lattice为词图或词格。

         这样语音识别的解码过程就分为两步(two-pass),第一遍解码得到Lattice,第二遍解码在Lattice中进行最短路径搜索得到1-best的解码结果。

        具体步骤为:

        1)N-best剪枝:原有的 token passing 算法创建新的词链接记录 (word link record, WLR) 时只会保存得分最高即似然概率最大的 token,改进后的算法会保存得分最高的 N 个 token。通过独特的ForwardLink前向链接机制来生成lattice。

        ForwardList每帧一个,可以和帧索引建立关联,它记录了Token在发射弧之间的传递,也用链表将当前帧所有状态的所有Token串联在一起。

        2)构建Lattice:在句末会进行回溯将所有历史信息转换到一个词网格中,这个词网格包含声学模型和语言模型的得分,以及识别出的单词及其对应的时间步,在这样的词网格中就可以找到 N 个最好的路径或假设 (hypotheses)。

        3)1-best重新评估:在Lattice对原有的路径重新打分,选出最优路径。在重打分时可以使用更大的语言模型或者与业务相关性更强的模型,这保证了在声学模型不变的情况下,优化了解码效果。

        上述解码器的基础上有时还会使用混合静态动态解码器 (hybrid static/dynamic decoders) 来进行优化:

        1)Lattice Pruning(晶格修剪)。词网格在生成的时候可能非常大,每个状态都保存了多个 token,但是很大一部分都对最优路径影响不大,所以 lattice 就可以在不降低准确性的前提下进行剪枝,具体方式为,首先找到最优路径及其似然概率,然后对于任意节点或弧线,分别计算其前后向的最大似然概率,即前后向打分,然后相加得到通过该弧线的似然概率作为这条边的后验概率,然后删除后验概率很低的边,以此达到剪枝的目的。

        2)Acoustic Model Rescoring(声学模型修改):一个词网格可以作为更复杂声学模型重打分的有限状态限制语法。所以当使用声学模型进行重打分时,原来由于时间以及音素上下文不同而复制的连接弧将被整合,使用一个更小的词网格,下图是单词 "TO" 的弧线被整合后前后 lattice 对比。

        3)Language Model Rescoring(语言学模型修改):原始词网格也可以用一个新的语言模型重打分,语言模型重打分不用考虑声学模型的影响,一个最简单的例子就是用三元模型对二元模型生成的 lattice 进行重打分,这就会多引入一些路径,前后对照图如下所示:

                 4)Confusion Network(混淆网络):生成混淆网络的方法则是先找到最优路径,然后逐步将其他的边对齐添加到混淆网络中,如果添加某条边时超过原网络的长度,仍将该边加入混淆网络并为之前的最优路径添加一条 !NULL 的边。

总结:

         解码的目的:从解码空间中找到一条或多条从初始状态到终止状态的最优路径。 

        基于Viterbi的原始动态解码器使用广度优先搜索在原始的搜索网络中同时生成多条假设,并且依靠剪枝算法不会使网络变得太大。可以使用树状字典代替线性字典,降低空间复杂度。

        为进一步提高解码速度,可以把知识源预先编译成一个静态网络,在解码中直接使用。即生成WFST。

        在WFST可以使用Viterbi算法的Token passing算法求得最佳路径。

        由于不同场景,Viterbi算出的最优路径不一定是最合理的路径,故引入Lattice。选取最优的N-best路径后在重新打分选取最合理的路径。

        针对构建的Lattice,还可使用混合静态动态解码器 (hybrid static/dynamic decoders) 来进行优化

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

语音识别——解码器(WFST、Lattice) 的相关文章

随机推荐

  • openshift简介

    openshift 简介 架构 简介 Openshift是一个开源容器云平台 是一个基于主流的容器技术Docker和K8s构建的云平台 Openshift底层以Docker作为容器引擎驱动 以K8s作为容器编排引擎组件 并提供了开发语言 中
  • 如何实现AD圆弧走线--AD走完线后自动倒成圆角/AD倒圆弧方法(Altium Designer)

    一 脚本获取 在AD软件PCB中如何实现圆弧走线 在网上搜索 得到的答案都是
  • 看得见的实力!传智教育「智能机器人软件开发」课程,打造新型互联网人才!

    在日常生活中 你一定看到过这些场景 进入商场或银行 会有机器人帮你解决问题 疫情期间 火神山医院通过机器人给患者送餐 新型物流企业 机器人自动进行货物分拣 这些以前只能在电影中看到的场景 现在已逐渐融入到我们的生活中 机器人的出现 在不经意
  • Java-计算素数

    判断输入的数字是不是素数 public class SuShu public static void main String args java util Scanner s new java util Scanner System in
  • android 11.0 launcher3 workspace app列表页不显示某个app图标

    目录 1 概述 2 核心代码 3 核心代码功能分析 3 1 LoadTask java中代码分析
  • watch gt3 鸿蒙,华为Watch3有什么功能-华为Watch3功能介绍

    华为Watch3是一款配置相当不错的智能手表 即将在近期发布 那么华为Watch3手表究竟怎么样 华为Watch3手表有什么功能呢 接下来小编就为大家分享一下关于华为Watch3手表的功能介绍 对华为Watch3手表感兴趣的不要错过了 华为
  • flask综合案例-蓝图+列表的增删改查+模板继承

    flask Blueprint蓝图 通俗解释 蓝图就是把所有的路由都分解成一块一块的 再把这些块和app联系 怎么联系 在view中定义一个蓝图 蓝图其实就是原来所用的app 只不过是换了一个名字 定义完了之后 还要在 init 中注册 相
  • adb命令一键安装当前文件夹下所有apk

    项目需要 需要批量安装apk到手机中 大概100个 于是弄了个脚本来代劳 同时考虑到直接用adb输入命令来安装的 会比较麻烦 于是写了以下脚本 安装文件时 直接用鼠标拖入apk文件到脚本再回车即可开始安装 bat文件内容 echo off
  • (一)PLY 文件格式

    PLY Format PLY or Stanford Polygon format defines a flexible and systematic scheme for storing graphical objects that ar
  • 【华为OD机试】不开心的小朋友【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 游乐场里增加了一批摇摇车 非常受小朋友欢迎 但是每辆摇摇车同时只能有一个小朋友使用 如果没有空余的摇摇车 需要排队等候 或者直接离开 最后没有玩上的小朋友会非常不开心
  • Linux安装以太坊geth客户端

    操作比较简单 首先可以到网站上看看最新版的版本号 https geth ethereum org downloads wget https gethstore blob core windows net builds geth linux
  • Python123 练习5

    文章目录 1 一元二次方程求根 2 百钱买百鸡 3 鸡兔同笼 4 最大公约数和最小公倍数 5 判断三角形并计算面积 6 判断IP地址合法性 7 回文素数 8 反素数 9 今天是第几天 10 提取首字符 11 判断火车票座位 如果文章内容或代
  • mount -o loop 解释

    回环设备 loop back devices 回环设备 loopback device 允许用户以一个普通磁盘文件虚拟一个块设备 设想一个磁盘设备 对它的所有读写操作都将被重定向到读写一个名为 disk image 的普通文件而非操作实际磁
  • 王道——数据结构——图(1)

    系列文章目录 其他章节相关文章 王道 数据结构 栈和队列 1 王道 数据结构 树与二叉树 1 本章节其他相关文章 文章目录 系列文章目录 其他章节相关文章 本章节其他相关文章 前言 一 邻接表矩阵法 一 图的建立 1 1 不带权图的建立 1
  • 华为OD机试备考攻略 以及题库目录分值说明 考点说明

    华为题库说明 2022与2023题库的区别 华为OD机试的题库是季度更新的 Q1 Q2 Q3 Q4 笔者专栏的题库分为2023和2022 2023的题库是包括2022 11 Q4第四季度 之后以及2023年的题库 2022的题库是包括202
  • 秋招-数据结构-二叉树篇

    秋招 数据结构 二叉树篇 介绍 基本信息 二叉树是n个有限元素的集合 该集合或者为空 或者由一个称为根 root 的元素及两个不相交的 被分别称为左子树和右子树的二叉树组成 是有序树 当集合为空时 称该二叉树为空二叉树 优缺点 顺序存储可能
  • linux ftp 未找到命令,Linux不能使用FTP 命令 -bash: ftp: command not found

    Linux下登陆 Linux中使用 FTP 命令时出现 bash ftp command not found Linux中测试搭建 FTP 服务器 刚安装完 vsftpd 测试登录时就提示 bash ftp command not foun
  • 拷贝构造函数为何可以访问其他对象的私有变量?

    在学习拷贝构造函数的过程中 突然想到了非常诡异的一点 为什么新对象可以访问原对象的私有变量 如下 class Student private string name int age public Student string name in
  • Android入门(六)

    文章目录 Activity 的启动模式 standard singleTop singleTask singleInstance 技巧 了解当前界面是哪个 Activity 随时随地退出程序 启动活动的最佳写法 Activity 的启动模式
  • 语音识别——解码器(WFST、Lattice)

    解码为给定声学观测序列的前提下 找到最有可能出现的词序列 由贝叶斯得 解码的目的 从解码空间中找到一条或多条从初始状态到终止状态的最优路径 解码器是语音识别系统中的重要一环 主要解码方式有以下几种 1 动态解码器 dynamic decod