聲音之旅
今天開始,我們開啟一段聲音之旅,讓我們在深度學(xué)習(xí)領(lǐng)域從計算機(jī)視覺再到聲音,了解更多的知識.
0.聲音數(shù)據(jù)集
"工欲善其事必先利其器",我們做深度學(xué)習(xí),首先需要收集足夠多的素材,這里我們采用ESC-50數(shù)據(jù)集,這個數(shù)據(jù)集是出自:![}(https://github.com/karolpiczak/ESC-50)
該數(shù)據(jù)集由 5 秒長的記錄組成钙勃,這些記錄被組織成 50 個語義類(每個類 40 個示例),松散地排列成 5 個主要類別,
ESC-50 數(shù)據(jù)集是 2000 個環(huán)境錄音的標(biāo)記集合聂喇,適用于環(huán)境聲音分類的基準(zhǔn)測試方法辖源。
對應(yīng)的cvs文件有聲音的描述:
對應(yīng)描述文件
# 例如我們播放狗叫聲
import IPython.display as display
display.Audio('../study/sound/ESC-50/audio/1-100032-A-0.wav')
# 聲音可視化代碼, 使用pywave模塊,讀取聲音文件,一組將聲音文件一波形顯示
import wave
import struct
import numpy as np
import matplotlib.pyplot as plt
# 讀取wav文件
filename = '../study/sound/ESC-50/audio/1-100032-A-0.wav'
wavefile = wave.open(filename, 'r') # open for writing
# 讀取wav文件的四種信息的函數(shù)。期中numframes表示一共讀取了幾個frames希太。
nchannels = wavefile.getnchannels()
sample_width = wavefile.getsampwidth()
framerate = wavefile.getframerate()
numframes = wavefile.getnframes()
print("channel", nchannels)
print("sample_width", sample_width)
print("framerate", framerate)
print("numframes", numframes)
# 建一個y的數(shù)列克饶,用來保存后面讀的每個frame的amplitude。
y = np.zeros(numframes)
# for循環(huán)誊辉,readframe(1)每次讀一個frame矾湃,取其前兩位,是左聲道的信息堕澄。右聲道就是后兩位啦邀跃。
# unpack是struct里的一個函數(shù)霉咨,用法詳見http://docs.python.org/library/struct.html。簡單說來就是把#packed的string轉(zhuǎn)換成原來的數(shù)據(jù)拍屑,無論是什么樣的數(shù)據(jù)都返回一個tuple途戒。這里返回的是長度為一的一個
# tuple,所以我們?nèi)∷牡诹阄弧?for i in range(numframes):
val = wavefile.readframes(1)
left = val[0:2]
# right = val[2:4]
v = struct.unpack('h', left)[0]
y[i] = v
# framerate就是聲音的采用率僵驰,文件初讀取的值喷斋。
Fs = framerate
time = np.arange(0, numframes) * (1.0 / framerate)
# 顯示時域圖(波形圖)
plt.subplot(211)
plt.plot(time, y)
# 顯示頻域圖(頻譜圖)
plt.subplot(212)
plt.specgram(y, NFFT=1024, Fs=Fs, noverlap=900)
plt.show()