Lattice

时间:2023-01-12 15:36:02

Lattice是一个无环WFSA,结点可以是hmm状态、hmm(音素)、词,每个结点是一段音频在某个时间的对齐

用训练好的声学模型、现成的语言模型和发音字典构建解码网络(wfst),最后将提取的测试集的语音特征输入以上解码网络,得到网格结构(lattice)的语音识别结果。

Lattice可用于语言模型的得分重估计

一个Lattice是为一段音频产生的,Lattice是一个带权无向图,其中每个点代表一个声学单元,每条弧包含两个权重(声学权重和语言权重)。解码时,会使用Viterbi算法?结合两种权重搜索Lattice,得分最高的路径就是解码结果。

识别的结果以lattice呈现,可以保存为standard lattice format (SLF)文件。

Lattice输出可以用于重打分、生成n-best结果.

Lattice类型只是一个基于特定半环模板化的 FST

来自 <https://shiweipku.gitbooks.io/chinese-doc-of-kaldi/content/lattice.html>

Lattice的运算操作:

修剪Lattice

计算最优路径

计算N-best结果

语言模型重打分

概率缩放

Lattice联合(用于MMI)

Lattice组合

Lattice内插

Lattice由LatticeSimpleDecoder类(解码器)生成,这个类是一个从SimpleDecoder类修改得来。 SimpleDecoder是Viterbi-Beam搜索算法的一种直接实现。

Lattice的产生过程大致为:LatticeSimpleDecoder首先产生状态级晶格,并且用Lattice-Delta修剪它,然后使用特殊的确定性算法,只保留每个单词序列的最佳路径。

http://kaldi-asr.org/doc/lattices.html

因为每个状态一个token,限制了可能得到的不同token历史记录的数量,所以他们不是最合适的。若每个模型状态对应多个token,并且如果认为来自不同前序单词的token是不同的,就可以避免上述限制。这样就为生成hypotheses(译者注:意为可能的识别结果)的lattice(译者注:网格)提供了可能,lattice比单Best输出更有用。基于这个思想的算法称为lattice N-best。

对输入语音进行解码转录成文本形成搜索空间, 为了减少识别错误,这种搜索空间通常不是单一的,而是以多个假设的形式存在(如网格形式, N-best 等)

Lattice

Lattices describe all theories considered by the Recognizer that have not been pruned out. Lattices are a directed graph containingNodes and Edges. A Node that corresponds to a theory that a word was spoken over a particular period of time. An Edge that corresponds to the score of one word following another. The usual result transcript is the sequence of Nodes though the Lattice with the best scoring path. Lattices are a useful tool for analyzing "alternate results".

Lattices是一个有向图,结点是词,边是转移概率。转录的结果是遍历Lattices后得到的最高得分词序列

源代码中Lattice类型的解析

typedef fst::VectorFst<LatticeArc> Lattice;

Lattice是一个弧为LatticeArc基于VectorFst模板的FST

typedef fst::ArcTpl<LatticeWeight> LatticeArc;

LatticeArc是一个弧参数为LatticeWeight基于ArcTpl的类

typedef fst::LatticeWeightTpl<BaseFloat> LatticeWeight;

LatticeWeight是一个使用BaseFloat类型作为浮点型基于LatticeWeightTpl的类

LatticeWeightTpl是一个模板,定义在fst命名空间(fstext/lattice-weight.h),与词典半环类似

即OpenFst中的LexicographicWeight模板:

LexicographicWeight<TropicalWeight, TropicalWeight>

这两个模板的加运算都被定义为取max,但是"max"被不同地定义。

LexicographicWeight首先比较第一个元素,并使用第二个元素打破关系。 LatticeWeight首先比较总和; 然后使用差异来打破关系。 因此,具有(a,b)的LatticeWeight等价于具有(a + b,a-b)的LexigraphicWeight。 LatticeWeight背后的基本直觉是保持采用最低代价路径(其中总代价是语言加声学代价)的语义,同时分别"记住"声学代价和语言代价是什么。 在理想世界中,我们可能希望保持更多的信息分离:例如,语言模型代价,转换模型代价,发音概率代价。 但这是不实际的,因为这些信息在解码图中全部混合在一起,并且在解码图中将其分离将导致解码图大小的显着扩展。

如前所述,Lattice中的输入符号表示transition-ids,输出符号表示字(或解码图的输出上的任何符号)。

当设计Kaldi时,我们考虑使用LexicographicWeight类型,而不是LatticeWeight类型,其中第一个元素是(graph + acoustic)成本,第二个元素就是声音成本。 我们最终决定反对这一点,因为虽然它可能为某些目的稍微更有效,我们认为这将是太混乱。

