【NLP】语音识别 — GMM, HMM

 一、说明

        在语音识别的深度学习(DL)时代之前,HMM和GMM是语音识别的两项必学技术。现在,有将HMM与深度学习相结合的混合系统,并且有些系统是免费的HMM。我们现在有更多的设计选择。然而,对于许多生成模型来说,HMM仍然很重要。但无论状态如何,语音识别都有助于我们更好地理解HMM和GMM在ML环境中的应用。所以停止长脸,让我们有时花在上面。

二、自动语音识别 (ASR)

        让我们先了解一下高级概述。下图是语音识别的高级体系结构,它将HMM(隐马尔可夫模型)与语音识别联系起来。

        从音频剪辑开始,我们滑动宽度为 25 毫秒、间隔 10 毫秒的窗口以提取 MFCC 特征。对于每个窗口框架,将提取 39 个 MFCC 参数。语音识别的主要目标是构建一个统计模型,从特征向量 X 序列推断文本序列 W(例如“猫坐在垫子上”)。

        一种方法查找所有可能的单词序列(最大长度有限),并找到与输入声学特征最匹配的单词序列。

        该模型依赖于构建语言模型 P(W)、发音词典模型和声学模型 PX|W)(生成模型),如下所示。

从源代码修改

        发音模型可以使用表格将单词转换为音素,或者语料库已经使用音素转录。声学模型是关于在给定一系列电话而不是单词的情况下对一系列特征向量进行建模。但我们将继续使用符号 pX|W) 作为声学模型。只是要注意。

        语言模型是关于单词序列的可能性。例如,“我看电影”比“我看电影”或“我看苹果”的可能性更大。它根据前面的单词预测下一个单词。如果我们用一阶马尔可夫链近似它,下一个单词将仅取决于当前单词。我们可以通过计算语料库中单词对的出现来估计它。

        通过结合声学模型和语言模型,我们搜索具有最大可能性的文本序列。

        这种方法听起来很间接,搜索看起来效率低下或不可能。但是pX|W)在语音识别中建模要容易得多。可以使用高斯混合模型 (GMM) 对电话的特征分布进行建模。我们将通过训练数据来学习它。手机和相应可观测值之间的转换可以使用隐马尔可夫模型 (HMM) 进行建模。因此,如果我们能找到一种有效搜索电话序列的最佳方法,这听起来可能还不错。

        HMM 模型由隐藏变量和可观察量组成。下面的顶部节点表示电话,底部节点表示相应的可观察量(音频功能)。水平箭头演示了电话序列中真实标签“她只是......”的过渡。

        在语音识别中,可观察量可以用从相应的音频帧中提取的39个MFCC特征来表示。好消息是,使用此HMM模型,我们不需要逐个搜索电话序列。否则,复杂性会随着电话数量的增加呈指数级增长。使用维特比算法或其他HMM方法,我们可以在多项式时间内找到最佳序列。我们稍后会回到这个问题。

        下图是自动语音识别 (ASR) 的可能实现。结合有关词典,声学模型和语言模型的信息,我们可以使用Viterbi解码器找到最佳的电话序列。

从源代码修改(O在这里与X相同)

        让我们快速回顾一下,我们可以用HMM对声学模型PX|W)进行建模。HMM 模型上的箭头将表示电话转换或指向可观察量的链接。为了对我们观察到的音频特征进行建模,我们从训练数据中学习GMM模型。因此,让我们先在一般背景下更多地了解HMM和GMM。

三、隐马尔可夫模型

        马尔可夫链包含系统的所有可能状态以及从一个状态过渡到另一个状态的概率。

        一阶马尔可夫链假设下一个状态仅取决于当前状态。为简单起见,我们通常将其称为马尔可夫链。

        这个模型将更容易处理。然而,在许多 ML 系统中,并非所有状态都是可观察的,我们称这些状态为隐藏状态或内部状态。有些人可能会将它们视为输入的潜在因素。例如,要知道我是快乐还是悲伤可能并不容易。我的内部状态将是 {H 或 S}。但是我们可以从观察中得到一些提示。例如,当我高兴时,我有0.2的机会看电影,但当我悲伤时,这个机会上升到0.4。在给定内部状态的情况下观察可观测物的概率称为发射概率。从一个内部状态过渡到另一个内部状态的概率称为转移概率

        对于语音识别,可观察量是每个音频帧中的内容。我们可以使用 MFCC 参数来表示它。让我们看看我们可以用 HMM 做什么。

