当前位置: 首页 > news >正文

语音识别 — 特征提取 MFCC 和 PLP

一、说明

        语音识别是一种技术,通过计算机和软件系统,将人们的口头语言转换为计算机可读的文本或命令。它使用语音信号处理算法来识别和理解人类语言,并将其转换为计算机可处理的格式。语音识别技术被广泛应用于许多领域,如语音助手、语音控制、语音翻译、语音搜索、电话自动接听等。

二、基本问题提出

回到语音识别,我们的目标是根据声学和语言模型找到与音频对应的最佳单词序列。

为了创建声学模型,我们的观察X由一系列声学特征向量(x₁,x₂,x₃,...)表示。在上一篇文章中,我们了解了人们如何表达和感知语音。在本文中,我们将讨论如何从我们学到的内容中提取音频特征。

三、语音识别要求

让我们首先定义 ASR(自动语音识别器)中特征提取的一些要求。给定一个音频片段,我们使用 25ms 宽的滑动窗口来提取音频特征。

这个 25 毫秒的宽度足以让我们捕获足够的信息,但这个框架内的特征应该保持相对静止。如果我们用 3 部手机每秒说 4 个单词,并且每个电话将细分为 3 个阶段,那么每秒有 36 个状态或每个状态 28 毫秒。所以 25ms 窗口大约是正确的。

语境在言语中非常重要。发音根据电话前后的发音而变化。每个滑动窗口相距约10毫秒,因此我们可以捕获帧之间的动态以捕获适当的上下文。

音高因人而异。然而,这对识别他/她说的话几乎没有作用。F0 与音高有关。它在语音识别中没有价值,应将其删除。更重要的是共振峰F1,F2,F3,...对于那些在遵循这些条款方面有问题的人,我们建议您先阅读上一篇文章。

我们还希望提取的特征能够对扬声器是谁以及环境中的噪音具有鲁棒性。此外,像任何 ML 问题一样,我们希望提取的特征独立于其他特征。开发模型和使用独立特征训练这些模型更容易。

一种流行的音频特征提取方法是梅尔频率倒谱系数 (MFCC),它具有 39 个特征。特征计数足够小,足以迫使我们学习音频信息。12个参数与频率幅度有关。它为我们提供了足够的频率通道来分析音频。

下面是提取 MFCC 特征的流程。

主要目标是:

  • 删除声带激励 (F0) — 音高信息。
  • 使提取的特征独立。
  • 适应人类感知声音响度和频率的方式。
  • 捕获手机的动态(上下文)。

四、梅尔频率倒谱系数

        让我们一次介绍一个步骤。

模数转换

A/D 转换对音频剪辑进行采样并对内容进行数字化,即将模拟信号转换为离散空间。通常使用8或16 kHz的采样频率。

预加重

预加重可提高高频中的能量。对于元音等浊音段,较低频率的能量高于较高频率。这称为频谱倾斜,与声门源(声带如何产生声音)有关。提高高频能量使更高共振峰中的信息更容易被声学模型获得。这提高了手机检测的准确性。对于人类来说,当我们听不到这些高频声音时,我们开始出现听力问题。此外,噪声具有很高的频率。在工程领域,我们使用预加重使系统不易受到以后过程中引入的噪声的影响。对于某些应用程序,我们只需要在最后撤消提升即可。

预加重使用滤波器来提升更高的频率。以下是关于如何增强高频信号的前后信号。

朱拉夫斯基和马丁,图。9.9

窗口

窗口化涉及将音频波形切成滑动帧。

但我们不能只是在框架的边缘把它砍掉。突然下降的振幅会产生很多噪声,这些噪声出现在高频中。要对音频进行切片,振幅应在帧边缘附近逐渐下降。

假设 w 是应用于时域中原始音频剪辑的窗口。