在lattice上的许多算法(例如,采取最佳路径或修剪)对于使用Lattice类型而不是CompactLattice类型是最有效的。 问题是,使用CompactLattice类型,权重包含transition-id的序列,并且像采取最佳路径的操作将权重作乘法,这对应于将这些序列链接在一起。 对于许多算法,需要的时间是lattice中字长度的两倍。如上所述,您可以从档案(ark)中读取Lattice,即使它包含CompactLattice,因为Holder类型(LatticeHolder)将执行自动转换。 因此,即使在"lats_rspecifier"中指定的归档文件或脚本文件包含CompactLattice格式(通常会这样),下面代码仍然有效,因为这是我们通常写Lattice的方式。

SequentialLatticeReader lattice_reader(lats_rspecifier);

for (; !lattice_reader.Done(); lattice_reader.Next()) {

std::string key = lattice_reader.Key();

Lattice lat = lattice_reader.Value();

...

}

格式类型转换的示例是:

Lattice lat;

// initialize lat.

CompactLattice compact_lat;

ConvertLattice(lat, &compact_lat);

转换为CompactLattice类型涉及一个"因式分解"操作,函数fst :: Factor()(由fstext / factor.h中的us定义),它标识出可以组合成一个CompactLattice弧的状态链。 将OpenFst算法应用于lattice的典型示例如下(此代码,从latbin / lattice-best-path.cc修改,找到通过lattice的最佳路径):

Lattice lat;

// initialize lat.

Lattice best_path;

fst::ShortestPath(lat, &best_path);

计算通过lattice的最佳路径

程序 lattice-best-path 计算通过lattice的最佳路径,并输出相应的输入符号序列(对齐,alignment)和输出符号序列(转录,transcription)。 像往常一样,输入和输出是以档案的形式。示例命令行是:

lattice-best-path --acoustic-scale=0.1 ark:in.lats ark:out.tra ark:out.ali

程序lattice-nbest计算通过lattice的N个最佳路径(使用OpenFst的ShortestPath()函数),并将结果作为lattice(CompactLattice)输出,但其具有特殊结构。 如OpenFst中的ShortestPath()函数所记录的,开始状态有(最多)n个发射弧,每个弧连接到一条单独路径的开始。 注意,这些路径可以共享后缀。 示例命令行是:

lattice-nbest --n=10 --acoustic-scale=0.1 ark:in.lats ark:out.nbest

语言模型重打分

因为LatticeWeight的"图部分"(第一部分)包含的语言模型得分与transition-model得分和任意发音或静音概率混合在一起的,所以我们不能将其替换为新的语言模型得分,否则我们会失去转移概率和发音概率。 相反,我们必须先减去"旧"LM概率,然后添加新的LM概率。 这两个阶段的核心操作是"组合"(也有一些权重的缩放)。 这样做的命令行是:首先,删除旧的LM概率:

lattice-lmrescore --lm-scale=-1.0 ark:in.lats G_old.fst ark:nolm.lats

然后添加新的LM概率:

lattice-lmrescore --lm-scale=1.0 ark:nolm.lats G_new.fst ark:out.lats

注意,还有其他方法来做到这一点;请参阅下面的lattice-compose的文档(告诉我们程序lattice-lmrescore是什么).实际上,我们将首先使用简单的版本。假设我们给出了LM-scale和LM G.fst。我们首先将G.fst中的所有代价乘以S.然后对于每个lattice,我们在右边用G组成它(L o G),对其使用lattice-determinize(仅保留每个单词序列通过G的最佳路径),并将其输出。这对positive S的效果良好,但对于negative S,它将相当于对每个单词序列采用通过G的最差路径。为了解决这个问题,我们做如下改动。对于每个输入的lattice,我们首先通过S的倒数来缩放点阵的语言模型(或LM)成本;我们然后在G.fst右边合成;我们对所得到的lattice运行lattice-determinize(参见上文),其对每个单词序列仅保留通过lattice的最佳路径;然后我们将lattice图/ LM分数缩放为S.这对于negative S是正确的。当输入的lattice对于每个单词序列仅具有通过它的单个路径时,上述过程才有意义(例如,如果它是lattice确定的)。我们假设在程序之间传递的所有lattice都有这个属性(这就是为什么写出"raw"状态级lattice不是一个好主意,除非你知道你在做什么)。

注意,为了使composition(组合的fst)工作,该程序需要将G.fst从"极小-加法半环"上映射到LatticeWeight半环。 这通过将G.fst的权重放入权重的第一部分("图"部分),并且将权重的第二部分置为零(在半环中,这是1)来做到这一点。在C++级别,这个映射使用OpenFst的MapFst机制来完成.其中,我们定义了一个Mapper类来将StdArc映射到LatticeArc,然后创建一个类型为MapFst的对象,根据需要进行评估,并将G.fst转换为LatticeWeight权重类型。

  • lattice的改进

人们为了研究如何对ASR的输出建立有效的索引进行了

很多研究,lattice中包含大量的冗余信息,除了直接在lattice上建立索引之

外,人们还研究了如何去除lattice中的冗余信息。人们提出了类似lattice的