前向算法的可能性

HMM 由跃迁和发射概率建模。

        给定学习了HMM模型,我们可以使用前向算法来计算观察的可能性。我们的目标是总结所有可能状态序列的观测概率:

        但我们必须聪明地做到这一点。我们不能一次对所有可能的状态序列求和。它具有指数级的复杂性。

        我们的策略将采用分而治之的方法。如果我们可以递归地表达计算,我们就可以将问题分解为中间步骤。在 HMM 中,我们使用时间 t-1 和/或 t+1 的结果来解决时间 t 的问题。下面的圆圈代表时间 t 时的 HMM 隐藏状态 j。因此,即使状态序列的数量随时间呈指数增长,如果我们能够随时间递归地表达计算,我们也可以线性求解它。

        这是打破指数诅咒的动态编程的思想。在时间 t 处,截至时间 t 的观测概率为:

        让我们将红色下划线的项重命名为tj)(前向概率α并检查我们是否可以递归表示它。由于当前观测值仅取决于当前状态,因此α可以表示为:

        所以它确实有一个递归关系。以下是使用递归计算给定模型 λ 的观测值可能性的步骤。我们不是单独对每个状态序列求和,而是计算从时间步长 1 到结束(时间 T)的α。如果有 k 个内部状态,则复杂度将仅为 O(k²T),而不是指数。

        下面是一个示例,我们从左侧的初始状态分布开始。然后我们将α的值向右传播。我们计算每个状态的α,并为每个时间步重复此操作。

        接下来,给定HMM模型,我们如何找到给定观察序列的内部状态。此过程称为解码。这对于语音识别尤其有趣。如果我们有一个音频剪辑,则内部状态代表电话。语音识别可以被视为在给定音频剪辑的情况下找到这些内部状态。

解码(查找内部状态 — 维特比算法)

        同样,我们希望递归地表达我们的组件。给定时间 t 处的状态为 j,vtj) 是观测序列与最优状态序列的联合概率。

        因此,不仅可以完成,方程类似于前向算法,只是求和被最大函数替换。维特比算法不是在前向算法中对所有可能的状态序列求和,而是采用最可能的路径。

从源代码修改

        查找最大化观测值可能性的内部状态类似于似然法。我们只是用最大函数替换求和。

        在这个算法中,我们还记录了在时间t(上面的红色箭头)通向每个节点的最大路径,即我们回溯每个节点的最佳路径。例如,我们从 t=1 的快乐状态 H 过渡到 t=2 的快乐状态 H

学习(鲍姆-韦尔奇算法/前向-后向算法)

        现在,它涉及到困难的部分。我们如何学习HMM模型?这可以通过Baum-Welch算法(前向-后向算法)来完成,以学习跃迁和发射概率。这项任务听起来不可能完成,因为在我们的计算中,这两种概率都非常纠结。但从某种角度来看,如果我们知道状态占用概率(时间t的状态分布),我们就可以推导出发射概率和转移概率。如果我们知道这两个概率,我们可以推导出时间 t 的状态分布。这就是我们在EM算法中讨论的先有鸡还是先有蛋的问题。EM算法在迭代步骤中解决了这个问题。在每一步中,我们优化一个潜在变量,同时修复其他潜在变量。想象一下,每个迭代步骤都会改进解决方案。即使对于连续空间,我们的工作精度也有限,因此,需要探索和改进的是有限的状态。因此,如果我们保持迭代,解决方案将收敛。

        因此,鲍姆-韦尔奇算法是EM算法的特例也就不足为奇了。

        让我们熟悉以下新符号。

        我们已经熟悉前向算法中的α(前向概率)。β(后向概率)是它在相反方向上的近亲(在给定时间 t 的状态 i 的情况下看到所有即将到来的观测值的概率)。我们可以递归地表达它,类似于α但方向相反(又名向后算法)。

        要学习HMM模型,我们需要知道我们是什么状态才能最好地解释观察结果。这将是状态占领概率γ — 给定所有观测值的时间 的状态 i 的概率。

        给定固定的HMM模型参数,我们可以应用前向和后向算法来计算观测值的αβγ可以通过简单地将α乘以β来计算,然后重新规范化它。

        ξ 是在给定所有观测值的时间 之后从状态 i 过渡到 的概率。它可以通过类似αβ来计算。

        直观地说,使用固定的HMM模型,我们使用给定的观测值细化状态占用概率(γ)和转移(ξ)。

        鸡和蛋的部分来了。一旦细化了γξ(θ₂)的分布,我们就可以对最佳跃迁和发射概率(θ₁:a,b进行点估计。

        我们修复一组参数以改进其他参数,并继续迭代,直到解决方案收敛。

        EM 算法通常定义为:

        在这里,E步建立了pγ,ξ | x,a,b)。然后,M步长找到a,b,大致最大化下面的目标。

        以下是该算法的回顾:

        因此,给定训练数据中的所有观察结果,Baum-Welch 算法可以学习 HMM 模型。但是,请记住保持开放的心态。在语音识别中,问题要复杂得多,许多解决方案有时无法很好地扩展。

