从音频中提取MFCC特征的过程

news2024/11/20 6:23:53

在语音信号处理和语音识别领域,梅尔频率倒谱系数(MFCC)是最常用的特征之一。本文将逐步介绍如何从音频中提取MFCC特征,并在每个步骤中进行可视化展示。

步骤 1:加载音频文件并查看波形

首先,我们需要加载音频文件并查看其波形。为了便于处理,我们将MP3文件转换为WAV格式。

from pydub import AudioSegment
import scipy.io.wavfile as wav
import matplotlib.pyplot as plt

# 转换 MP3 文件为 WAV 格式
audio_path = '/mnt/data/00000000.mp3'
audio = AudioSegment.from_mp3(audio_path)
wav_path = '/mnt/data/converted.wav'
audio.export(wav_path, format='wav')

# 读取 WAV 文件
rate, data = wav.read(wav_path)

# 绘制波形
plt.figure(figsize=(14, 5))
plt.title("Waveform of the Audio")
plt.plot(data)
plt.xlabel("Time (samples)")
plt.ylabel("Amplitude")
plt.show()

在这里插入图片描述

步骤 2:预加重

预加重是增强高频部分的一种方法。预加重信号可以通过以下公式实现:
emphasized_signal [ n ] = signal [ n ] − 0.97 × signal [ n − 1 ] \text{emphasized\_signal}[n] = \text{signal}[n] - 0.97 \times \text{signal}[n-1] emphasized_signal[n]=signal[n]0.97×signal[n1]

pre_emphasis = 0.97
emphasized_signal = np.append(data[0], data[1:] - pre_emphasis * data[:-1])

# 绘制预加重后的波形
plt.figure(figsize=(14, 5))
plt.title("Emphasized Signal")
plt.plot(emphasized_signal)
plt.xlabel("Time (samples)")
plt.ylabel("Amplitude")
plt.show()

在这里插入图片描述

步骤 3:分帧

将信号分成重叠的帧,每帧长度为25ms,帧移为10ms。分帧可以通过以下代码实现:

frame_size = 0.025
frame_stride = 0.01
frame_length, frame_step = int(round(frame_size * rate)), int(round(frame_stride * rate))
signal_length = len(emphasized_signal)
num_frames = int(np.ceil(float(np.abs(signal_length - frame_length)) / frame_step))

pad_signal_length = num_frames * frame_step + frame_length
z = np.zeros((pad_signal_length - signal_length))
pad_signal = np.append(emphasized_signal, z)

indices = np.tile(np.arange(0, frame_length), (num_frames, 1)) + np.tile(np.arange(0, num_frames * frame_step, frame_step), (frame_length, 1)).T
frames = pad_signal[indices.astype(np.int32, copy=False)]

# 绘制分帧后的结果
plt.figure(figsize=(14, 5))
plt.title("Framed Signal")
plt.plot(frames[0])
plt.xlabel("Samples")
plt.ylabel("Amplitude")
plt.show()

在这里插入图片描述

步骤 4:加窗

每帧加上一个汉明窗,以减少频谱泄漏。加窗可以通过以下代码实现:

frames *= np.hamming(frame_length)

# 绘制加窗后的结果
plt.figure(figsize=(14, 5))
plt.title("Windowed Frame")
plt.plot(frames[0])
plt.xlabel("Samples")
plt.ylabel("Amplitude")
plt.show()

在这里插入图片描述

步骤 5:计算功率谱

对每帧进行傅里叶变换,计算功率谱。功率谱可以通过以下公式计算:
Power Spectrum = 1 N F F T × ∣ FFT ∣ 2 \text{Power Spectrum} = \frac{1}{NFFT} \times |\text{FFT}|^2 Power Spectrum=NFFT1×FFT2

NFFT = 512
mag_frames = np.absolute(np.fft.rfft(frames, NFFT))
pow_frames = ((1.0 / NFFT) * (mag_frames ** 2))

# 绘制功率谱
plt.figure(figsize=(14, 5))
plt.title("Power Spectrum")
plt.plot(pow_frames[0])
plt.xlabel("Frequency (Hz)")
plt.ylabel("Power")
plt.show()

在这里插入图片描述

步骤 6:应用梅尔滤波器组