模型,但去除了lattice中的冗余信息,如混淆网络

[33]

和PSPLs(Position

SpecificPosteriorLattices)[34]。

Lattice

Lattice的更多相关文章

  1. Lattice Reduction &lpar;LLL&rpar; 算法C代码实现

    废话不多说,大名鼎鼎的Lenstra-Lenstra-Lovasz(LLL) 算法.实现参考论文:Factoring Polynomials with Rational Coefficients, 作 ...

  2. lattice 与 modelsim 仿真 笔记

    对于 lattice  Diamond 与 modelsim 的联合仿真,我总结了一句话,那就是—— 难者不会,会者不难.  也许刚开始 觉得 摸不着 头脑,但是 一旦学会 感觉还是很简单和直观的. ...

  3. Lattice Codes

    最近在做的一些关于lattice codes的工作,想记录下来. 首先,我认为lattice coding是一种联合编码调制技术,将消息序列映射到星座点.其中一个良好的性质是lattice point ...

  4. Lattice FPGA 板子 调试笔记

    最近在调试LATTICE  FPGA 做的视频板子,颇不顺利,所以记录下来作为以后的参考: 1.FPGA的IO口不是所有的都是双向的,有些有特殊作用的是单向的. 在查阅 LatticeECP3-17E ...

  5. LATTICE 存储之FIFO的使用

    坑,,以后填 对于Lattice 的  FIFO 存储器分为两种,见下图: 这两个的主要区别是一个后面加DC一个不加,那这个DC是什么意思呢??DC这里是Dual  Clock的意思,也就是双时钟的意 ...

  6. Lattice Diamond 学习之编译、检查和设置约束

    在新建工程以及完成代码的输入之后.则就要进行编译,并检测错误. 一. Generate Hierarchy(产生层次结构). 1. 点击Generate Hierarchy 图标或者Design -- ...

  7. Lattice Diamond 和 ispLEVER 的不同之处

    Lattice Diamond 和 ispLEVER.有一些不同,尤其是如何管理工程的不同,包括以下几点: 1.ispLEVER 有多种工程类型,不同的程序文件类型需要不同的类型的工程:但是Diamo ...

  8. 【lattice软核】MICO8流程

    The LatticeMico System software is composed of three bundled applications:  Mico System Builder (MS ...

  9. 数论 - 欧拉函数的运用 --- poj 3090 &colon; Visible Lattice Points

    Visible Lattice Points Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5636   Accepted: ...

  10. spoj 7001&period; Visible Lattice Points GCD问题 莫比乌斯反演

    SPOJ Problem Set (classical) 7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N la ...

随机推荐

  1. JavaScript开发的技巧

    1. 使用===取代==    ==和!=操作符会在需要的情况下自动转换数据类型.但===和!==不会,它们会同时比较值和数据类型,这也使得它们要比==和!=快. "){ //速度慢 } & ...

  2. mysql ALTER COLUMN MODIFY COLUMN CHANGE COLUMN 区别及用法 &lpar;转&rpar;

    -- 设置或删除列的默认值.该操作会直接修改.frm文件而不涉及表数据.此操作很快 -- ALTER COLUMN ALTER TABLE  dsp_ad_center.XianDuan ALTER  ...

  3. android 支持分组和联系人展示的一个小样例

    先看效果图: 要实现这个效果,activity必须实现ExpandableListActivity @Override public void onCreate(Bundle savedInstanc ...

  4. Lichee (六) 优化配置的微内核

    我们的分析<Lichee(二) 在sun4i_crane平台下的编译 >的时候.竟然没有一个步骤是在配置内核 make ARCH=arm menuconfig 细致的读过的代码的会发现,在 ...

  5. FZU Problem 2150 Fire Game(bfs)

    这个题真要好好说一下了,比赛的时候怎么过都过不了,压点总是出错(vis应该初始化为inf,但是我初始化成了-1....),wa了n次,后来想到完全可以避免这个问题,只要入队列的时候判断一下就行了. 由 ...

  6. json&lowbar;encode&lpar;&dollar;b&comma; JSON&lowbar;FORCE&lowbar;OBJECT&rpar; 可以强制转换成对象

    最近在为移动端的项目提供接口,数据格式都为json,不过在过程中遇到一个小问题,代码如下: 情况一: $tmp = array('a','b','c'); echo json_encode($tmp) ...

  7. day 7-7 线程池与进程池

    一. 进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这 ...

  8. 邮件收取客户端LumiSoft类库接收yahoo邮件的问题。

    //开始循环取邮件数据 m_pImap.Fetch( false, IMAP_t_SeqSet.Parse("1:*"), new IMAP_t_Fetch_i[]{ new IM ...

  9. 关于select的默认样式问题

    select { border: solid 1px #000; appearance:none; -moz-appearance:none; -webkit-appearance:none; pad ...

  10. exe4j 安装

    需要看清楚对应的jre版本 4.6---jre1.6 5.0以上---jre1.7