w的一些替代方案是汉明窗和汉宁窗。下图显示了如何使用这些窗口斩断正弦波形。如图所示,对于汉明和汉宁窗口,振幅在边缘附近下降。(汉明窗的边缘有轻微的突然下降,而汉宁窗则没有。

w 的相应方程为:

右上方是时域中的声波。它主要仅由两个频率组成。如图所示,与矩形窗口相比,汉明和汉宁的斩波框架可以更好地保持原始频率信息,噪声更少。

源右上:由两个频率组成的信号

离散傅里叶变换 (DFT)

接下来,我们应用DFT提取频域中的信息。

梅尔过滤器组

如上一篇文章所述,设备测量与我们的听觉感知不同。对于人类来说,感知的响度会根据频率而变化。此外,感知频率分辨率随着频率的增加而降低。即人类对更高的频率不太敏感。左图显示了 Mel 刻度如何将测量的频率映射到我们在频率分辨率背景下感知的频率。

所有这些映射都是非线性的。在特征提取中,我们应用三角带通滤波器来隐藏频率信息以模仿人类的感知。

首先,我们对DFT的输出进行平方。这反映了每个频率(x[k]²)的语音功率,我们称之为DFT功率谱。我们应用这些三角形梅尔尺度滤波器组将其转换为梅尔尺度功率谱。每个梅尔级功率谱槽的输出表示其覆盖的多个频段的能量。此映射称为梅尔分箱。插槽 m 的精确方程为:

Trainang角带通在较高频率下较宽,以反映人类的听力,而在高频下灵敏度较低。具体来说,它在 1000 Hz 以下线性间隔,然后以对数方式转动。

所有这些努力都试图模仿我们耳朵中的基底膜如何感知声音的振动。出生时,基底膜在耳蜗内有大约15,000根毛发。下图显示了这些毛发的频率响应。因此,下面的曲线形状响应只是由 Mel 滤波器组中的三角形近似。

我们模仿我们的耳朵如何通过这些头发感知声音。简而言之,它由使用 Mel 过滤组的三角形滤波器建模。

日志

梅尔滤波器组输出功率谱。人类对高能量下的微小能量变化不如低能量水平下的微小变化敏感。事实上,它是对数的。因此,我们的下一步将从 Mel 过滤器组的输出中删除日志。这也减少了对语音识别不重要的声学变体。接下来,我们需要解决另外两个要求。首先,我们需要删除 F0 信息(音高),并使提取的特征独立于其他特征。

倒谱 — IDFT

下面是语音产生的模型。

我们的发音控制声道的形状。源过滤器模型将声带产生的振动与我们的发音产生的过滤器相结合。声门源波形将通过声道的形状在不同频率下被抑制或放大。

Cepstrum 是单词“spectrum”中前 4 个字母的反面。我们的下一步是计算分离声门源和过滤器的倒谱。图(a)是光谱,其中y轴是幅度。图(b)取了量级的对数。仔细观察,波浪在 8 到 1000 之间波动约 2000 次。实际上,每 8 个单位波动约 1000 次。这大约是125赫兹 - 声带的源振动。

保罗·泰勒〔2008〕

如观察所示,对数频谱(下面的第一张图)由与电话(第二张图)和音高(第三张图)相关的信息组成。第二个图中的峰值标识区分电话的共振峰。但是我们如何将它们分开呢?

回想一下,时域或频域中的周期在变换后是反转的。

回想一下,音高信息在频域中的周期很短。我们可以应用傅里叶逆变换将螺距信息与共振峰分离。如下图所示,音高信息将显示在中间和右侧。中间的峰值实际上对应于F0,手机相关信息将位于最左侧。

这是另一个可视化效果。左图上的实线是频域中的信号。它由虚线绘制的电话信息和音高信息组成。在IDFT(逆离散傅里叶变换)之后,具有1/T周期的音高信息被转换为右侧T附近的峰值。

因此,对于语音识别,我们只需要最左侧的系数并丢弃其他系数。事实上,MFCC 只取前 12 个倒谱值。还有另一个与这 12 个系数相关的重要属性。对数功率谱是真实且对称的。它的反DFT等效于离散余弦变换(DCT)。

DCT 是一种正交变换。在数学上,变换会产生不相关的特征。因此,MFCC 功能高度不相关。在 ML 中,这使我们的模型更容易建模和训练。如果我们使用多元高斯分布对这些参数进行建模,则协方差矩阵中的所有非对角线值都将为零。在数学上,此阶段的输出为

以下是倒谱 12 个倒谱系数的可视化。

动态要素(增量)

MFCC 有 39 个功能。我们最终确定了 12 个,其余的是什么。第 13 个参数是每帧中的能量。它可以帮助我们识别手机。

在发音中,上下文和动态信息很重要。止动闭合和释放等衔接可以通过共振峰过渡来识别。表征随时间变化的功能可提供电话的上下文信息。另外 13 个值计算下面的增量值 dt)。它测量从上一帧到下一帧的特征变化。这是特征的一阶导数。

最后 13 个参数是 dt) 从最后一帧到下一帧的动态变化。它充当 ct) 的二阶导数。

