热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

AIBigKaldi(十四)|Kaldi的特征转换模型(源码解析)

 本文来自公众号“AI大道理”。  三音子模型词错误率为:36.03%,对比单音素模型词错误率为50.58%。可见三音素模型识别率已经有了提高。能否继续优化模型?又要从哪些方面入手

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

 

 

三音子模型词错误率为:36.03%,对比单音素模型词错误率为50.58%。

可见三音素模型识别率已经有了提高。

能否继续优化模型?又要从哪些方面入手进行优化呢?

特征变换带来一定的改善。

语音识别中,为了增强音频特征的鲁棒性,需要提取区分能力较强的特征向量,常用的方法是PCA和LDA算法。

 

以kaldi的thchs30为例。

 

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》总过程

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

 

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》特征变换

 

特征变换是指将一帧声学特征经过某种运算转化为另外一帧特征的过程。

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

特征变换又分为有监督特征变换和无监督特征变换。

无监督特征变换不依赖标注信息,包括差分、拼帧、归一化等。

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

有监督特征变换依赖标注信息,估计一组变换系数来增强输入特征的表征能力,来优化声学模型。

灵魂的拷问:如何估计这组变换系数呢?

答:线性判别分析(LDA)、最大似然线性变换(MLLT)。

 

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》主成分分析(PCA)

在讲LDA前,先来了解一下PCA。

LDA和PCA就像是一对孪生兄弟,总是被放在一起比较。

PCA是一种无监督的数据降维方法。

PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。

 

灵魂的拷问:为什么要进行降维?

答:机器学习中处理成千上万甚至几十万维的情况也并不罕见,在这种情况下,机器学习的资源消耗是不可接受的,因此我们必须对数据进行降维。

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

 

PCA的本质:是将方差最大的方向作为主要特征,并且在各个正交方向上将数据“离相关”,也就是让它们在不同正交方向上没有相关性。

PCA降维的目标:将数据投影到方差最大的几个相互正交的方向上。

PCA算法寻找,保留数据中最有效的,最重要的成分,舍去一些冗余的,包含信息量减少的成分。

 

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》线性判别分析(LDA)

LDA指的是线性判别分析,是一种监督学习的降维技术,它的数据集的每个样本是有类别输出的。

使用PCA模型的时候,是不利用类别标签的,而LDA在进行数据降维的时候是利用数据的类别标签提供的信息的。 

与PCA保持数据信息不同,LDA是为了使得降维后的数据点尽可能地容易被区分。

LDA的核心思想:投影后类内方差最小,类间的方差最大。

简单来说就是同类的数据集聚集的紧一点,不同类的离得远一点。

 

从几何的角度来看,PCA和LDA都是讲数据投影到新的相互正交的坐标轴上。

只不过在投影的过程中他们使用的约束是不同的,也可以说目标是不同的。

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

 

LDA降维的目标:将带有标签的数据降维,投影到低维空间同时满足三个条件:

  • 尽可能多地保留数据样本的信息(即选择最大的特征是对应的特征向量所代表的的方向)。

  • 寻找使样本尽可能好分的最佳投影方向。

  • 投影后使得同类样本尽可能近,不同类样本尽可能远。

 

LDA算法是通过一个变化矩阵来达到降维的目的,LDA与PCA不同之处在于,LDA使得样本内的分布凝聚,使得样本间的分布疏远,这样的特征更加有代表性。

 

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》 最大似然线性变换(MLLT)

经过LDA变换后的协方差矩阵不能对角化,因此需要经过MLLT进行变换。

最大似然线性变换有很多种,这一步是半绑定协方差(STC),在kaldi中称为MLLT,用于全局特征变换。

MFCC→CMVN→Splice→LDA→MLLT→final.mat,然后训练GMM。

 LDA根据降维特征向量建立HMM状态。

MLLT根据LDA降维后的特征空间获得每一个说话人的唯一变换。

MLLT实际上是说话人的归一化。

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》 6 lda-mllt模型

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》6.1 train_lda_mllt.sh

功能:

使用mfcc+cmvn+splice+LDA特征,获得final.mat(LDA和MLLT变换合在一起)
主要是特征做LDA/MLLT变换,转换以后的特征重新训练GMM模型。

通常在LDA之前对原始MFCC特征进行帧拼接(例如将九个连续的帧拼接在一起)。

