利用python声音处理库librosa提取声音信号的mfcc特征及特征融合

利用python库librosa提取声音信号的mfcc特征及特征融合

  • 前言
  • librosa库介绍
  • librosa 中MFCC特征提取函数介绍
  • 解决特征融合问题
  • 总结

前言

写这篇博文的目的有两个,第一是希望新手朋友们能够通过这篇博文了解到 python 还有这么强大的一个声音处理库;第二则是本人在用该库时发现的一个小问题,就是库由于封装的太完备,在我们想做特征融合时候会出现一点小问题,在这我将指出并提供一种方案。具体的库使用指导还请参照Librosa 0.6

librosa库介绍

Liborsa是python的一个做音乐和声音分析的包,它提供了创建音乐信息检索系统所必要的构建块。这个库包含有丰富的声音信号处理工具,例如声音读取、采样率转换、stft、istft等等。

librosa 中MFCC特征提取函数介绍

# Mel-frequency cepstral coefficients (MFCCs)梅尔倒谱系数
librosa.feature.mfcc(y=None, sr=22050, S=None, n_mfcc=20, dct_type=2, norm='ortho', **kwargs)

参数介绍:
y:声音信号的时域序列
sr:采样频率(默认22050)
S:对数能量梅尔谱(默认为空)
n_mfcc:梅尔倒谱系数的数量(默认取20)
dct_type:离散余弦变换(DCT)的类型(默认为类型2)
norm:如果DCT的类型为是2或者3,参数设置为"ortho",使用正交归一化DCT基。归一化并不支持DCT类型为1
kwargs:如果处理时间序列输入,参照melspectrogram

返回:
M:MFCC序列
例子:

从一个时间序列中计算mfcc

>>> y, sr = librosa.load(librosa.util.example_audio_file(), offset=30, duration=5)
>>> librosa.feature.mfcc(y=y, sr=sr)
array([[ -5.229e+02,  -4.944e+02, ...,  -5.229e+02,  -5.229e+02],
       [  7.105e-15,   3.787e+01, ...,  -7.105e-15,  -7.105e-15],
       ...,
       [  1.066e-14,  -7.500e+00, ...,   1.421e-14,   1.421e-14],
       [  3.109e-14,  -5.058e+00, ...,   2.931e-14,   2.931e-14]])

利用预先计算好的对数能力梅尔谱计算MFCC

>>> S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128,fmax=8000)
>>> librosa.feature.mfcc(S=librosa.power_to_db(S))
array([[ -5.207e+02,  -4.898e+02, ...,  -5.207e+02,  -5.207e+02],
       [ -2.576e-14,   4.054e+01, ...,  -3.997e-14,  -3.997e-14],
       ...,
       [  7.105e-15,  -3.534e+00, ...,   0.000e+00,   0.000e+00],
       [  3.020e-14,  -2.613e+00, ...,   3.553e-14,   3.553e-14]])

解决特征融合问题

采用封装好的函数进行mfcc提取,我们得到的是一个经过分帧加窗及其一系列处理后的数据,要想在每一帧的mfcc后面添加其他特征首先要得到分帧的参数设置,然后对待融合特征采用相同的分帧机制,才能保证二者的融合是在相同帧的情况下进行的。例如我们要对mfcc特征与短时能量特征进行融合,我们在提取二者过程中要保证其分帧方式相同,然后对求得特征进行拼接。mfcc与能量的特征融合代码如下:

import librosa
import matplotlib.pyplot as plt
import numpy as np

path='E:\\Experiment\\soundbank\\cut\\trainall\\screams\\2\\4,00001_2__11.wav' # 声音文件绝对路径
y,sr=librosa.load(path,None) # 以原采样频率读取声音文件数据,并返回该数据及其采样频率
# 设置梅尔滤波器组参数,并设置分帧参数n_fft--帧长,hp_length--帧移
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=60,n_fft=1024, hop_length=512,fmax=16000) 
mfcc=librosa.feature.mfcc(y, sr, S=librosa.power_to_db(S),n_mfcc=40) # 提取mfcc系数
stft_coff=abs(librosa.stft(y,1024,512,1024)) #分帧然后求短时傅里叶变换,分帧参数与对数能量梅尔滤波器组参数设置要相同
energy = np.sum(np.square(stft_coff),0) #求每一帧的平均能量
MFCC_Energy = np.vstack((mfcc,energy)) # 将每一帧的MFCC与短时能量拼接在一起 

其他特征融合方式与上相同。

总结

python库虽然多,为了以后更好的发展还是建议学习时候从原理开始学起,后面我将会继续补充关于python编程过程中遇到的一些小问题,以及技巧,欢迎关注交流。

你可能感兴趣的:(Python)