因此,39 个 MFCC 特征参数是 12 个倒谱系数加上能量项。然后我们还有 2 个对应于增量和双精度增量值的集合。

倒谱均值和方差归一化

接下来,我们可以执行特征规范化。我们用其均值归一化特征,并将其除以其方差。均值和方差是使用单个语句中所有帧的特征值 j 计算的。这使我们能够调整值以对抗每个记录中的变体。

但是,如果音频剪辑很短,这可能不可靠。相反,我们可以根据说话人甚至整个训练数据集计算平均值和方差值。这种类型的功能规范化将有效地取消前面所做的预加重。这就是我们提取MFCC特征的方式。最后要注意的是,MFCC对噪声的抵抗力不是很强。

五、感知线性预测 (PLP)

PLP与MFCC非常相似。受听觉感知的激励,它使用相等响度预加重和立方根压缩而不是对数压缩。

它还使用线性回归来最终确定倒谱系数。PLP具有稍好的精度和稍好的噪声鲁棒性。但也有人认为MFCC是一个安全的选择。在本系列中,当我们说提取 MFCC 特征时,我们也可以提取 PLP 特征。

六、后记

        ML 为问题域构建模型。对于复杂的问题,这是非常困难的,并且该方法通常非常启发式。有时,人们认为我们正在入侵系统。本文中的特征提取方法在很大程度上依赖于实证结果和观察结果。随着深度学习的引入,我们可以用更少的黑客攻击来训练复杂的模型。但是,某些概念对于 DL 语音识别仍然有效且重要。

        下一个:为了更深入地了解语音识别,我们需要详细研究两种 ML 算法。

相关文章:

语音识别 — 特征提取 MFCC 和 PLP

一、说明 语音识别是一种技术,通过计算机和软件系统,将人们的口头语言转换为计算机可读的文本或命令。它使用语音信号处理算法来识别和理解人类语言,并将其转换为计算机可处理的格式。语音识别技术被广泛应用于许多领域,如语音助手…...

BES 平台 SDK之按键的配置

本文章是基于BES2700 芯片,其他BESxxx 芯片可做参考,如有不当之处,欢迎评论区留言指出。仅供参考学习用! BES 平台 SDK之LED的配置_谢文浩的博客-CSDN博客 关于系统LED简介可参考上一篇文章。链接如上所示! 一&…...

【Golang系统开发】搜索引擎(1) 如何快速判断网页是否已经被爬取

文章目录 1. 写在前面2. 数组存储3. 位图存储3.1 位图简介3.2 链表法3.3 开放寻址法 1. 写在前面 在实际工作中,我们经常需要判断一个对象是否存在,比如判断用户注册登陆时候,需要判断用户是否存在,再比如搜索引擎中的爬虫&#x…...

记录--一个好用的轮子 turn.js 实现仿真翻书的效果

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 国际惯例,官网链接 官网传送门 Github地址 github上有几个demos例子,介绍了基础用法。 我参考官网的例子,写了一个demo示例 安装 turn.js 依赖 jquery 库&#xff0…...

《Spring Boot源码解读与原理分析》书籍推荐

Spring Boot是目前Java EE开发中颇受欢迎的框架之一。依托于底层Spring Framework的基础支撑,以及完善强大的特性设计,Spring Boot已成为业界流行的应用和微服务开发基础框架。 《Spring Boot源码解读与原理分析》共14章,分为4个部分。第一部…...

C++ 什么时候使用 vector、list、以及 deque?

如果需要高效地快速访问(随即存取),并且不在乎插入和删除的效率,使用 vector 如果需要大量的插入和删除,而且不关心快速访问 (随即存取) ,使用 list 如果需要快速访问 (随即存取) ,并且关心两端数据插入和删除&#…...

视频创作者福音,蝰蛇峡谷NUC12SNKI7视频剪辑测评

英特尔NUC绝对是PC市场里最为特殊的产品,相比众多OEM设计制造的台式机而言,英特尔NUC主打小体积、高度集成化、强扩展性以及尽可能优异的性能表现。尤其是在主打游戏体验的NUC产品出现之后,更是将极致体验演绎到了极致。 在搭载独显的幻影峡谷…...

使用Qt中的QDir类进行目录操作

文章目录 概述QDir类的基本功能获取当前目录创建目录列出目录内容筛选目录内容筛选特定命名文件 复制文件和目录删除文件和目录更改文件名 应用场景总结 概述 Qt是一个跨平台的C应用程序开发框架,其中提供了许多方便的类来处理文件和目录操作。其中,QDi…...

