MFCC特征提取

article/2025/10/20 22:24:23

         在语音识别方面,最常用到的语音特征就是梅尔倒谱系数(Mel-scaleFrequency Cepstral Coefficients,简称MFCC)。

        MFCC的提取过程包括预处理、快速傅里叶变换、Mei滤波器组、对数运算、离散余弦变换、动态特征提取等步骤。

1.预处理

        对原始音频数据进行数字化、预滤波、预加重、端点检测、分帧、加窗等操作,使其信号特征更加明显,去除冗余数据。

2.快速傅里叶变换

        快速傅里叶变换即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。

        将音频从时域转换为频域。

3.Mel滤波器组

        研究表明,人类对频率的感知并不是线性的,并且对低频信号的感知要比高频信号敏感。对1kHz以下,与频率成线性关系,对1kHz以上,与频率成对数关系。频率越高,感知能力就越差。

        为了模拟人耳的听觉机制。从而研制出来了Mel滤波器组。

        所以,Mel滤波器组的在低频密集,高频稀疏。

梅尔刻度定义:

        它是Hz的非线性变换,对于以mel scale为单位的信号,可以做到人们对于相同频率差别的信号的感知能力几乎相同。

        HZ 与 mel scale 的相互转换关系如下:

        Mel\left ( f \right )=2595*log_{10}\left ( 1+\frac{f}{700} \right )

        f = Mel^{-1}\left ( f \right )=700\left ( 10^{\frac{m}{2595}}-1 \right )

        如果对数以 e  为底,则系数的取值为 1125。

 梅尔滤波器组的设计步骤:

        1)确定最低频率f_{low}(0HZ)、最高频率f_{hig}(fs / 2)、Mel滤波器个数M(一般为24)

        2)在Mel频率下,这些滤波器的中心频率是等间距的,则:

        f_{d}\left ( mel \right ) = \frac{Mel\left ( f_{low} \right )+Mel\left ( f_{hig} \right )}{M+1}

        3)每个滤波器的中心频率

f\left ( m \right )=\left ( \frac{N}{f_{s}} \right )Mel^{-1}\left ( Mel\left ( f_{low} \right )+m\frac{Mel\left ( f_{low} \right )-Mel\left ( f_{hig} \right )}{M+1} \right )

                其中: 1\leq m\leq M,N为DFT的频率长度,fs 为频率采样频率。

        4)每个滤波器的函数如下:

         综上4个步骤既可以生成如下等高梅尔滤波器:

         这与开篇的梅尔滤波器略有不同,此处为各个滤波器等高,而开篇的滤波器不等高,这有什么影响吗?

        如开篇所示的不等高滤波器形式叫等面积梅尔滤波器。其在低频处密集高耸,高频处稀疏低矮。恰好对应了频率越高人耳越迟钝这一规律,在人声等领域有广泛应用。但是如果在非人声领域就会丢掉很多高频信息,此时常用等高梅尔滤波器。

        三角带通滤波器有两个主要目的:

        1)对频谱进行平滑化,并消除谐波的作用,突显原先语音的共振峰。频谱有包络和精细结构,分别对应音色与音高。对于语音识别来讲,音色是主要的有用信息,音高一般没有用。在每个三角形内积分,就可以消除精细结构,只保留音色的信息。

        2)傅里叶变换得到的序列很长(一般为几百到几千个点),把它变换成每个三角形下的能量,可以减少数据量。

生成Mel语谱图:

        能量谱,也称为能量谱密度。是指用密度的概念表示信号能量在各频率点的分布情况。也即是说,对能量谱在频域上积分就可以得到信号的能量。能量谱是信号幅度谱的模的平方,其量纲是焦/赫。

        (补充:能量信号和功率信号的分别 - 知乎)

        将能量谱通过一组Mel尺度的三角形滤波器组,其公式为:

        Y_{t}\left ( m \right )=\sum_{k=1}^{N}H_{m}\left ( k \right )\left | X_{t}\left ( k \right ) \right |^{2}

        得到梅尔语谱图:

        其中横轴为时间,纵轴为频率,颜色深浅为能量。 

4.对数运算

        对数运算包括取模和log运算。

        将原始语音信号经过傅里叶变换得到频谱:

        X[k]=H[k]E[k]

        取模是仅使用幅度值,忽略相位的影响,因为相位信息在语音识别中作用不大。

        \left | X[k] \right |=\left | H[k] \right |\left | E[k] \right |

        log 运算是为了分别包络和细节,包络代表音色,细节代表音高。显然语音识别是为了识别音色。另外,人的感知与频域的对数成成本,正好使用log运算对上述梅尔语谱图的纵轴进行对数缩放,可以放大低频率处的能量差异。

        log\left | X[k] \right |=log\left | H[k] \right |+log\left | E[k] \right |

