梅尔频率倒谱系数(mfcc)及Python实现

yizhihongxing

关于“梅尔频率倒谱系数(MFCC)及Python实现”的攻略,我将分为以下几个部分进行讲解:

  1. 梅尔频率倒谱系数的概念和优势
  2. 实现步骤
  3. 代码示例
  4. 注意事项

下面我会详细解释每一部分内容。

1. 梅尔频率倒谱系数的概念和优势

MFCC是一种在音频信号处理中非常常用的特征提取方法,也是比较有效的一种。它可以将音频信号的频率与人类听觉系统的特点相结合,提取出来对语音信号鲁棒性比较高的特征,等价于用一组均衡的梳子滤波器替代传统的线性滤波器提取音频信号的特征。在自然语言处理领域、语音识别、说话人识别等领域应用非常广泛,而且由于它提取的主要是人耳可以区分的音高和音量等信息,所以它对于人耳识别音频信号的方式有很好的模拟。

2. 实现步骤

步骤如下:

  1. 预处理:将音频波形分帧,每帧进行加窗处理(通常使用汉明窗)、进行变换
  2. 傅里叶变换:对每帧应用离散傅里叶变换(DFT),得到频谱
  3. 梅尔滤波器组:计算每个频点所对应的梅尔频率,建立梅尔滤波器组
  4. 传递函数:将每个频带的能量通过对应的梅尔滤波器进行加权(通过一个带通滤波器的频率响应),得到每帧的梅尔带能量
  5. 对数转换:取梅尔带能量的对数
  6. DCT变换:将对数能量序列进行离散余弦变换(DCT),得到MFCC特征参数

3. 代码示例

以下是一个基础的python程序示例,使用librosa库进行mfcc特征提取:

import librosa

# 读入音频文件
y, sr = librosa.load('test.wav')

# 计算mfcc特征
mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=40)

# 打印mfcc特征
print(mfccs)

上面的代码使用了librosa库中的librosa.load()函数从文件中读取音频数据,然后使用librosa.feature.mfcc()函数提取40维的mfcc特征,最后打印了提取的mfcc特征。

以下是一个更复杂的实现示例,它显示了mfcc特征提取的更详细的实现过程:

import numpy as np
from scipy.fftpack import dct

# 定义常数
sample_rate = 16000           # 采样频率
frame_size = 0.025            # 每一帧的时间长度(单位:秒)
frame_stride = 0.01           # 错开帧之间时间长度
NFFT = 512                    # 傅里叶变换长度
nfilt = 40                    # Mel滤波器的个数

# 计算梅尔滤波器的中心频率
low_freq_mel = 0   
high_freq_mel = (2595 * np.log10(1 + (sample_rate / 2) / 700))   
mel_points = np.linspace(low_freq_mel, high_freq_mel, nfilt + 2)  
hz_points = (700 * (10**(mel_points / 2595) - 1)) 
bins = np.floor((NFFT + 1) * hz_points / sample_rate)

# 初始化过滤器组和矩阵
fbank = np.zeros((nfilt, int(np.floor(NFFT / 2 + 1))))
for i in range(1, nfilt + 1):
    left = int(bins[i - 1])
    center = int(bins[i])
    right = int(bins[i + 1])
    for j in range(left, center):
        fbank[i - 1, j] = (j - bins[i - 1]) / (bins[i] - bins[i - 1])
    for j in range(center, right):
        fbank[i - 1, j] = (bins[i + 1] - j) / (bins[i + 1] - bins[i])

# 读入音频文件,并使用预加重进行预处理
signal = np.fromfile('test.wav', dtype=float)                              
pre_emphasis = 0.97
emphasized_signal = np.append(signal[0], signal[1:] - pre_emphasis * signal[:-1])

# 进行分帧及加窗处理
frame_length,frame_step = frame_size * sample_rate,frame_stride * sample_rate  
signal_length = len(emphasized_signal)
frame_length = int(round(frame_length))
frame_step = int(round(frame_step))
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)]

# 应用汉明窗进行加窗处理
frames *= np.hamming(frame_length)

# 计算能量谱
mag_frames = np.absolute(np.fft.rfft(frames, NFFT))
pow_frames = ((1.0 / NFFT) * ((mag_frames) ** 2))

# 计算梅尔滤波器能量谱
fbank_feat = np.dot(pow_frames, fbank.T)
fbank_feat = np.where(fbank_feat == 0, np.finfo(float).eps, fbank_feat) # Avoid zero
fbank_feat = 20 * np.log10(fbank_feat)                                # log

# 计算mfcc系数
mfcc_feat = dct(fbank_feat, type=2, axis=1, norm='ortho')[:, :num_ceps]

# 打印mfcc特征
print(mfcc_feat)

