Dynamic Decoders with On-the-fly WFST Operations(动态解码器与动态WFST操作)

前言

导师让搞语音识别的后端处理技术,就是关于解码方面的,但是现在很迷茫,就打算从最基本的动态解码处理开始,由于静态解码好多博主都已经写过了,由自己开始读关于动态解码部分,所以开始自己记录自己学习的过程,希望能够坚持下来。

首先来说明WFST静态解码相比于传统的方法有哪些问题,

  • 一是识别网络内存消耗大,识别网络通常是WFST形式的大型静态网络。
  • 另一个是组合和优化的WFST的在线操作的计算成本。换句话说,当我们修改一个知识源时,即使是一个小的修改,例如在词汇表中增加一个新单词,我们也必须重构整个识别网络。

为了解决这些问题,使用动态WFST操作进行解码网络构建。这个扩展可以减少运行时的内存消耗,但是他可能会有一些计算成本,因为在运行时的操作。

一、本地WFST存在的问题

实际上,用于大词汇量连续语音识别(LVCSR)的全组合WFST往往会变得过大,因为全组合WFST网络是由组件WFST的状态和转换的乘积组合而成的。在LVCSR的传统方法中,这样一个大的网络通常不是完全在内存中构建的,因为它的大小超过了标准计算机内存大小的上限。因此在译码过程中,网络是按需动态构建的,但大量的译码过程都致力于这种动态构建。所以通过优化操作,使静态网络的使用成为可能。但是,即使网络优化成功,其内存消耗仍然比传统的方法大得多。所以,处理基于WFST的ASR系统必须注意它的内存消耗。

WFST方法的另一个问题是,它在知识更新方面提供的灵活性较低。例如,当我们添加新单词或使系统适应新主题时,词典和语言模型需要更新。然而,一旦组成和优化了单个WFST,这样的部分知识更新就不容易完成。每当对任何知识源进行更改时,都需要更新相关的组件WFSTs。因此,重构一个完全组成和优化的WFST需要很长时间,通常需要很大的内存。因此,WFST方法被认为不适合一些用户经常修改ASR系统的知识来源的应用。

另一方面,多通道搜索策略通常是为了减少计算和内存使用。在一般的两遍搜索方法中,解码器在第一遍中使用较简单的语言模型(通常是bigram模型),并生成包含多个假设的词格。在第二次测试中,解码器使用更复杂的语言模型(通常是三字母组合或高阶n-gram模型)重测晶格,并在晶格中选择一个更好的假设。这种方法也可以在WFST框架中工作。然而,多通道方法对于在线应用有一个缺点。说话后有一定的潜伏期。虽然第一次传递可以与语音输入同步执行,但第二次传递必须等待第一次传递完成,直到检测到语音的端点才可以完成。此外,由于即使使用二进制语言模型,构建一个完全组合的WFST也需要一定的计算量和内存,因此多通道方法并没有完全排除在线操作知识源的困难。

二、动态组合和优化(ON-THE-FLY COMPOSITION AND OPTIMIZATION)

使用完全组合的WFST的一种实用替代方案是分离的WFST的动态组合(有时称为按需、延迟或延迟组合)。在这种方法中,组件WFST被分成若干组,并为每组组成和优化一个WFST。在解码过程中,单通解码器根据需要部分地组合这些WFST。
例如,将一组用于语音识别的WFSTs {H,C,L,G}分为{H,C,L}和{G},其中H,C,L,G分别是HMMs、三音上下文依赖、发音词典和n-gram语言模型的组件WFSTs。HCL的构造在计算上比全部的构造要节约得多,因为它不包括最大的分量G,即在每一步对较小的WFST进行确定性或最小化。由于G是由n-gram模型构成的,G已经是确定性的,所以可以忽略G的优化。在这里插入图片描述

在解码过程中,两个WFSTs HCL和G被动态组合。由于HCL和G都小于N,我们可以节省解码器的运行时内存。HCL◦G的每个状态或过渡是在维特比解码中需要时第一次组成的。一旦完成状态或转换,就可以将其保存在内存中,因此在再次需要时不需要组合。如果我们想节省内存,我们可以删除一些不经常使用的,然后根据需要重新组合它们。
动态方法基于这样一个事实:大多数WFST操作都可以动态执行。当我们使用WFST执行动态操作时,首先,除了初始状态外,生成的WFST不存在任何状态或转换。当产生的WFST被另一个操作或应用程序(如语音识别解码器)使用时,它们根据需要进行。这些操作,即并集、连接、闭包、组合、投影、反演、决定、移除等等,都可以动态使用。
这些操作的算法主要包括以下步骤:

  1. 生成初始状态并将其放入队列中。
  2. 当队列不是空的时候,重复步骤(a)-©。
    (a)根据任意队列规则从队列中移除一个状态,
    (b)根据操作生成从状态及其目的地状态(如果还没有生成的话)发出的转换,以及
    (c)在队列中放置每个新的目标状态。

总结

通过以上步骤,我们可以按照从初始状态遍历WFST的顺序生成状态和转换,我们可以选择任何遍历顺序,包括深度优先、宽度优先和最佳优先顺序。顺序由要使用的队列规则决定。这种类型的算法可以很容易地扩展到它的动态版本。
假设需要一组从已经生成的状态发出的转换。如果该状态包含在队列中,这意味着还没有生成从该状态发出的转换。因此,状态从队列中取出,根据步骤2.(a) -(c)生成新的转换及其目标状态。如果状态没有包含在队列中,这意味着已经生成了转换。这样的转换只是简单地返回。通过这种方式,我们可以使用根据需要生成的状态和转换,但是要求它们的源状态曾经被使用过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值