将功率谱通过梅尔滤波器组,得到梅尔频率能量谱。梅尔滤波器组的实现代码如下:

nfilt = 40
low_freq_mel = 0
high_freq_mel = (2595 * np.log10(1 + (rate / 2) / 700))
mel_points = np.linspace(low_freq_mel, high_freq_mel, nfilt + 2)
hz_points = (700 * (10**(mel_points / 2595) - 1))
bin = np.floor((NFFT + 1) * hz_points / rate)

fbank = np.zeros((nfilt, int(np.floor(NFFT / 2 + 1))))
for m in range(1, nfilt + 1):
    f_m_minus = int(bin[m - 1])
    f_m = int(bin[m])
    f_m_plus = int(bin[m + 1])
    for k in range(f_m_minus, f_m):
        fbank[m - 1, k] = (k - bin[m - 1]) / (bin[m] - bin[m - 1])
    for k in range(f_m, f_m_plus):
        fbank[m - 1, k] = (bin[m + 1] - k) / (bin[m + 1] - bin[m])

filter_banks = np.dot(pow_frames, fbank.T)
filter_banks = np.where(filter_banks == 0, np.finfo(float).eps, filter_banks)
filter_banks = 20 * np.log10(filter_banks)

# 绘制梅尔频率能量谱
plt.figure(figsize=(14, 5))
plt.title("Mel Filter Bank Energies")
plt.imshow(filter_banks.T, aspect='auto', origin='lower')
plt.xlabel("Time (frames)")
plt.ylabel("Filter Banks")
plt.colorbar()
plt.show()

在这里插入图片描述

步骤 7:计算MFCC

对梅尔频率能量谱进行离散余弦变换(DCT),得到MFCC特征。计算MFCC的代码如下:

num_ceps = 13
mfcc = scipy.fftpack.dct(filter_banks, type=2, axis=1, norm='ortho')[:, :num_ceps]

# 绘制MFCC特征
plt.figure(figsize=(14, 5))
plt.title("MFCC")
plt.imshow(mfcc.T, aspect='auto', origin='lower')
plt.xlabel("Time (frames)")
plt.ylabel("MFCC Coefficients")
plt.colorbar()
plt.show()

在这里插入图片描述

通过这些步骤,我们可以详细地了解MFCC特征提取的过程及其每一步的效果。这些图示有助于更好地理解音频特征提取的工作原理。

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

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

相关文章

安装与配置:MySQL的环境搭建之旅(二)

目录 引言:从理论到实践的跨越 一、安装MySQL:跨平台的便捷指南 Windows环境 Linux环境 macOS环境 二、基本配置:端口设置与字符集选择 三、从零到一的蜕变 引言:从理论到实践的跨越 在前一章节《MySQL简介》中&#xff0c…

力扣随机一题 6/26 哈希表 数组 思维

博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 题目一: 2869.收集元素的最少操作次数【简单】 题目&#xff…

Flutter实现页面间传参

带参跳转 步骤 在router中配置这个路由需要携带的参数,这里的参数是 arguments,注意要用花括号包裹参数名称 在相应组件中实现带参构造函数 在state类中可以直接使用${widget.arguments}来访问到传递的参数 在其他页面中使用Navigator.pushNamed()带参跳转

【课程总结】Day11(中):手势图像识别实战(Vgg16和ResNet)

前言 在上一章《【课程总结】Day11(上):手势图像识别实战(LeNet模型)》课程中,我们通过使用LeNet模型实现了手势识别。在本章内容中,我们将搭建Vgg模型和ResNet模型,并应用到手势识别中。 Vgg模型 Vgg简…

黑马点评06短信登录-用户请求和会话管理过程

用户请求发送: 用户的浏览器向服务器发送请求(例如,访问网页或提交表单)。请求头包含之前存储在浏览器中的Cookie,其中包括会话ID(Session ID)。 服务器接收请求: 服务器接收到用户的…

智慧城市:数据可视化如何提升城市管理

数据可视化在智慧城市中有何应用?随着城市化进程的加快和信息技术的飞速发展,智慧城市的建设成为全球各大城市追求的目标。而数据可视化技术作为智慧城市的重要组成部分,通过将复杂的数据转化为直观、易理解的图表和图形,极大地提…

