聲音之旅
今天開始,我們開啟一段聲音之旅,讓我們在深度學習領域從計算機視覺再到聲音,了解更多的知識.
0.聲音數據集
"工欲善其事必先利其器",我們做深度學習,首先需要收集足夠多的素材,這里我們采用ESC-50數據集,這個數據集是出自:![}(https://github.com/karolpiczak/ESC-50)
esc50.gif
該數據集由 5 秒長的記錄組成,這些記錄被組織成 50 個語義類(每個類 40 個示例),松散地排列成 5 個主要類別,
ESC-50 數據集是 2000 個環境錄音的標記集合,適用于環境聲音分類的基準測試方法。
5個大類,50個類型
對應的cvs文件有聲音的描述:
對應描述文件
簡略圖片
# 例如我們播放狗叫聲
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文件的四種信息的函數。期中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的數列,用來保存后面讀的每個frame的amplitude。
y = np.zeros(numframes)
# for循環,readframe(1)每次讀一個frame,取其前兩位,是左聲道的信息。右聲道就是后兩位啦。
# unpack是struct里的一個函數,用法詳見http://docs.python.org/library/struct.html。簡單說來就是把#packed的string轉換成原來的數據,無論是什么樣的數據都返回一個tuple。這里返回的是長度為一的一個
# tuple,所以我們取它的第零位。
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()
download.png