splice-feats实现了帧的拼接:

feats="ark:splice-feats scp:data/train.scp ark:- |
transform-feats $dir/0.mat ark:- ark:-|"

LDA+MLLT指的是我们在计算MFCC后变换特征的方式:我们在多个帧之间拼接,使用线性判别分析降低维数(默认情况下降到40),然后通过多次迭代估计称为MLLT或STC的对角化变换。

过程之道:

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

该程序的执行流程为:

  • 估计出LDA变换矩阵M,特征经过LDA转换。

  • 用转换后的特征重新训练GMM。

  • 计算MLLT的统计量。

  • 更新MLLT矩阵T。

  • 更新模型的均值μjm←Tμjm

  • 更新转换矩阵M←TM

 

 

训练过程:

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

训练迭代次数num_iters=35。

训练完毕。

训练好的lda-mllt模型:

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

训练好的三音子模型:

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

可见,特征维度变成40,而传统MFCC是39维的。

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》6.2  thchs-30_decode.sh

功能:

lda-mllt模型解码识别。

在解码时,由于mllt是全局变换,因此只需要使用训练过程中估计的矩阵进行特征变换即可。
 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

lda-mllt模型部分解码识别(词级别):

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

真正结果(标签词):

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

 

单音素模型词错误率为50.58%,三音子模型词错误率为36.03%,lda-mllt模型词错误率为32.12%。

可见词错误率继续下降,模型越来越好。

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

lda-mllt模型部分解码识别(音素级别):

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

真正结果(标签音素):

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

 

单音素模型音素错误率为32.43%,三音素模型音素错误率为20.44%,lda-mllt模型音素错误率为17.06%。

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

 

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》6.3  align_si.sh 

功能:

对齐,为接下来的模型优化做准备。

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

对齐结果:

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

 

 

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》总结

单音素模型词错误率为50.58%,三音子模型词错误率为36.03%,lda-mllt模型词错误率为32.12%。

可见lda-mllt模型识别率继续有了一定的提高。

能否继续优化模型?又要从哪些方面入手进行优化呢?

说话人自适应技术将继续改善现有模型。

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

   

 

 ——————

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

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

 

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

《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》     《AIBigKaldi(十四)| Kaldi的特征转换模型(源码解析)》

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

 

投稿吧   | 留言吧

 

 


推荐阅读
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 词袋模型的通俗介绍
    词,袋, ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文详细介绍了商汤科技面试中涉及的CV算法面经内容,包括CornerNet的介绍与CornerPooling的解决方案、Mimic知识蒸馏的实现方式、MobileNet的特点、普通卷积和DW PW卷积的计算量推导、Residual结构的来源等。同时还讨论了在人脸关键点和检测中的mimic实现方式、pose对人脸关键点的提升作用、目标检测中可能遇到的问题以及处理检测类别冲突的方法。此外,还涉及了对机器学习的了解程度和相似度分析的问题。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
  • 建立分类感知器二元模型对样本数据进行分类
    本文介绍了建立分类感知器二元模型对样本数据进行分类的方法。通过建立线性模型,使用最小二乘、Logistic回归等方法进行建模,考虑到可能性的大小等因素。通过极大似然估计求得分类器的参数,使用牛顿-拉菲森迭代方法求解方程组。同时介绍了梯度上升算法和牛顿迭代的收敛速度比较。最后给出了公式法和logistic regression的实现示例。 ... [详细]
  • 数据结构与算法的重要性及基本概念、存储结构和算法分析
    数据结构与算法在编程领域中的重要性不可忽视,无论从事何种岗位,都需要掌握数据结构和算法。本文介绍了数据结构与算法的基本概念、存储结构和算法分析。其中包括线性结构、树结构、图结构、栈、队列、串、查找、排序等内容。此外,还介绍了图论算法、贪婪算法、分治算法、动态规划、随机化算法和回溯算法等高级数据结构和算法。掌握这些知识对于提高编程能力、解决问题具有重要意义。 ... [详细]
  • 读手语图像识别论文笔记2
    文章目录一、前言二、笔记1.名词解释2.流程分析上一篇快速门:读手语图像识别论文笔记1(手语识别背景和方法)一、前言一句:“做完了&#x ... [详细]
author-avatar
爱生活爱花落_485
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有