c#关键字 ArgumentOutOfRangeException .? IEnumerable string.Join

c# ArgumentOutOfRangeException ArgumentOutOfRangeException 是 C# 中表示某个参数值超出了方法或属性定义的有效范围时引发的一个异常。这个异常通常在尝试访问数组、集合、字符串等的无效索引,或者当传递给方法或属性的参数不在其有效范围内时发生。 例如&…

Rill Data:实时数据分析的未来

欢迎来到 Rill Rill是从数据湖到仪表板的最快路径。 rilldata 与大多数 BI 工具不同,Rill 带有自己的嵌入式内存数据库。数据和计算位于同一位置,查询以毫秒为单位返回。 因此,您可以即时透视、切片和深入研究数据。 下载 Rill 开始建模数…

写程序100道41-50

41.定义一个Father和Child类,并进行测试。 要求如下: (1)Father类为外部类,类中定义一个私有的String类型的属性name,name的值为“Join”。 (2)Child类为Father类的内部类,其中定义一个readName()方法,方…

【数据结构初阶】--- 归并排序

归并排序 递归递归的思路归并的步骤:代码示例 非递归快排为什么可以用栈模拟:归并可以用栈模拟吗?非递归的思路初版代码示例问题:越界 时间复杂度针对递归的优化小区间优化 递归 递归的思路 归并的前提是需要两个有序的区间&…

LLM大模型算法学习资源持续整理

文章目录 waytoagiLLM101llm-coursellm-cookbook waytoagi 飞书文档写的AGI知识库。 https://www.waytoagi.com/ LLM101 karpathy更新中的大模型教程: https://github.com/karpathy/LLM101n llm-course Course to get into Large Language Models (LLMs) wi…

【前端】实现时钟网页

【前端】实现时钟网页 文章目录 【前端】实现时钟网页项目介绍代码效果图 项目介绍 时钟显示在网页中央,并且使网页能够切换白天和夜晚两种模式。搭建基本的html结构,动态得到实时的时,分,秒 通过Date()函数获得。将得到的数字根…

单片机学习记录

一,单片机及开发板介绍 1,基本介绍 单片机,英文Micro Controller Unit,简称MCU内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(…

SpringBoot整合拦截器和日期转换器

一、SpringBoot整合拦截器 1.添加拦截器 package com.by.interceptor;import com.by.pojo.User; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import java…

程序员如何用ChatGPT解决常见编程问题:实例解析

引言 在现代编程的世界中,技术进步日新月异,程序员们面临着各种各样的挑战和问题。解决这些问题的过程中,找到合适的工具至关重要。ChatGPT作为一种先进的人工智能语言模型,能够帮助程序员迅速、高效地解决常见的编程问题。本文将…

【Liunx-后端开发软件安装】Liunx安装FDFS并整合nginx

【Liunx-后端开发软件安装】Liunx安装nacos 文章中涉及的相关fdfs相关软件安装包请点击下载: https://download.csdn.net/download/weixin_49051190/89471122 一、简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括…

揭秘循环购模式:消费即投资,边消费边赚钱!

大家好,我是你们的电商顾问吴军。今天,我将带大家走进一个引人瞩目的商业模式——循环购模式。你可能会好奇,为何有商家能如此慷慨,消费1000元就送2000元?每天还有额外的现金收入?这背后究竟隐藏着怎样的秘…

Cadence计算器函数leafValue

与getData结合使用 leafValue( getData(“/output” ?result “dc”) 转自eetop https://bbs.eetop.cn/thread-931912-1-1.html

20240627 每日AI必读资讯

🔍挑战英伟达!00 后哈佛辍学小哥研发史上最快 AI 芯片 - 3名大学辍学生创立、目前仅35 名员工、刚筹集1.2 亿美元的团队:Etched。 - 史上最快Transformer芯片诞生了! - 用Sohu跑Llama 70B,推理性能已超B200十倍&…

让AI保持怪异

让AI保持怪异 Anthropic的创意技术专家和员工设计师凯尔图尔曼(Kyle Turman)分享了一种深深引起共鸣的观点。他说(转述原话):“人工智能实际上真的很奇怪,我认为人们对这一点的认识还不够。”这引发了我向小组提出的问题:我们是否有消毒人工智能固有的陌生感的风险?…