【语音识别】- 声学,词汇和语言模型

news2024/10/7 18:31:06

一、说明

        语音识别是指计算机通过处理人类语言的音频信号,将其转换为可理解的文本形式的技术。也就是说,它可以将人类的口语语音转换为文本,以便计算机能够进一步处理和理解。它是自然语言处理技术的一部分,被广泛应用于语音识别助手,语音交互系统,语音搜索等领域。

二、语音识别的意图和实现

        语音识别可以被视为根据声学、发音词典和语言模型找到最佳单词序列 (W)。

        在上一篇文章中,我们学习了HMM和GMM的基础知识。现在是时候将它们放在一起来构建这些模型了。

词汇

发音词典对单词的电话序列进行建模。通过使用滑动窗口分割音频剪辑,我们生成一系列音频帧。对于每一帧,我们提取了 39 个 MFCC 特征。即,我们生成一系列特征向量 Xx₁ x₂, ..., xi ...),其中 xi 包含 39 个特征。似然 pX|W) 可以根据词典和声学模型近似。

发音词典是用马尔可夫链建模的。

HMM 模型中的自循环将电话与观察到的音频帧对齐。

这为处理发音的时间变化提供了灵活性。

给定一个经过训练的HMM模型,我们对观察结果进行解码以找到内部状态序列。这可以通过下面的格子可视化。下面的箭头演示了可能的状态转换。给定一系列观察值X,我们可以使用维特比算法来解码最佳电话序列(比如下面的红线)。

源代码修改

在本文中,我们不会重复有关HMM和GMM的背景信息。如果您需要,这是关于这两个主题的上一篇文章。它包括维特比算法,用于寻找最佳状态序列。

但是,手机不是同质的。频率的幅度从开始到结束都在变化。为了反映这一点,我们进一步将手机细分为三种状态:手机的开头、中间和结束部分。

源代码修改

这是我们从每部手机的一个状态更改为三个状态的HMM。

来源(“六”字)

        每个内部状态的可观察量将由GMM建模。

        我们可以通过在弧中写入输出分布来简化 HMM 拓扑的绘制方式。因此,弧上的标签表示输出分布(观测值),而不是将观测值绘制为节点(状态)。以下是单词“two”的 HMM 拓扑,其中包含 2 部电话,每部电话具有三种状态。弧的标签表示声学模型 (GMM)。

        给定电话 W 的观测值 X 的可能性是根据所有可能路径的总和计算得出的。

        对于每个路径,概率等于路径的概率乘以给定内部状态的观测值的概率。第二种概率将由 m 分量 GMM 建模。所以所有路径的总概率相等

        在实践中,我们使用对数似然(log(Px|w)))来避免下溢问题。这是HMM模型,每个电话使用三种状态来识别数字。

        为了处理演讲中的沉默、噪音和填充的停顿,我们可以将它们建模为 SIL,并将其视为另一部手机。

        然而,这些静音声音更难捕捉。我们可以用 5 个内部状态而不是 <> 个来建模它。对于某些 ASR,我们还可能使用不同的手机进行不同类型的静音和填充暂停。

        我们还可以引入跳过弧,即具有空输入 (ε) 的弧,以对话语中的跳过声音进行建模。

三、上下文相关电话

        关节取决于之前和之后的电话(共关节)。声音根据单词内或单词之间的周围上下文而变化。例如,同位素(音素的声学实现)可能是跨词边界共发音的结果。相邻电话对语音变化的影响很大。例如,如果我们把手放在嘴前,当我们发音 /p/ 代表“旋转”和 /p/ 代表“pin”时,我们会感觉到气流的差异。

        在构建复杂的声学模型时,我们不应该独立于其上下文来处理手机。音频帧的标签应包括电话及其上下文。如下图所示,对于音素 /eh/,频谱图在不同的上下文下是不同的。

因此,给定下面的音频帧,我们应该将它们分别标记为 /eh/,上下文 (/w/, /d/)、(/y/, /l/) 和 (/eh/, /n/)。

        这称为三音器

        从源代码修改

        三音 s-iy+l 表示电话 /iy/ 前面是 /s/,后跟 /l/。如果忽略上下文,则前面的所有三个音频帧都引用 /iy/。但在上下文相关的方案中,这三个帧将被归类为三个不同的 CD 电话。但请注意,三音符有很多符号。即使对于这个系列,也使用了几种不同的符号。

        以下是分别使用电话和三音器表示“杯子”一词的示例。手机或三部电话都将由三种内部状态建模。我们不会增加表示“电话”的状态数量。我们只是扩展标签,以便我们可以以更高的粒度对它们进行分类。

源代码修改