四、声学模型

从源代码修改

        在 ASR 中,我们可以使用发音表为文本序列 Y 生成电话。接下来,我们需要为这些手机创建一个声学模型。

        几十年来,人们对语音学的研究已经完成。专家可以通过直接读取频谱图来识别元音和辅音。

        但是同样,我们需要一个更密集的声学模型表示,这样我们就可以确定给定手机PX|phone)的音频特征向量X的可能性。

        使用 MFCC,我们从音频帧中提取 39 个特征。让我们简化图片,并假设每帧只有一个特征。对于状态“sh”(电话),可以使用正态分布对此功能的值进行建模。

        要将概念扩展到 39 个特征,我们只需要一个包含 39 个变量的多元正态分布。下图可视化了两个变量的二元正态分布。

二元正态分布

        以下是多元正态分布的定义。

        其中 Σ 是测量变量之间相关性的协方差矩阵。MFCC 参数具有很好的属性。有相对独立的。因此,Σ的非对角线元素可以简单地设置为零。

        但是,多维度思考太难了。因此,我们将坚持使用一维示例进行说明。观测特征 x 的似然 px| q) 将计算为它与正态分布 q 的峰值有多远:

        给定不同的手机,我们可以计算相应的概率密度值,并将其归类为具有最高值的手机。为了学习这种高斯分布,我们可以简单地从训练数据点xi进行估计。

        这些方程可以通过最大化训练数据的可能性来证明。

        所以这个高斯模型很容易从训练数据中学习,并为我们提供了一个很好的P(x|μ,σ²)。在语音识别的背景下,我们可以学习每部手机的高斯模型(μ,σ²)。这用作可能性概率。这也充当HMM中的发射概率。

        不幸的是,即使我们使用多元高斯分布,这个概念也是幼稚的。如果这是真的,学习外语口语会简单得多。这种可能性比单个峰值钟形曲线更复杂。为了解决这个问题,我们切换到高斯混合模型(GMM)。这允许分布是多模态的,即我们允许一个特征有几个可能的值。这提供了语音变体的灵活性。

        例如,右侧的GMM将三个具有不同权重的高斯分布组合在一起,形成一个新的概率密度(3分量GMM)。该模型仍然非常密集,6 个高斯参数加上 3 个权重。

GMM声学模型

        直观地,可以在m模式之一附近观察到特定手机的特征值。但某些值可能比其他值更有可能。因此,我们引入权重来指示哪些更有可能。当内部 HMM 状态为 j 时,观察到的特征向量的可能性为:

        为了学习 GMM,例如对于 2 分量 GMM,我们馈送从训练数据中提取的特征以拟合这两个集群的参数。从概念上讲,我们从这些参数的初始或随机猜测开始。我们找到每个数据样本应属于哪个集群。然后我们根据关联的数据点重新计算聚类参数。

        是的,我们将使用 EM 算法迭代解决方案,直到它收敛。在EM中,我们使用软赋值而不是硬赋值。对于硬分配,我们分配每个数据样本所属的特定集群(点估计)。在软赋值中,它将是一个概率分布。因此,样本有可能属于集群。然后,我们根据此软分配重新计算集群参数。由于我们已经多次介绍过这一点,因此我们不会详细说明如何进一步训练它。

        回顾一下,给定一部手机,我们可以使用 GMM 学习可观察量的特征向量。这种概率分布允许我们计算给定电话 Px|s) 的语音片段的可能性——这也是给定 HMM 内部状态的发射概率。