上面的代码中,首先我们定义了一些常数和参数,然后将音频文件读入并使用预加重进行预处理。接下来,我们将信号进行分帧,并应用汉明窗进行加窗处理,之后计算每一帧能量谱和梅尔滤波器能量谱,应用离散余弦变换计算得到MFCC特征参数,最后打印提取的MFCC特征。

4. 注意事项

  1. MFCC是一种相对较复杂的算法,如果你不是很明白它的原理和实现方法,最好先阅读相关论文或参考相关代码实现
  2. 实现MFCC需要用到一些高级的数学知识,比如傅里叶变换、离散余弦变换等,所以需要确保自己对这些知识有一定的掌握
  3. 对于音频数据的处理和特征提取需要非常耗费计算资源,如果是较大的数据集建议使用GPU进行并行计算
  4. 在提取MFCC特征时,可以通过调整每帧的时间长度、Mel滤波器的个数、DCT的系数等参数来调整提取到的特征参数

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:梅尔频率倒谱系数(mfcc)及Python实现 - Python技术站

(1)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • python Selenium实现付费音乐批量下载的实现方法

    Python Selenium实现付费音乐批量下载的实现方法 简介 付费音乐下载受到版权保护,通常需要用户登录并支付费用后才能进行下载。本文将介绍如何使用Python Selenium库实现批量下载付费音乐。 步骤 1. 安装Selenium库 首先需要下载并安装Selenium库。在命令行中输入以下命令即可: pip install selenium 2.…

    python 2023年6月3日
    00
  • Python中的变量和数据类型详情

    Python中的变量和数据类型详情 变量 命名规则 在Python中,变量名是对存储数据位置的标识符。命名变量时需要遵守一些规则: 变量名只能包含字母、数字和下划线。 变量名不能以数字开头。 变量名应该具有描述性。 变量名区分大小写。 避免使用Python关键字和内置函数作为变量名。 赋值符号 在Python中通过赋值符号(=) 创建变量并为其赋值,例如: …

    python 2023年5月14日
    00
  • 一个Python最简单的接口自动化框架

    一个Python最简单的接口自动化框架 在Python中,实现接口自动化测试是一个常见的需求。以下是一个示例,介绍了如何使用Python实现一个最简单的接口自动化框架。 示例一:使用unittest实现接口自动化测试 以下是一个示例,可以使用unittest实现接口自动化测试: import unittest import requests class Te…

    python 2023年5月15日
    00
  • 详解Python 卡方决策

    Python 卡方决策(Chi-squared Test)是一种用于判断样本是否符合某种理论分布的方法。它通过计算样本与理论分布的偏离程度,来判断样本的合理性。在统计学中,卡方检验是一种广泛使用的非参数检验方法。 下面我们来详细讲解Python 卡方决策 的完整攻略。主要包含以下几个步骤: 1. 导入必要的包 首先我们需要导入必要的包,主要包括numpy和s…

    python-answer 2023年3月25日
    00
  • 可能是最全面的 Python 字符串拼接总结【收藏】

    “可能是最全面的 Python 字符串拼接总结【收藏】”是一篇对 Python 字符串拼接的总结性文章。如果你想学习和提高 Python 字符串的拼接技能,可以参考这篇文章。下面是该文章的详细讲解: 标题 文章的标题对于读者来说非常重要,它可以让读者快速了解文章的主题和内容。该文章的标题为“可能是最全面的 Python 字符串拼接总结【收藏】”,通过这个标题…

    python 2023年6月5日
    00
  • python+pytest接口自动化之日志管理模块loguru简介

    欢迎来到本篇文章,本文主要介绍Python+pytest接口自动化测试中的一个强大的日志管理模块——loguru。 什么是loguru? loguru是一款Python的日志管理模块,具有以下特点: 易于使用,方便快捷地记录Python日志; 提供多种配置方式,满足不同用户的需求; 具有强大的过滤和格式化功能; 支持多进程、多线程、异步I/O等场景下的日志记…

    python 2023年6月6日
    00
  • python自动化实现自动回复QQ消息

    下面我会给出详细的“Python自动化实现自动回复QQ消息”的攻略,包含了流程步骤、示例代码和注意事项等。 流程步骤 获取webqq的cookie值,用于建立会话。 可以通过selenium库打开QQ登录页面,并且填入正确的账号密码登陆,然后再获取页面上的cookie值。 通过搜索获取好友或群的uin号码。 观察到QQ会话页面的网址,可以发现里面有好友或群的…

    python 2023年5月19日
    00
  • Python3 实现递归求阶乘

    下面是 Python3 实现递归求阶乘的完整攻略: 实现递归求阶乘 首先,了解递归的概念是非常重要的。递归是指一个函数在调用自身的情况下,解决问题的能力。Python中的递归函数可以通过简单的调用自身来实现。递归求阶乘实际上就是在函数体中调用自身。 以下是 Python3 实现递归求阶乘的代码: def factorial(n): if n == 1: re…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部