qt服务器 网络聊天室

widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间server new QTcpServer(this); }Widget::~Widget() {delete ui; }//启动…...

meanshift算法通俗讲解【meanshift实例展示】

meanshift算法原理 meanshift算法的原理很简单。假设你有一堆点集,还有一个小的窗口,这个窗口可能是圆形的,现在你可能要移动这个窗口到点集密度最大的区域当中。 如下图: 最开始的窗口是蓝色圆环的区域,命名为C1。蓝…...

正交变换和仿射变换

正交变换和仿射变换 平面的正交变换 正交点变换(保距变换) 平面上的一个保持任意两点距离不变的点变换 平面正交变换性质 正交变换的乘积是正交变换恒等变换是正交变换正交变换将(不)共线的三点映射成(不&#xff09…...

Electron 多端通信桥 MessageChannelMain和 MessagePortMain 坑点汇集

简介 MessageChannelMain 是 DOM MessageChannel 对象的主进程等价对象。 它的特有功能是创建一对已连接的 MessagePortMain 对象。 Electron 本身为了灵活追加 on("message") 机制,就说明该 MessageChannelMain 已经被创建了,而 Web 开发中&a…...

Html5播放器按钮在移动端变小的问题解决方法

Html5播放器按钮在移动端变小的问题解决方法 用手机浏览器打开酷播云视频&#xff0c;有时会出现播放器按钮太小的情况&#xff0c;此时只需在<head>中加入下面这段代码即可解决&#xff1a; <meta name"viewport" content"widthdevice-width, initia…...

Rust 开发环境搭建【一】

Rust 开发环境 推荐 搭建&#xff1a; 安装 rust 语言 以及 工具链 推荐安装方法&#xff1a;rustup curl --proto ‘https’ --tlsv1.2 -sSf https://sh.rustup.rs | sh 在国内如果访问速度慢&#xff0c;可以使用清华大学提供的镜像服务&#xff1a; https://mirrors.tu…...

C# Blazor 学习笔记(3):路由管理

文章目录 前言路由管理App.razor设置登录页面设置空布局 前言 我们知道使用Blazor的官方模板&#xff0c;我们会自动得到一个拥有侧边栏的布局页面。但是我们发现我们所有新建的页面都有侧边栏。有时候我们需要跳出这个布局&#xff0c;比如我要做登录页面的时候&#xff0c;我…...

int[]数组转Integer[]、List、Map「结合leetcode:第414题 第三大的数、第169题 多数元素 介绍」

文章目录 1、int[ ] 转 Integer[ ]:2、两道leetcode题遇到的场景:2.1、int[ ] 转 List<Integer> :2.2、int[ ] 转 Map: 1、int[ ] 转 Integer[ ]: public static void main(String[] args) {int[] nums {1, 2, 3}; Integer[] array Arrays.stream(nums).boxed().to…...

vue子传父的一种新方法:this.$emit(‘input‘, value)可实现实时向父组件传值

今天要说的就是利用v-model和this.$emit(‘input’,value)实现子传父。 众所周知&#xff0c;v-model是给input绑定&#xff0c;方便对表单的双向绑定。 其实&#xff0c;v-model是个语法糖&#xff0c;具体案例如下所示。 <input v-model"inputValue">相当于…...

【Web】web

dns与域名 网络是基于tcp/ip协议进行通信和连接的 应用层——传输层——网络层——数据链路层——物理层 每一定的台主机都有一个唯一且固定的地址标识——IP地址 IP地址的做用&#xff1a;1.区分用户和计算机&#xff1b;2.进行通信 IP地址由32位二进制数组成&#xff0c;…...

css中的bfc是什么?

什么bfc&#xff1f; BFC&#xff08;Block Formatting Context&#xff09;块级 格式化 上下文。 BFC就是页面上的一个隔离的独立盒子&#xff0c;容器里面的子元素和外面的元素不会相互影响。 为什么要bfc? bfc是我们去主动触发的,并不是自动就存在的,它是帮助我们解决cs…...

【前端知识】React 基础巩固(四十四)——其他Hooks(useContext、useReducer、useCallback)

React 基础巩固(四十四)——其他Hooks&#xff08;useContext、useReducer、useCallback&#xff09; 一、useContext的使用 在类组件开发时&#xff0c;我们通过 类名.contextType MyContext的方式&#xff0c;在类中获取context&#xff0c;多个Context或者在函数式组件中…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...