數據集和代碼均已上傳到Github中,歡迎大家下載使用。
Github地址:https://github.com/JasonZhang156/Sound-Recognition-Tutorial
如果這個教程對您有所幫助,請不吝貢獻您的小星星Q^Q.
數據增強
這篇博客主要在音頻信號處理領域兩個基礎的數據增強方法:Time Stretch 和 Pitch Shift。顧名思義,Time Stretch是在時間維度上的一個尺度變換,Pitch Shift是對音調的一個調整,而音調的高低取決於頻率,頻率越高音調越高,因此Pitch Shift可以看做是對頻率的一個尺度變換。Time Stretch 和 Pitch Shift可以通過librosa庫中的effects模塊來實現,來實現下面給出librosa庫的實現方法:
def demo_plot():
audio = './data/esc10/audio/Dog/1-30226-A.ogg'
y, sr = librosa.load(audio, sr=44100)
y_ps = librosa.effects.pitch_shift(y, sr, n_steps=3)
y_ts = librosa.effects.time_stretch(y, rate=1.2)
plt.subplot(311)
plt.plot(y)
plt.title('Original waveform')
plt.axis([0, 200000, -0.4, 0.4])
plt.subplot(312)
plt.plot(y_ps)
plt.title('Pitch Shift transformed waveform')
plt.axis([0, 200000, -0.4, 0.4])
plt.subplot(313)
plt.plot(y_ts)
plt.title('Time Stretch transformed waveform')
plt.axis([0, 200000, -0.4, 0.4])
plt.tight_layout()
plt.show()
demo_plot()
效果圖:
對上圖作如下說明:
1)第一張圖爲聲音的原始波形圖,第二張圖爲經過Pitch Shift轉換後的波形圖,第三張圖爲經過Time Stretch轉換後的波形圖;
2)從第二張圖可以看出,經過Time Stretch轉換後的波形圖明顯是要向左偏移了很多。實際上,當參數rate大於1時,Time Stretch執行的是一個在時間維度上壓縮的過程,所以視覺上看來是向左偏移了;
3)比較第一張圖和第三張圖,除了聲音波形幅度的變化(聲音幅度變化是幅度譜做線性插值引起的,這裏可以不用考慮,有興趣可以去看下librosa的源碼),我們看不出其他的區別。爲了體現Pitch Shift的效果,我們提高分辨率看一下和原始波形圖的差別,
def demo_plot():
audio = './data/esc10/audio/Dog/1-30226-A.ogg'
y, sr = librosa.load(audio, sr=44100)
y_ps = librosa.effects.pitch_shift(y, sr, n_steps=6) # n_steps控制音調變化尺度
plt.subplot(311)
plt.plot(y)
plt.title('Original waveform')
plt.axis([88000, 94000, -0.4, 0.4])
plt.subplot(312)
plt.plot(y_ps)
plt.title('Pitch Shift transformed waveform')
plt.axis([88000, 94000, -0.4, 0.4])
plt.tight_layout()
plt.show()
demo_plot()
從上圖可以看出,經過Pitch Shift轉換後的波形明顯比原始波形的頻率更高一些(n_steps>0),也就是音調變大了。