5.离散余弦变换(DCT)

        在上一步中,我们通过对数运算成功地把基音信息与声道信息变成了加性的。那么如何分离呢?它们有如下性质:  

频谱图中(注意是一帧原始语音信号FFT变换内)

        (1)基音信息在频域是快速变化的。

        (2)声道信息在频域是缓慢变化的。

倒谱的概念:

        定义:倒谱定义为信号短时振幅谱(功率谱)的对数傅里叶反变换

        特点:具有可近似地分离并能提取出频谱包络信息和细微结构信息的特点。

        可见我们只需要求出梅尔频谱的对数傅里叶反变换即可分离基音信息和声道信息。

        x[k]=h[k]+e[k]

        在对数频谱上面做IFFT就相当于在一个伪频率(pseudo-frequency)坐标轴上面描述信号。所以虽然是时域序列,但它们所处的离散时域显然不同,此时称为倒谱频域。

        x[k]实际上就是倒谱Cepstrum。(这个是一个新造出来的词,把频谱的单词spectrum的前面四个字母顺序倒过来就是倒谱的单词了)。而我们所关心的h[k]就是倒谱的低频部分。h[k]描述了频谱的包络,它在语音识别中被广泛用于描述特征。

        在Mel频谱上面获得的倒谱系数h[k]就称为Mel频率倒谱系数,简称MFCC。

但是:MFCC特征使用的是DCT,而不是IDFT

        由于许多要处理的信号都是实信号,在使用DFT时由于傅里叶变换时由于实信号傅立叶变换的共轭对称性导致DFT后在频域中有一半的负数部分,但这里复数系数并不太需要。DCT可以看作是IDFT的简化版,DCT得到的是实值系数。

        mel滤波器组有很多重叠部分,DCT可以在不同的mel频带上去相关性,因为在机器学习中,希望输入的特征之间的相关性越小越好。而且DCT相当于是对log mel谱的降维。

需要选择多少个系数 h[k]?

        因为一般只关注声道信息,即谱包络成分(低频),因为声道信息包涵了我们感兴趣的成分,如音素信息、共振峰等,所有一般选前12-13个系数。

        由此得到的12维的MFCC特征如下: 

6.动态特征提取

        标准的倒谱参数MFCC只反映了语音参数的静态特性,语音的动态特性可以用这些静态特征的差分谱来描述。实验证明:把动、静态特征结合起来才能有效提高系统的识别性能。差分参数的计算可以采用下面的公式:

         其中,dt 表示第 t 个一阶差分,Ct 表示第 t 个倒谱系数,Q表示倒谱系数的阶数,K表示一阶导数的时间差,可取1或2。将上式的结果再代入就可以得到二阶差分的参数。

        因此,MFCC的全部组成其实是由: N维MFCC参数(N/3个MFCC系数+ N/3个一阶差分参数+ N/3个二阶差分参数)+帧能量(此项可根据需求替换)。这里的帧能量是指一帧的音量(即能量),也是语音的重要特征。

        最终得到36维MFCC图(3*12):

         (注:图为39(3*13)维MFCC图)

        


http://chatgpt.dhexx.cn/article/YLVHRSmm.shtml

相关文章

MFCC算法讲解及实现(matlab)

史上最详细的MFCC算法实现(附测试数据) 1.matlab安装voicebox语音包2.MFCC原理讲解3.MFCC算法设计实现(matlab)3.1 .wav格式语音文件提取【x(200000*1)】3.2 预加重【x(200000*1)】3.3 分帧{S(301*1103)}3.4 加窗{C(301*1103)}3.5…

Parquet encoding

Dictionary encoding

Parquet原理剖析

行存VS列存 广义的数据分析系统大致分为可以分为计算层、数据格式层和存储层。 计算层主要负责数据查询的介入和各种逻辑计算,如:MR、Spark、Flink。 存储层承载数据持久化存储,以文件语义或类似文件语义(对象存储)对接计算层。 数据格式层&…

Spark 实战 - 3.一文搞懂 parquet

一.引用 parquet 文件常见于 Spark、Hive、Streamin、MapReduce 等大数据场景,通过列式存储和元数据存储的方式实现了高效的数据存储与检索,下面主要讲 parquet 文件在 spark 场景下的存储,读取与使用中可能遇到的坑。 二.Parquet 加载方式 …

Spark Parquet使用

Spark SQL下的Parquet使用最佳实践和代码实战 分类: spark-sql(1) 一、Spark SQL下的Parquet使用最佳实践 1)过去整个业界对大数据的分析的技术栈的Pipeline一般分为以下两种方式: a)Data Source -> HD…

Arrow 之 Parquet

