ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

AIBigKaldi(九)| Kaldi的解码搜索(源码解析)

2020-12-29 10:00:35  阅读:367  来源: 互联网

标签:AIBigKaldi AI 解码 Kaldi 源码 语音 模型


本文来自公众号“AI大道理”。

 

构建了HCLG解码图后,解码就是在这个图上寻找一条最优路径。

最优路径上去除epsilon后的输出标签序列就是单词级别的识别结果。

(本篇主要解析kaldi源码实现,详细算法原理请阅读:

AI大语音(十一)——WFST解码器(上)(深度解析)

 

1 解码

5 decode.sh

源码解析:

过程之道:

 

 

2 Viterbi静态解码

 

先看最基础的Viterbi解码gmm-decode-simple.cc。

功能:
使用基于GMM的模型对特征进行解码。
采用维特比算法进行解码,仅产生线性序列。
产生的任何lattice都是线性的,即只有一个解码结果。
输入:GMM声学模型、HCLG.fst解码图、测试语音声学特征
输出:解码结果(词序列、对齐序列、lattice)

过程之道:

 

1)解码第一帧时,从状态节点0出发,首先进行ProcessEmitting处理的发射状态转移弧,节点0转移到节点3、2、6。接着ProcessNonemitting沿着虚线非发射转移弧将6传播到同一时刻下的状态节点1。

2)解码第二帧时首先切换Token列表,把cur_toks列表转变到pre_toks列表后,将cur_toks置空。然后再进行ProcessEmitting、ProcessNonemitting。

3)随着时间的推移,帧的进行,到达最后一帧,选择最低累计代价的Token,然后以次Token回溯最优路径。

 

kaldi的gmm-decode-simple实现了这个过程。

 

函数解析:

  •  decoder.Decode(&gmm_decodable)
    解码过程:

 

 

 

 

 

 

  •  DecodableAmDiagGmmScaled  gmm_decodable()

根据声学模型,计算出某一帧的声学分数。
声学得分是通过高斯混合概率密度函数计算得到的。

  •  GetBestPasth()

根据最后一个token进行回溯,得到解码结果。

把结果放到这个词格中,词格中是单一路径。

  • GetLinearSymbolSequence(decoded,NULL,&words,NULL)

从线性词格中取出结果,写入到words中。words中是word ID,要根据词典把id真正转化为单词序列,得到最后的结果。

 

3 Lattice静态解码

 

5.1 gmm-latgen-faster
功能:

解码识别:基于GMM模型生成lattices网格,保留N-best路径。

(不能保证viterbi给的最优路径就是真正的对的路径)
源码解析:

 

 

过程之道:

lattice生成的解码结果并非单一路径,而是N-best路径。

在每次令牌传递过程中,lattice也像viterbi解码那样删除旧令牌的方法来生成,而是通过独特的ForwardLink前向链接机制来生成lattice。

前向链接ForwardList与转移弧不同,用来链接前后两帧之间的发射转移弧之间的Token,或同一时刻非发射转移弧之间的Token。

基于WFST的Lattice静态解码过程:

 

kaldi中的gmm-latgen-faster实现了lattice解码。

 

 

函数解析:

 

其中解码、回溯部分、写入文件部分也包含在这个函数内。

  • decoder.Decode(&decodable)

    进行解码。

 

 

 

令牌传递:

LatticeDecode并不是向viterbi解码那样传递令牌本身,而是在创建新令牌后,使用一个前向链接把令牌链接起来。

 

 

4  诊断评分

 

 

最后从所有错误率中找到最低的那个错误率。

Kaldi的YesNo实例解码识别错误率0%。

其中 N 是 num总数,C 是 corr 准确数,S 是 sub 替换错误,D 是 Del 是删除错误,I 是 INS 插入错误。

 

5 解码结果

 

解码识别部分结果。

 

6 总结


在YesNo实例中,kaldi进行了数据准备、特征提取、单音子模型训练、构造HCLG.fst解码图、利用解码图进行lattice解码识别等一系列步骤。
一个问题:
单音子模型的假设是一个音素的实际发音与其左右的音素无关。
这个假设与实际并不符合。
由于单音子模型过于简单,识别结果不能达到最好,因此需要继续优化升级。
就此引入多音子的模型。

最为熟悉的就是三音子模型,即上下文相关的声学模型。

 

 

 

下期预告

AIBigKaldi(十)|  Kaldi的三音子模型训练

往期精选

AIBigKaldi(八)|  Kaldi的解码图构造(下)

AIBigKaldi(七)|  Kaldi的解码图构造(上)

AIBigKaldi(六)|  Kaldi的单音子模型训练(下)

AIBigKaldi(五)|  Kaldi的单音子模型训练(上)

AIBigKaldi(四)|  Kaldi的特征提取

AIBigKaldi(三)|  Kaldi的数据准备

AIBigKaldi(二)|  Kaldi的I/O机制

AIBigKaldi(一)|  Kaldi的目录结构

AI大语音(十四)——区分性训练
AI大语音(十三)——DNN-HMM
AI大语音(十二)——WFST解码器(下)
AI大语音(十一)——WFST解码器(上)

AI大语音(十)——N-gram语言模型
AI大语音(九)——基于GMM-HMM的连续语音识别系统
AI大语音(八)——GMM-HMM声学模型
AI大语音(七)——基于GMM的0-9语音识别系统
AI大语音(六)——混合高斯模型(GMM)
AI大语音(五)——隐马尔科夫模型(HMM)
AI大语音(四)——MFCC特征提取
AI大语音(三)——傅里叶变换家族
AI大语音(二)——语音预处理
AI大语音(一)——语音识别基础

 

 ——————

浅谈则止,细致入微AI大道理

扫描下方“AI大道理”,选择“关注”公众号

—————————————————————

     

—————————————————————

投稿吧   | 留言吧

 

标签:AIBigKaldi,AI,解码,Kaldi,源码,语音,模型
来源: https://blog.csdn.net/qq_42734492/article/details/111879996

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有