五、矢量量化

        在整个过程中,我们尝试对声学信号的更密集表示进行建模。GMM是一种流行的方法。或者,在我们从语料库中提取一组训练的特征向量后,我们将这些特征分组到 k 个聚类中,比如使用 k 均值聚类。这将创建一个大小为 k 的代码本来编码音频帧。

        k=3 表示二维数据

        有了这个索引,我们可以开始使用它来训练 HMM。训练模型后,我们也可以使用它来解码音频剪辑。这种方法称为矢量量化,并用于早期研究。但与GMM相比,它不太受欢迎。因此,我们只是希望您意识到这一点。

六、反思

        GMM 对给定手机的特征向量的观测概率分布进行建模。它提供了一种原则性方法来测量手机和我们观察到的音频帧之间的“距离”。

        另一方面,HMM产生了一个关于状态如何过境和观察的原则模型。由于观测值的概率可以用HMM建模为:

        方程源

        其中 h 是隐藏状态(电话)。给定手机功能的可能性可以使用GMM建模。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/10916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言---每天小练习,从大到小输出

题目&#xff1a;从大到小输出 写代码将三个整数数按从大到小输出。 例如&#xff1a; 输入&#xff1a;2 3 1 输出&#xff1a;3 2 1 int main() {// 初始化int a 0;int b 0;int c 0;int d 0;scanf("%d %d %d", &a, &b, &c);if (a < b) {…

力扣算法数学类—剑指 Offer 16. 数值的整数次方

目录 剑指 Offer 16. 数值的整数次方 题解&#xff1a; 知识点&#xff1a; 代码&#xff1a; 结果&#xff1a; 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。不得使用库函数&#xff0c;同时不需要考虑大数问题。 示例…

UE使用UnLua(二)

1.前言 最近也是比较忙&#xff0c;忘了来更新了&#xff0c;好多都是开了头断更的&#xff08;狗头&#xff09;&#xff0c;今天抽空再更一篇&#xff01;&#xff01; 这篇讲一下在UnLua中覆盖蓝图事件&#xff08;函数&#xff09;&#xff0c;及按钮、文本控件的一些使用…

Node.js 安装与版本管理(nvm 的使用)

安装 Node.js Node.js 诞生于 2009 年 5 月&#xff0c;截至今天&#xff08;2022 年 3 月 26 号&#xff09;的最新版本为 16.14.2 LTS 和 17.8.0 Current&#xff0c;可以去官网下载合适的版本。 其中&#xff0c;LTS&#xff08;Long Term Support&#xff09; 是长期维护…

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境

知识点&#xff1a;简单了解K210芯片 2018年9月6日,嘉楠科技推出自主设计研发的全球首款基于RISC-V的量产商用边缘智能计算芯片勘智K210。该芯片依托于完全自主研发的AI神经网络加速器KPU,具备自主IP、视听兼具与可编程能力三大特点,能够充分适配多个业务场景的需求。作为嘉楠科…

详解Mybatis之动态sql问题

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 文章目录 一. 在sql映射文件中如何写注释&#xff1f;二. 什么是动态sql&#xff1f;三. 动态sql常用标签有…

pycharm 使用远程服务器 jupyter (本地jupyter同理)

1. 远程服务器miniconda 环境中创建jupyter环境 # 1. 激活环境 conda activate envname#2. 在环境中安装jupyter pip install jupyter # 或者 conda install jupyter#3. 生成jupyter_notebook_config.py文件 jupyter notebook --generate-config#4. 设置密码 jupyter noteboo…

Spark编程-SparkSQL

SparkSql能做些啥 Spark SQL的核心概念是DataFrame&#xff0c;它是一个分布式的数据集合&#xff0c;类似于关系数据库中的表。支持使用SQL语言直接对DataFrame进行查询,提供了丰富的内置函数和表达式&#xff0c;可以用于数据的转换、过滤和聚合等操作,支持多种数据源&#…

功能测试也可以发现数据库相关的性能问题

很多同学认为功能测试和性能测试是严格分开的&#xff0c;功能测试人员无法发现性能问题。其实不是这样的&#xff0c;功能测试人员在验证功能时也可以发现性能问题&#xff1b;一些功能反而在功能测试环境不好验证&#xff0c;需要在性能环境上测试。 今天咱们就说一下测试涉及…

Leetcode 滑动窗口题目总结

