结合上次对音频数据转化的基本了解,本次补充说明特征提取的原理以及在CNN中的实际运用。
#一些需要使用的库
import numpy as np
import sklearn
import librosa
import librosa.display
import matplotlib.pyplot as plt#此库是专门用于绘制python的2D图像的matplotlib
1.一些基本特征
过零率 :一个信号符号变化的比率,大意是在每帧中语音信号从正变为负或从负变为正的次数。
#调用
x, sr = librosa.load('./train_sample/aloe/24EJ22XBZ5.wav')
#绘制声波信号
plt.figure(figsize=(14, 5))
librosa.display.waveplot(x, sr=sr)
# 放大
n0 = 9000
n1 = 9100
plt.figure(figsize=(14, 5))
plt.plot(x[n0:n1])
plt.grid()
# 计算过零率
zero_crossings = librosa.zero_crossings(x[n0:n1], pad=False)
print(sum(zero_crossings))
频谱质心:是频率成分的重心,是在一定频率范围内通过能量加权平均的频率。
spectral_centroids = librosa.feature.spectral_centroid(x, sr=sr)[0]
print(spectral_centroids.shape)
# (2647,)
# 计算时间变量
frames = range(len(spectral_centroids))
t = librosa.frames_to_time(frames)
# 归一化频谱质心
def normalize(x, axis=0):
return sklearn.preprocessing.minmax_scale(x, axis=axis)
#沿波形绘制频谱质心
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_centroids), color='r')
声谱衰减 :是对声音信号形状(波形图)的一种衡量,表示低于总频谱能量的指定百分比的频率。
spectral_rolloff = librosa.feature.spectral_rolloff(x+0.01, sr=sr)[0]
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_rolloff), color='b')
色度频率:是音乐音频有趣且强大的表示,其中整个频谱被投影到12个区间,代表音乐八度音的12个不同的半音(或色度)
2.特征提取法MFCC
如图:
简要说明一下对MFCC的个人见解:分帧取得不同周期的信号功率谱(短时傅里叶分析),随后变换处理功率谱并得到重要的特征系数(梅尔频谱)。
短时傅里叶变换,即把一段长信号分帧、加窗,再对每一帧做快速傅里叶变换(FFT),最后把每一帧的结果沿另一个维度堆叠起来,得到类似于一幅图的二维信号形式,也就是我们task2中得到的声谱图。
在讲梅尔频谱之前先说说梅尔尺度。
梅尔尺度是建立从人类的听觉感知的频率——Pitch到声音实际频率直接的映射。人耳能听到的频率范围是20-20000Hz,但人耳对Hz这种标度单位并不是线性感知关系,例如,若把音调频率从1000Hz提高到2000Hz,我们的耳朵只能觉察到频率似乎提高了一些而不是一倍。但是通过把频率转换成美尔尺度,我们的特征就能够更好的匹配人类的听觉感知效果。
所以人们用梅尔滤波器来模拟人耳对声音的感知,并得到梅尔频谱。
声谱图往往是很大的一张图,且依旧包含了大量无用的信息,所以我们需要通过梅尔标度滤波器组(mel-scale filter banks)将其变为梅尔频谱,再经由倒谱分析(取对数log,做离散余弦变换(DCT)变换)得到梅尔倒谱,再对其上的倒谱系数进行初步选择即可得到该音频的MFCC特征。
在之后的优化中可以从其他特征的角度来进行优化。
本文大部分观点来自:
fork from Task3 食物声音识别-音频数据特征提取