读取音频
提取特征Log-Mel Spectrogram
MFCC
绘制波形图和梅尔频谱图
prerequisites
install
起始点检测 onset detection tutorial
librosa
Librosa是一个用于音频、音乐分析、处理的python工具包,一些常见的时频处理、特征提取、绘制声音图形等功能应有尽有,功能十分强大
安装
pip install librosa
分析步骤
-专业名词:- sr:采样率、hop_length:帧移、overlapping:连续帧之间的重叠部分、n_fft:窗口大小、spectrum:频谱、spectrogram:频谱图或叫做语谱图、amplitude:振幅、mono:单声道、stereo:立体声
读取音频
# 加载音频
data,sample_rate = librosa.load('./test.wav')
print('data:',data.shape,'sample_rate:',sample_rate)
提取特征Log-Mel Spectrogram
- Log-Mel Spectrogram特征是目前在语音识别和环境声音识别中很常用的一个特征,由于CNN在处理图像上展现了强大的能力,使得音频信号的频谱图特征的使用愈加广泛,甚至比MFCC使用的更多。
# 特征提取:Log-Mel Spectrogram特征
melspec = librosa.feature.melspectrogram(data, sample_rate, n_fft=1024, hop_length=512, n_mels=128)
# n_fft指的是窗的大小,这里为1024;hop_length表示相邻窗之间的距离,这里为512,也就是相邻窗之间有50%的overlap;n_mels为mel bands的数量,这里设为128
print('Mel频率的维度(频域):',melspec.shape[0],'Mel频率的时间帧长度(时域):',melspec.shape[1],'show data:',melspec)
# 转化为对数: Log-Mel Spectrogram特征是音频信号的时频表示特征。
logmelspec = librosa.power_to_db(melspec)
print('Mel频率的维度(频域):',logmelspec.shape[0],'Mel频率的时间帧长度(时域):',logmelspec.shape[1],'show data:',logmelspec)
MFCC
- MFCC特征是一种在自动语音识别和说话人识别中广泛使用的特征
# MFCC特征是一种在自动语音识别和说话人识别中广泛使用的特征
mfccs = librosa.feature.mfcc(y=data, sr=sample_rate, n_mfcc=40)
print('mfccs',mfccs.shape,mfccs)
绘制波形图和梅尔频谱图
plt.figure()
plt.subplot(2, 1, 1)
# 绘制波形图
librosa.display.waveplot(data,sample_rate)
plt.title('beat waveform')
plt.subplot(2, 1, 2)
# 绘制频谱图
librosa.display.specshow(logmelspec, sr=sample_rate, x_axis='time', y_axis='mel')
plt.title('Mel spectrogram')
plt.tight_layout() #保证图不重叠
plt.show()
madmom是什么?
- madmom是专注于music信息抽取的一个python开发包。
- madmom github
install
prerequisites
python=2.7+ 或python=3.5+
- numpy>=1.13.4
- scipy>=0.16
- cython>=0.25
- mido>=1.2.6
- pytest
- pyaudio
- pyfftw
install
- pip install madmom
音频信号处理
- 读取音频数据
import numpy as np
import matplotlib.pyplot as plt
import madmom
signal,sample_rate = madmom.audio.signal.load_wave_file('data/sample.wav')
print('sample',signal,type(signal),' sample rate',sample_rate)
# 读取音频数字信号
sig = madmom.audio.signal.Signal('data/sample.wav')
print('sig',sig,' sample_rate',sig.sample_rate)
# 将信号重采样
framedsignal = madmom.audio.signal.FramedSignal(sig,frame_size=2048,hop_size=441)
print('fs',framedsignal,framedsignal.frame_size,' [0]',framedsignal[0],' [10]',framedsignal[10] ,
' fps',framedsignal.fps,' num_frames',framedsignal.num_frames,'hop_size',framedsignal.hop_size)
fs = madmom.audio.signal.FramedSignal(sig, frame_size=2048, fps=200)
print('fs',fs,fs.frame_size,' [0]',fs[0],' [10]',fs[10] ,
' fps',fs.fps,' num_frames',fs.num_frames,'fs.hop_size',fs.hop_size)
- 短时傅里叶变换STFT
- 声谱图:对原始信号进行分帧加窗后,可以得到很多帧,对每一帧做FFT(快速傅里叶变换),傅里叶变换的作用是把时域信号转为频域信号,把每一帧FFT后的频域信号(频谱图)在时间上堆叠起来就可以得到声谱图。
- DCT跟FFT的关系就是:FFT是实现DCT的一种快速算法。
- STFT短时傅里叶变换,实际上是对一系列加窗数据做FFT。
- 采样率Fs为16KHz,表示一秒钟内采样16000个点,这个时候如果音频长度是10秒,那么raw waveform中就有160000个值,值的大小通常表示的是振幅。
- 原始信号
- STFT
- DCT(离散傅里叶变换
- 声谱图
# STFT
stft = madmom.audio.stft.STFT(fs)
print('stft',stft,type(stft),stft[0])
# 频谱图
spec = madmom.audio.spectrogram.Spectrogram(stft)
plt.imshow(spec[:, :200].T, aspect='auto', origin='lower')
plt.show()
起始点检测 onset detection tutorial
- SuperFlux onset detection algorithm
from scipy.ndimage.filters import maximum_filter
spec = madmom.audio.spectrogram.Spectrogram('data/sample.wav')
print('spec',spec,type(spec))
# calculate the difference
diff = np.diff(spec, axis=0)
# keep only the positive differences
pos_diff = np.maximum(0, diff)
# sum everything to get the spectral flux
sf = np.sum(pos_diff, axis=1)
plt.figure()
plt.imshow(spec[:, :200].T, origin='lower', aspect='auto')
plt.show()
plt.figure()
plt.imshow(pos_diff[:, :200].T, origin='lower', aspect='auto')
plt.show()
plt.figure()
plt.plot(sf)
plt.show()