【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建模。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++之文件操作

1.C文件操作 C中文件操作头文件:fstream。   文件类型:文件文件和二进制文件。 文件操作三大类:     ofstream 写操作     ifstream 读操作     fstream:读写操作 文件打开方式: 标志说明ios::in只读ios::out只写,文件不存在则…

JVM详解(超详细)

目录 JVM 的简介 JVM 执行流程 JVM 运行时数据区 由五部分组成 JVM 的类加载机制 类加载的过程(五个) 双亲委派模型 类加载器 双亲委派模型的优点 JVM 中的垃圾回收策略 GC GC 中主要分成两个阶段 死亡对象的判断算法 引用计数算法 可达性分析算法 垃圾回收算…

【设计模式——学习笔记】23种设计模式——组合模式Composite(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入学校院系展示 介绍基本介绍使用场景登场角色 案例实现案例1类图代码实现 案例2类图代码实现拓展 组合模式在JDK的HashMap源码中的应用组合模式总结文章说明 案例引入 学校院系展示 编写程序展示一个学校院系结构: 需求是这样,要在一个页面中展示…

EXCEL,如何比较2个表里的数据差异(使用数据透视表)

目录 1 问题: 需要比较如下2个表的内容差异 1.1 原始数据喝问题 1.2 提前总结 2 使用EXCEL公式方法 2.1 新增辅助列: 辅助index 2.2 具体公式 配合条件格式 使用 3 数据透视表方法 3.1 新增辅助列: 辅助index 3.2 需要先打开 数据透视表向导 …

CMU 15-445 -- Multi-Version Concurrency Control - 16

CMU 15-445 -- Multi-Version Concurrency Control - 16 引言MVCCExample #1Example #2小结 Design DecisionsConcurrency Control ProtocolVersion StorageAppend-Only StorageTime-Travel StorageDelta Storage Garbage CollectionTuple-Level GCTransaction-Level GC Index …

linux系统安装mysql

背景 之前用docker安装mysql,受限太多,这次不用docker直接安装。 参考文章 linux系统安装mysql 文章写的很细,亲测有效。 问题记录 不过存在一个小问题,这里记录一下自己的解决方法 问题:安装完mysql,启…

MD-MTSP:成长优化算法GO求解多仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、成长优化算法GO 成长优化算法(Growth Optimizer,GO)由Qingke Zhang等人于2023年提出,该算法的设计灵感来源于个人在成长过程中的学习和反思机制。学习是个人通过从外部世界获取知识而成长的过程,反思是检查个体自…

【物联网无线通信技术】UWB定位从理论到实现(DW1000)

超宽带(UWB)是一种基于IEEE 802.15.4a和802.15.4z标准的无线电技术,可以非常精确地测量无线电信号的飞行时间,从而实现厘米级精度的距离/位置测量。UWB技术除了提供定位功能外,它本身是一种通信技术,其提供…

Labelme制作COCO格式的图像语义分割数据集

1.按照labelme工具地址先配置安装labelme:GitHub - wkentaro/labelme: Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation). 2.给自己的数据集画多边形框-Create Polygons 每张图像画完框后&#…

[个人笔记] vCenter设置时区和NTP同步

VMware虚拟化 - 运维篇 第三章 vCenter设置时区和NTP同步 VMware虚拟化 - 运维篇系列文章回顾vCenter设置时区和NTP同步(附加)ESXi设置alias参考链接 系列文章回顾 第一章 vCenter给虚机添加RDM磁盘 第二章 vCenter回收活跃虚拟机的剩余可用空间 vCente…

linux+Jenkins+飞书机器人发送通知(带签名)

文章目录 🌞如何使用🌻在linux 上安装python 环境🌻发送消息python脚本🦋把脚本上传倒linux上🦋jenkins 上执行脚本 🌞如何使用 自定义机器人使用指南飞书官网https://open.feishu.cn/document/client-doc…

ChatGPT炒股:爬取股票官方微信公众号的新闻资讯

上市公司的微信公众号,现在已经成为官网之外最重要的官方信息发布渠道。有些不会在股票公告中发布的消息,也会在微信公众号进行发布。所以,跟踪持仓股票的公众号信息,非常重要。 下面,以贝特瑞的官方公众号“贝特瑞新…

beego验证码(配置到redis存储)

我们定义一个全局变量用于存储redis连接 RedisDb *redis.Client 然后连接 redis 这一块我们将redis信息写到app.conf文件里了: redisDb 1 redisAddr "127.0.0.1:6379" redisPwd "" package initializeimport ("beego_learning/global&q…

经典的数组和指针结合的OJ题

一、合并两个有序数组 leetcode链接 题目描述: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递…

[Linux]进程控制详解!!(创建、终止、等待、替换)

hello,大家好,这里是bang___bang_,在上两篇中我们讲解了进程的概念、状态和进程地址空间,本篇讲解进程的控制!!包含内容有进程创建、进程等待、进程替换、进程终止!! 附上前2篇文章…

七大经典比较排序算法

1. 插入排序 (⭐️⭐️) 🌟 思想: 直接插入排序是一种简单的插入排序法,思想是是把待排序的数据按照下标从小到大,依次插入到一个已经排好的序列中,直至全部插入,得到一个新的有序序列。例如:…

Vue3搭建启动

Vue3搭建&启动 一、创建项目二、启动项目三、配置项目1、添加编辑器配置文件2、配置别名3、处理sass/scss4、处理tsx(不用的话可以不处理) 四、添加Eslint 一、创建项目 npm create vite 1.project-name 输入项目名vue3-vite 2.select a framework 选择框架 3.select a var…

【Spring】聊聊Spring如何解决的循环依赖以及三级缓存

循环依赖是什么 在平时的面试中,只要问到Spring,那么大概率肯定会问什么是循环依赖,Sping是如何解决循环依赖的。以及三级缓存机制是什么。所以为了从根本上解决这个问题,本篇主要详细介绍一下循环依赖的问题。 Spring Bean初始…

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现

目录 一、总述 1.1 前端思路 1.2 后端思路 二、前端实现 2.1 判断是否能进行拖拽 2.2 收集受影响的节点,提交给服务器 三、后端实现 四、总结 一、总述 这个拖拽功能对于这种树形的列表,整体的搬迁是很方便的。但是其实现却并不是那么的简单。 …

Android SDK 上手指南||第一章 环境需求||第二章 IDE:Eclipse速览

第一章 环境需求 这是我们系列教程的第一篇,让我们来安装Android的开发环境并且把Android SDK运行起来! 介绍 欢迎来到Android SDK入门指南系列文章,如果你想开始开发Android App,这个系列将从头开始教你所须的技能。我们假定你…