然而,这有一个主要缺点。比如说,我们最初有 50 部手机。HMM 模型将有 50 × 3 个内部状态(每部手机的开始、中间和结束状态)。对于三音器,我们有 50³ × 3 个三音器状态,即每部电话 50² 个三音器。状态的分解数变得无法管理。

国家捆绑

幸运的是,三音器的某些组合很难与频谱图区分开来。实际上,可能的三音位数大于观察到的三音位数。

因此,某些州可以共享相同的GMM模型。这称为状态绑定

要找到这样的聚类,我们可以参考电话的表达方式:停止、鼻音、咝咝声、元音、侧音等......我们创建了一个决策树来探索对可以共享相同GMM模型的三音器进行聚类的可能方法。

通常,我们使用训练数据构建此语音决策树。让我们探索构建树的另一种可能性。以下是在不同语境下说 /p/ 的不同方式。

对于每部手机,我们创建一个决策树,其中包含基于左右上下文的决策树桩。树的叶子聚集了可以用相同的GMM模型建模的三音器。

我们可以应用决策树技术来避免过度拟合。例如,我们可以限制叶节点的数量和/或树的深度。我们的训练目标是最大限度地提高最终GMM模型训练数据的可能性。以下是我们如何使用状态绑定从手机演变为三音机。对于每部手机,我们现在有更多的子类别(三音器)。我们使用GMM而不是简单的高斯来建模它们。

四、连续语音识别

        单字语音识别的概念可以通过HMM模型扩展到连续语音。我们在HMM中添加弧线以将单词连接在一起。

五、语言模型

        即使音频剪辑在语法上可能不完美或跳过了单词,我们仍然假设我们的音频剪辑在语法和语义上是合理的。因此,如果我们在解码中包含语言模型,我们可以提高 ASR 的准确性。

双格拉姆模型

语言模型计算单词序列的可能性。

在双语(又名 2 克)语言模型中,当前单词仅取决于最后一个单词。

例如

让我们看一下马尔可夫链,如果我们将双字母语言模型与发音词典集成在一起。下面的三个词典分别用于单词一、二和零。然后我们用双元语言模型将它们连接在一起,转移概率像p(one|two)。

计算 P(“零”|”二“),我们抓取语料库(例如来自包含 23M 字的《华尔街日报》语料库)并计算

如果语言模型依赖于最后 2 个单词,则称为三元组。

源代码修改

n-gram 取决于最后的 n-1 个单词。这是双元组和三元组的状态图。对于三元组模型,每个节点表示具有最后两个单词的状态,而不仅仅是一个单词。

这是使用三元组语言模型的可视化。

六、平滑

即使23M个单词听起来也很多,但语料库仍然可能包含合法的单词组合。对于三元组或其他 n-gram,这种情况变得更糟。通常,三元组或 n 元语法模型的数据很少。如果我们将《华尔街日报》的尸体分成两半,一组数据中36.6%的三卦(4.32M / 11.8M)将不会在另一半中看到。这很糟糕,因为我们训练模型说这些合法序列的概率为零。

加一平滑

让我们先从 unigram 看问题。我们问题的一个解决方案是在所有计数中添加一个偏移量 k(比如 1)以调整 PW) 的概率,这样即使我们没有在语料库中看到它们,P(W) 也会都是正数。以下是平滑计数和人为喷射计数后的平滑概率。

源代码修改

但是很难确定k的正确值。但是让我们考虑一下平滑的原理是什么。如果我们没有足够的数据来做出估计,我们会回退到与原始统计数据密切相关的其他统计数据,并显示出更准确。然后,我们根据这些统计数据插值我们的最终答案。例如,如果在语料库中没有观察到双元词,我们可以从出现一次的双元词中借用统计数据。

良好的图灵平滑

让我们回到 n-gram 模型进行讨论。平滑的一般思想是重新插值训练数据中看到的计数,以伴随测试数据中看不见的单词组合。在这个过程中,我们重新洗牌计数并压缩看到的单词的概率,以适应看不见的n元语法。

一种可能性是将平滑计数 r* 和概率 p 计算为:

源代码修改

直观地说,我们用具有“r + 1”计数的上层n元语法来平滑概率质量

对于看不见的 n 元语法,我们通过使用具有单次出现的 n 元语法数 (n₁) 来计算其概率。

但在某些情况下,上层 (r+1) 的 n 元语法为零。我们将首先应用插值 S 来平滑计数。

目前,我们不需要进一步详细说明。我们将继续介绍另一种更有趣的平滑方法。但是,如果您对此方法感兴趣,可以阅读本文以获取更多信息。

卡茨平滑

Katz 平滑是在数据稀疏时平滑统计信息的常用方法之一。对于双元模型,平滑计数和概率的计算公式为:

