librosa库 【NLP】音频特征工程(1)

导航特征提取 接口 频率谱Mel滤波器组Mel 频谱提取Log-Mel 特征MFCC系数 数据和代码下载参考资料
基础
提取音频的特征对音乐的分类,预测以及推荐十分关键,MFCC特征提取工程流程图如下
音频信号(audio )是一个在时间,幅度和频率上的三维信号,声波有三个重要的参数:频率 ω 0 \ ω0?,幅度 A n A_n An?和相位 ψ n \psi_n ψn?,从频域角度来看,音频信号就是不同频率,相位和波幅的信号叠加.
奈奎斯特采样定理说明:在进行模拟信号与数字信号的转换中,如果采样频率 f f f超过信号的最高频率 g g g的2倍时,采样后的数字信号可以完整保留原始信号中的信息,人类对声音的敏感区间在左右,所以如果采样频率达到2*4000=左右,原始信号的中的信息对于普通人而言是完美保留.
对于时长大小为k秒的音频文件,在频率采样下进行16bit采样,得到采样文件的大小为
k ? 8000 ? 16 ( b i t ) = k ? 8000 ? 2 ( b y t e ) = k ? 8000 ? 2 / ( 2 20 ) ( M B ) k*8000*16(bit)=k*8000*2(byte)=k*8000*2/(2^{20})(MB) k?8000?16(bit)=k?8000?2(byte)=k?8000?2/(220)(MB)
库安装
使用库处理音频文件,相比较Praat库,的开发文档写得比较详细,对函数都有相应的解释,对非信号处理领域的开发者更加友好.
pip install librosa numpy sklearn tensorflow keras
术语表 Term含义
sr
采样频率
帧移
连续帧之间的重叠部分
n_fft
窗口大小
频谱
频谱图/语谱图
振幅
mono
单声道
立体声
音频文件采样
读取音频接口如下
y, sr = librosa.load(path, sr, mono, offset, duration)参数:path 音频文件的路径sr 采样频率,默认值为22050mono bool类型,是否将信号转为单声道offset float,以秒为单位偏移开始读取音频的时间点duration float,以秒为单位设置加载音频的时间长度输出:y 音频时间序列sr 音频的采样频率
对音频文件以sr=8000进行采样,这里进行前3分钟采样
import librosaimport matplotlib.pyplot as pltfrom librosa import display as ddpath, filename='audio', 'aud_1'def load_file():info, sr = librosa.load('{}/{}.mp3'.format(path, filename), sr=8000, offset=0.0, duration=180)print(info.shape)print(sr)plt.figure(figsize=(10, 6))dd.waveplot(info, sr=sr)plt.show()
Fig-1:音频文件的时间-振幅图像
频域信息
音频的很多信息可以在频域上得到,使用傅里叶变换进行处理
短时傅里叶变换(STFT)
对于周期信号,可以使用傅里叶变换将时域信息转换到频率,关于STFT部分的讲解可以见视频The Short Time|
STFT的基本思想是将信号进行滑动窗口处理,在 中的信号进行傅里叶变换,得到信号的时变频谱()
调用.stft函数计算时变频谱
def stft_plot():X=librosa.stft(info)Xdb=librosa.amplitude_to_db(abs(X)) # 振幅转为分贝plt.plot(figsize=(10, 6))dd.specshow(Xdb, sr=sr, x_axis='time', y_axis='hz')plt.colorbar()plt.show()stft_plot()
Fig-2:STFT,横轴为时间,纵轴为频率,颜色表示分贝(声音的强度),越接近红色的部分音频的振幅(音量)越大
stft函数接口说明
M=librosa.stft(y, n_fft=2048, hop_length=None, win_length=None, window='hann', center=True, pad_mode='reflect')参数:y,音频时间序列n_fft,FFT窗口大小,n_fft=hop_length(帧移)+overlapping(重叠)hop_length,帧移,如果未指定默认值为win_length/4win_length,每一帧用window滑窗处理,窗口长度为win_length,使用0填充匹配n_fft,默认值win_length=n_fftwindow,string, tuple, 数字,函数shape=(n_fft, )窗口(string,tuple, 数字)窗函数,如scipy.signal.hanning长度为n_fft的向量或者数组center,bool类型,True表示填充信号y,使得帧D[:, t]以y[t*hop_length]为中心;False表示帧D[:, t]以y[t*hop_length]为起点dtype,D的复数值类型,默认为64bit的complex复数pad_mode,当center=True时,在信号边缘使用填充模式,默认情况使用reflection padding返回:STFT矩阵,shape=(1+nfft/2, t)