如同我們在Day14的時候提到的最常出現的四種資料類型,而前兩天我們稍微談了一下文字資料的基本處理,那今天就接著來將一下聲音資料的處理吧
其實我覺得聲音資料是幾種資料類型裡面對人來說最有挖掘價值的,畢竟其他不論是影像還是文字,人類都有辦法很快的從中獲取到大概的資訊,但聲音是唯一一個必須要經過時間才能理解裡面資訊的內容。
如果你有使用過一些錄音的軟體的話,那你會看過類似這條的東西吧
這其實就要回歸到我們是怎麼聽到不同的聲音的這件事情上,聲音的本質是空氣介質疏密波的震動,因為對耳膜產生不同的壓力進而聽到了聲音。所以上面這張圖其實就是隨著不同時間音量大小的波形圖。
在處理分析聲音資料的時候根據需求會有許多不同的套件,這邊我推薦的是librosa,它包含了許多處理聲音很好用的工具
在讀取聲音檔案的時候,除了聲音本身的sound
以外,還有一個sr
表示取樣頻率(sample rate),這個東西會影響到我們是如何解讀一系列的數據點是如何表示不同的聲音的?
import librosa
sound, sr = librosa.load("sample.wav") # 使用.load讀取檔案
print('Sampling rate={} Hz.'.format(sr))
輸出:
Sampling rate=22050 Hz.
import librosa.display
librosa.display.waveplot(sound,sr)
輸出:
我們知道Do和Re聽起來是不同的,那它們又差在哪裡呢?其實就是聲音不同的頻率高低而已,那聲音的頻率其實可以透過傅立葉分析的方式來得到,這邊不會深入討論背後的數學原理,有興趣的朋友可以自己去找看看。
在我們把聲音從時間域轉換成頻率域的時候,我們圖形的縱軸就會變成了不同的頻率,因此這個頻譜圖的意義就表示這個聲音在不同時間時候的頻率分佈。
from matplotlib import pyplot as plt
sound_stft = librosa.stft(sound) # stft轉換出來的是複數
sound_stft_db = librosa.amplitude_to_db(abs(sound_stft)) # 因此需要取絕對值來表示強度
plt.figure(figsize=(20, 5))
librosa.display.specshow(sound_stft_db, sr=sr, x_axis='time', y_axis='hz')
plt.colorbar()
輸出:
signal_new = librosa.istft(sound_stft)
librosa.display.waveplot(signal_new,sr)