此方法基于折扣概念,我们降低某些类别的计数,以将计数重新分配给训练数据集中计数为零的单词。

如果计数高于阈值(例如 5),则折扣 d 等于 1,即我们将使用实际计数。他们有足够的数据,因此相应的概率是可靠的。对于计数较低的单词组合,我们希望折扣 d 与好图灵平滑成正比。

此外,我们希望从折扣中保存的计数等于 n₁,Good-Tuuring 将其分配给零计数。

为了满足这两个限制,折扣变为

在良图灵平滑中,每个具有零计数的 n 元语法都具有相同的平滑计数。对于 Katz 平滑,我们会做得更好。α的选择是这样

因此,在重新洗牌计数后,双字母中第一个单词给出的总体统计数据将与统计数据相匹配。我们将平滑计数计算为:

因此,即使训练数据集中不存在单词对,如果第二个单词 wi 很受欢迎,我们将平滑计数调整得更高。

α等于

直观地说,如果有许多低计数的单词对以相同的第一个单词开头,则平滑计数会增加。

在这种情况下,我们预计(或预测)具有相同第一个单词的许多其他对将出现在测试中,而不是训练中。实证结果表明,Katz 平滑能够很好地平滑稀疏数据概率。同样,如果您想更好地了解平滑,请参阅本文。

退避模型

Katz 平滑是一个退避模型,当我们找不到任何 n 元语法的出现时,我们回退,即如果我们找不到 n-gram 的任何出现,我们用 n-1 克估计它。但是在 n-1 克中也没有出现,我们不断回落,直到找到非零出现计数。退避概率的计算公式为:

其中 α 和 P 定义为:

每当我们回退到较低跨度的语言模型时,我们都需要用α来缩放概率,以确保所有概率的总和为 1。

让我们举一个例子来阐明这个概念。假设我们从未在我们的训练语料库中找到 5 克的“第 10 个符号是 obelus”。因此,我们必须回退到 4 克模型来计算概率。

P(Obelus | 符号为 an) 通过计算以下相应的出现次数来计算:

最后,我们计算α来重新规范概率。

这是最终的平滑计数和概率。

七、接下去的内容

        现在,我们知道如何对 ASR 进行建模。但是,我们如何使用这些模型来解码话语呢?

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

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

相关文章

代码随想录训练营day2

问题一&#xff1a;长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 输入…

STM32 CAN控制的相关结构体

目录 CAN结构体 CAN初始化结构体 CAN发送及接收结构体 CAN筛选器结构体 CAN结构体 从STM32的CAN外设我们了解到它的功能非常多&#xff0c;控制涉及的寄存器也非常丰富&#xff0c;而使用STM32标准库提供的各种结构体及库函数可以简化这些控制过程。跟其它外设一样&#xf…

Mac配置android studio的终端terminal

一共6步 首先打开terminal 1.echo $HOME 2.touch .bash_profile 3.open -e .bash_profile 4.在弹出框中输入 export PATH${PATH}:你电脑sdk的路径/tools:你电脑sdk的路径/platform-tools 5.source .bash_profile 6.adb version 出现类似上图即为成功

将标签中某一个类别添加到另一个标签中

现在有两张CItyscapes数据集的标签&#xff0c;假设我想把第二张图骑车的人添加到第一张图&#xff0c;暂且不考虑添加位置的变换&#xff0c;那么该如何操作呢&#xff1f; 1&#xff1a;将骑车的人和车作为两个类别独立于其他的类别出来。 2&#xff1a;将这两个类别作为一个…

【LeetCode-简单】剑指 Offer 24. 反转链表(详解)

题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 方法&#xff1a;迭代 思路 定义三个指针&#xff0c;一起往后走&#xff0c;走一步就修改mid指针的next&#xff0c;原本是mid的next 是right&#xff0c;我们修改成l…

ERROR in unable to locate ‘***/public/**/*‘ glob

前提 自己搭了一个react项目的脚手架&#xff0c;npm包下载一切都很正常&#xff0c;启动的时候突然就报ERROR in unable to locate ***/public/**/* glob这个错误&#xff0c;根据百度分析了一下产生的原因&#xff1a;webpack配置文件中的CopyWebpackPlugin导致的 网上给出的…

用Rust生成Ant-Design Table Columns | 京东云技术团队

经常开发表格&#xff0c;是不是已经被手写Ant-Design Table的Columns整烦了&#xff1f; 尤其是ToB项目&#xff0c;表格经常动不动就几十列。每次照着后端给的接口文档一个个配置&#xff0c;太头疼了&#xff0c;主要是有时还会粘错就尴尬了。 那有没有办法能自动生成colu…

Windows下安装python3教程