(Leetcode 滑动窗口题目总结) 1&#xff1a; 3.无重复字符的最长子串 https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/子串 和 子序列的区别&#xff1a;字串是连续的&#xff0c;子序列是非连续的。快慢指针 i 和 j&#xff0c;…

前端面试题 —— React (二)

目录 一、React 组件中怎么做事件代理&#xff1f;它的原理是什么&#xff1f; 二、React.Component 和 React.PureComponent 的区别 三、Component, Element, Instance 之间有什么区别和联系&#xff1f; 四、React声明组件有哪几种方法&#xff0c;有什么不同&#xff1f…

QT项目代码去UI界面常用开发步骤

QT项目代码去UI界面常用开发步骤 因项目开发需求&#xff0c;领导要求整个QT项目中不要用UI方式来实现界面&#xff0c;这样能保障程序运行稳定性以及代码的逻辑和可读性,先记录具体操作步骤如下&#xff1a; 1、首先我们通过拖控件的方式来实现界面的设计效果&#xff0c…

【Docker】安全及日志管理

目录 一、Docker 安全及日志管理1.1 Docker 容器与虚拟机的区别1. 隔离与共享2. 性能与损耗 1.2Docker 存在的安全问题1.Docker 自身漏洞2.Docker 源码问题 1.3 Docker 架构缺陷与安全机制1. 容器之间的局域网攻击2. DDoS 攻击耗尽资源3. 有漏洞的系统调用4. 共享root用户权限 …

DEVICENET转ETHERNET/IP网关devicenet协议

捷米JM-EIP-DNT&#xff0c;你听说过吗&#xff1f;这是一款自主研发的ETHERNET/IP从站功能的通讯网关&#xff0c;它能够连接DEVICENET总线和ETHERNET/IP网络&#xff0c;从而解决生产管理系统中协议不同造成的数据交换互通问题。 这款产品在工业自动化领域可谓是一大利器&…

特定Adreno GPU的Android设备发生冻屏问题

1&#xff09;特定Adreno GPU的Android设备发生冻屏问题 ​2&#xff09;Unity版本升级后&#xff0c;iOS加载UnityFramework bundle闪退 3&#xff09;关于RectTransfrom.rect在屏幕空间中表示的相关问题 4&#xff09;Unity Mesh泄露问题 这是第345篇UWA技术知识分享的推送&a…

Java 8 Stream流:代码简洁之道

文章目录 前言一、filter二、map三、mapToInt、mapToLong、mapToDouble四、flatMap五、flatMapToInt、flatMapToLong、flatMapToDouble六、distinct七、sorted八、peek九、limit十、forEach十一、forEachOrdered十二、toArray十三、reduce十四、collect十五、min、max十六、cou…

Llama 2 来袭 - 在 Hugging Face 上玩转它

&#x1f917; 宝子们可以戳 阅读原文 查看文中所有的外部链接哟&#xff01; 引言 今天&#xff0c;Meta 发布了 Llama 2&#xff0c;其包含了一系列最先进的开放大语言模型&#xff0c;我们很高兴能够将其全面集成入 Hugging Face&#xff0c;并全力支持其发布。Llama 2 的社…

将AWS S3大文件文件上传相关的API集成为js文件,功能包括 多文件并行上传、文件分片上传、断点续传、文件分片合成、上传暂停、取消上传、文件上传进度条显示

地址 https://github.com/gk-1213/easy-s3/tree/main easy-s3 将AWS S3大文件文件上传相关的API集成为js文件&#xff0c;功能包括多文件并行上传、文件分片上传、断点续传、文件分片合成、上传暂停、取消上传、文件上传进度条显示。 暂时不包括文件分片下载相关功能&#…

linux下用docker安装mysql

1.mysql Docker镜像 docker pull mysql:[版本号 或 latest]例&#xff1a;docker pull mysql:5.7 2.查看拉取的docker镜像 docker images3.设置 Docker 卷 docker volume create mysql-data列出 Docker 已知的所有卷 docker volume ls4.运行一个 MySQL Docker 容器 docke…

2018年全国硕士研究生入学统一考试管理类专业学位联考写作试题——解析版

2018年1月真题 四、写作&#xff1a;第56~57小题&#xff0c;共65分。其中论证有效性分析30 分&#xff0c;论说文35分。 56.论证有效性分析&#xff1a; 分析下述论证中存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600字左右的文章&#xff0c;对该论证的有…