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

关于“梅尔频率倒谱系数(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实现自动售货机

    Python实现自动售货机攻略 自动售货机是一种现代化的售卖商品的方式,利用这种方式可以大大提高售货的效率和方便性。本文将介绍一种基于Python的自动售货机实现方法。 实现过程 确定商品种类和售价。在程序中设定商品名称和对应售价,可以通过字典的方式来实现。例如: pythonproducts = {‘可乐’: 3, ‘雪碧’: 3, ‘矿泉水’: 2, ‘…

    python 2023年5月19日
    00
  • 利用Python实现自动生成数据日报

    利用Python实现自动生成数据日报 介绍 数据分析是当今公司决策的重要组成部分,一份清晰、易懂且结构良好的数据日报是非常有必要的。本文将介绍如何通过Python自动生成数据日报。 步骤 收集数据 首先,我们需要收集需要的数据并存入Excel文件中,这里我们可以使用pandas库来读取Excel文件。 “`python import pandas as p…

    python 2023年5月19日
    00
  • 浅谈python中的面向对象和类的基本语法

    当谈到面向对象编程时,我们不可避免地使用 Python 中的类和对象。在 Python 中,我们可以使用类来实现面向对象编程。 创建类 要创建一个类,您可以使用关键字 class,而后跟类的名称。下面是一个简单的类的示例。 class MyClass: x = 5 在这段代码中,我们定义了一个名为 MyClass 的类,它具有一个属性 x,其值为 5。 创建…

    python 2023年5月19日
    00
  • python 画函数曲线示例

    下面是“Python 画函数曲线示例”的完整攻略: 1. 准备工作 在画函数曲线之前,我们需要先安装好matplotlib这个画图库,并引入它: import matplotlib.pyplot as plt 2. 画一条简单的曲线 2.1 编写绘图代码 我们先来画一条简单的函数曲线,比如y = x^2,可以按照以下步骤绘制: 准备x和y数组,定义x为从-1…

    python 2023年6月5日
    00
  • Python自动化测试框架pytest的详解安装与运行

    Python自动化测试框架pytest的详解安装与运行 简介 Python自动化测试框架pytest是基于 Python编程语言的一种自动化测试框架。它支持参数化测试、fixture、模块和测试运行的控制等功能。 安装pytest 在终端运行以下命令安装pytest pip install pytest 编写pytest测试用例 pytest使用assert…

    python 2023年5月13日
    00
  • Python学习之异常中的finally使用详解

    Python学习之异常中的finally使用详解 什么是异常处理? 在 Python 编程中,当遇到错误或异常时,我们通常会使用异常处理来处理这些错误或异常。 异常处理是指程序在运行时检测到错误或异常时,会采取相应的措施来处理异常,以保证程序的正常运行和稳定性。 Python 中提供了 try-except-finally 语句用于异常处理。 finally…

    python 2023年5月13日
    00
  • Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解

    Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解 什么是PyAutoGUI模块 PyAutoGUI是一款用于控制鼠标和键盘的Python模块。它可以在Windows、macOS和Linux上工作,实现的任务包括单击、双击、拖动、按键、松开按键等等。在自动化测试、GUI自动化、脚本测试等领域都有广泛的应用。 安装PyAutoGUI 可以在命…

    python 2023年5月19日
    00
  • Python中threading库实现线程锁与释放锁

    当多个线程需要同时访问同一个共享资源时,可能会导致数据不一致或者丢失。为了避免这个问题,就需要使用线程锁来互斥访问共享资源。Python中提供了threading库来实现多线程编程,其中线程锁的实现方式非常简单。 线程锁的基本使用方法 Python中,可以使用threading.Lock()方法来创建线程锁,然后使用acquire()方法来获得锁,使用rel…

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