Parquet-format 左边是文件开头及具体的数据, 右边是文件结尾的 Footer Metadata There are three types of metadata: file metadata, column (chunk) metadata and page header metadata. All thrift structures are serialized using the TCompactProtocol. Co…

parquet存入mysql_解密列存 parquet

在做数据分析的时候,相对于传统关系型数据库,我们更倾向于计算列之间的关系。在使用传统关系型数据库时,基于此的设计,我们会扫描很多我们并不关心的列,这导致了查询效率的低下,大部分数据库 io 比较低效。因此目前出现了列式存储。Apache Parquet 是一个列式存储的文件格…

Parquet原理

在互联网大数据应用场景下,通常数据量很大且字段很多, 但每次查询数据只针对其中的少数几个字段,这时候列式存储是极佳的选择。 列式存储要解决的问题: 把IO只给查询需要用到的数据 只加载需要被计算的列空间节省 列式的压缩效…

parquet--golang使用

github 其实如果不适用一些可视化工具解析parquet文件,不太好看parquet文件内部正常应该是什么样的。但是使用一些可视化工具的话,可以发现,parquet文件会像表格,如excel文件,csv文件那样,排列数据。通过结…

Parquet

动机 创建Parquet是利用压缩性,高效的列式存储来在Haddop生态圈任何项目中应用. 记住Parquet是构建在复杂嵌套的数据结构, 并且使用记录分解和集成的算法在Dremely论文中描述.我们相信这种方法是更强大的的可以非常简单的使嵌套命令空间的扁平化. Parquet构建可以非常高效的…

Parquet 存储格式

1.介绍 Apache Parquet 是 Hadoop 生态圈中一种新型列式存储格式,它可以兼容 Hadoop 生态圈中大多数计算框架(Mapreduce、Spark 等),被多种查询引擎支持(Hive、Impala、Drill 等),并且它是语言和平台无关的。 2.特点…

parquet 简介

参考文章:parquet 简介 Parquet原理 【2019-05-29】Parquet 简介 Apache Parquet是一种能够有效存储嵌套数据的列式存储格式。 面向分析型业务的列式存储格式 由 Twitter 和 Cloudera 合作开发,2015 年 5 月从 Apache 的孵化器里毕业成为 Apache 顶…

Parquet文件详解

1、parquet文件简介 Apache Parquet是Apache Hadoop生态系统的一种免费的开源面向列的数据存储格式。 它类似于Hadoop中可用的其他列存储文件格式,如RCFile格式和ORC格式。 Apache Parquet 是由 Twitter 和 Cloudera 最先发起并合作开发的列存项目,也是…

Gson解析json数据

gson是谷歌推出的,除此之外还有阿里的FastJson,官方json和jackjson。下面通过一个实例来讲解使用gson来解析json数据: 1.先做好准备工作,在网上下载Gson的jar包,放到工程的libs(没有此目录的话自己建一个)目录下: ht…

Android Gson解析json

前言: 解析json的库有很多,如:JSON-Java、Gson、Jackson、FastJson…而Gson是谷歌的,相信自有它的好处 简介 用于json与java对象之间的转换通过 序列化和反序列化 实现功能强大,稳定性也好 使用 Gson提供了两个方…

Android 使用 Gson 解析 json 数据及生成

1.导入 Gson 包 第一种导入Gson 包的方式 在 app 文件下的 build.gradle 文件 导入 gson:2.9.1 包 implementation com.google.code.gson:gson:2.9.1第二种导入Gson 包的方式 直接去下载最新的 Gson 包 下载链接:gson.jar 选择最新的包进行下载 将下载的 gson…

用Gson解析json

首先我们需要导入gson的jar包,因为gson解析方法不是java官方的而是谷歌提供的。 一.把json数据转成java对象 首先因为已经手动导入了jar包,现在只需创建解析器对象,当然首先得有一个json类型的文件地址,和文件输出流 第二步调用…

Android --Gson解析json数据

Android --Gson解析json数据 private void analyseJson() throws Exception {InputStream isgetAssets().open("dataTest.json");ByteArrayOutputStream baosnew ByteArrayOutputStream();byte[] bytesnew byte[1024];int len;while ((lenis.read(bytes))!-1){baos.…

Gson解析json字符串

Gson 怎样使用gson把一个json字符串解析成一个jsonObject对象 因此我要把上面的fastjson转换成是gson,如下图: JsonObject object new JsonParser().parse(result).getAsJsonObject();怎样从gson中取出键的值 使用gson把json字符串转换成一个list集合 …

使用Gson解析Json数据

目录 一、Gson介绍 二、使用方法 完整代码: MainActivity: 布局: 运行结果: 一、Gson介绍 Gson是Google提供的一个Java库,用于将Java对象转换为JSON格式数据或将JSON格式数据转换为Java对象。 常用方法: 方法名…