参考:https://blog.csdn.net/kailingr/article/details/128193083 一、安装步骤图解 准备工作&#xff1a; 进官网https://www.python.org/下载Python 安装包&#xff0c;注意&#xff1a;Python 3.9不能在Windows 7或更早版本上使用 安装&#xff1a; 1.下载完之后双击该文…

STM32 串口基础知识学习

串行/并行通信 串行通信&#xff1a;数据逐位按顺序依次传输。 并行通信&#xff1a;数据各位通过多条线同时传输。 对比 传输速率&#xff1a;串行通信较低&#xff0c;并行通信较高。抗干扰能力&#xff1a;串行通信较强&#xff0c;并行通信较弱。通信距离&#xff1a;串…

【具有非线性反馈的LTI系统识别】针对反馈非线性的LTI系统,提供非线性辨识方案(SimulinkMatlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、Simulink仿真实现 &#x1f4a5;1 概述 本文为具有反馈非线性的LTI系统提供了一种非线性识别方案&#xff0c;这取决于输入和LTI系统输出。对于MEMS来说尤其如此&#…

uniapp:手写签名,多张图合成一张图

要实现的内容&#xff1a;手写签名&#xff0c;协议内容。点击提交后&#xff1a;生成1张图片&#xff0c;有协议内容和签署日期和签署人。 实现的效果图如下&#xff1a; 1、签名页面 <template><view class"index"><u-navbar title"电子协议…

【数据结构】实验六:队列

实验六 队列 一、实验目的与要求 1&#xff09;熟悉C/C语言&#xff08;或其他编程语言&#xff09;的集成开发环境&#xff1b; 2&#xff09;通过本实验加深对队列的理解&#xff0c;熟悉基本操作&#xff1b; 3&#xff09; 结合具体的问题分析算法时间复杂度。 二、…

Qt完成文本转换为语音播报与保存(系统内置语音引擎)(一)

一、前言 在当今数字化社会,人们对于交互式应用程序的需求越来越高。除了传统的图形用户界面,语音交互也成为了一种流行的交互方式。在这种情况下,将文本转换为语音成为了一项重要的技术,它可以为用户提供更加人性化和便捷的交互方式。在此背景下,Qt提供了QTextToSpeech类…

python测试开发面试常考题:装饰器

目录 简介 应用 第一类对象 装饰器 描述器descriptor 资料获取方法 简介 Python 装饰器是一个可调用的(函数、方法或类)&#xff0c;它获得一个函数对象 func_in 作为输入&#xff0c;并返回另一函数对象 func_out。它用于扩展函数、方法或类的行为。 装饰器模式通常用…

flask中的常用装饰器

flask中的常用装饰器 Flask 框架中提供了一些内置的装饰器&#xff0c;这些装饰器可以帮助我们更方便地开发 Web 应用。以下是一些常用的 Flask 装饰器&#xff1a; app.route()&#xff1a;这可能是 Flask 中最常用的装饰器。它用于将 URL 路由绑定到一个 Python 函数&#x…

【前端知识】React 基础巩固(三十五)——ReduxToolKit (RTK)

React 基础巩固(三十五)——ReduxToolKit (RTK) 一、RTK介绍 Redux Tool Kit &#xff08;RTK&#xff09;是官方推荐的编写Redux逻辑的方法&#xff0c;旨在成为编写Redux逻辑的标准方式&#xff0c;从而解决上面提到的问题。 RTK的核心API主要有如下几个&#xff1a; confi…

Pytorch深度学习-----神经网络的基本骨架-nn.Module的使用

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

Cadence OrCAD Capture绘制符号时缩小栅格距离的方法图文教程

🏡《总目录》   🏡《宝典目录》 目录 1,概述2,问题概述3,常规方法4,正确方法3,总结1,概述 本文简单介绍,使用Capture软件绘制原理图符号时,缩小或自定义栅格间距的方法。 2,问题概述 如下图所示,在进行原理图符号绘制时,管脚元件实体的线条等,均只能放置在栅…

佰维存储面向旗舰智能手机推出UFS3.1高速闪存

手机“性能铁三角”——SoC、运行内存、闪存决定了一款手机的用户体验和定位&#xff0c;其中存储器性能和容量对用户体验的影响越来越大。 针对旗舰智能手机&#xff0c;佰维推出了UFS3.1高速闪存&#xff0c;写入速度最高可达1800MB/s&#xff0c;是上一代通用闪存存储的4倍以…

C++ 缺省参数

1.缺省参数 一般情况下&#xff0c;函数调用时的实参个数应与形参相同&#xff0c;但为了方便地使用函数&#xff0c;C允许定义具有缺省参数的函数&#xff0c;这种函数调用时&#xff0c;实参个数可以与形参不相同。 缺省参数指在定义函数时为形参指定缺省值&#xff08;默认…