讀取音頻提取特徵Log-Mel SpectrogramMFCC繪製波形圖和梅爾頻譜圖prerequisitesinstall起始點檢測 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,'\nsample_rate:\n',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的數量,這裡設為128print('Mel頻率的維度(頻域):',melspec.shape[0],'\nMel頻率的時間幀長度(時域):',melspec.shape[1],'\nshow data:\n',melspec)# 轉化為對數: Log-Mel Spectrogram特徵是音頻信號的時頻表示特徵。logmelspec = librosa.power_to_db(melspec)print('Mel頻率的維度(頻域):',logmelspec.shape[0],'\nMel頻率的時間幀長度(時域):',logmelspec.shape[1],'\nshow data:\n',logmelspec)MFCC
MFCC特徵是一種在自動語音識別和說話人識別中廣泛使用的特徵# MFCC特徵是一種在自動語音識別和說話人識別中廣泛使用的特徵mfccs = librosa.feature.mfcc(y=data, sr=sample_rate, n_mfcc=40)print('mfccs\n',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 githubinstall
prerequisites
python=2.7+ 或python=3.5+
numpy>=1.13.4scipy>=0.16cython>=0.25mido>=1.2.6pytestpyaudiopyfftwinstall
pip install madmom音頻信號處理
讀取音頻數據import numpy as npimport matplotlib.pyplot as pltimport madmomsignal,sample_rate = madmom.audio.signal.load_wave_file('data/sample.wav')print('sample',signal,type(signal),'\n sample rate',sample_rate)# 讀取音頻數位訊號sig = madmom.audio.signal.Signal('data/sample.wav')print('sig',sig,'\n sample_rate',sig.sample_rate)# 將信號重採樣framedsignal = madmom.audio.signal.FramedSignal(sig,frame_size=2048,hop_size=441)print('fs',framedsignal,framedsignal.frame_size,'\n [0]',framedsignal[0],'\n [10]',framedsignal[10] ,'\n fps',framedsignal.fps,'\n 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,'\n [0]',fs[0],'\n [10]',fs[10] ,'\n fps',fs.fps,'\n 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個值,值的大小通常表示的是振幅。原始信號STFTDCT(離散傅立葉變換聲譜圖# STFTstft = 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 algorithmfrom scipy.ndimage.filters import maximum_filterspec = madmom.audio.spectrogram.Spectrogram('data/sample.wav')print('spec',spec,type(spec))# calculate the differencediff = np.diff(spec, axis=0)# keep only the positive differencespos_diff = np.maximum(0, diff)# sum everything to get the spectral fluxsf = 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()