iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
AI & Data

資料三十-那些最基本的資料處理與分析技能系列 第 17

【Day17-音訊】淺談聲音資料的基本分析方式——時間域與頻率域

如同我們在Day14的時候提到的最常出現的四種資料類型,而前兩天我們稍微談了一下文字資料的基本處理,那今天就接著來將一下聲音資料的處理吧

聲音資料

其實我覺得聲音資料是幾種資料類型裡面對人來說最有挖掘價值的,畢竟其他不論是影像還是文字,人類都有辦法很快的從中獲取到大概的資訊,但聲音是唯一一個必須要經過時間才能理解裡面資訊的內容。

聲音原始的樣子——隨著時間變化的波形

如果你有使用過一些錄音的軟體的話,那你會看過類似這條的東西吧

這其實就要回歸到我們是怎麼聽到不同的聲音的這件事情上,聲音的本質是空氣介質疏密波的震動,因為對耳膜產生不同的壓力進而聽到了聲音。所以上面這張圖其實就是隨著不同時間音量大小的波形圖。

使用聲音處理套件讀取與分析聲音——librosa

在處理分析聲音資料的時候根據需求會有許多不同的套件,這邊我推薦的是librosa,它包含了許多處理聲音很好用的工具

使用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)

輸出:

聲音的不同成分——使用STFT取出聲音頻譜

我們知道Do和Re聽起來是不同的,那它們又差在哪裡呢?其實就是聲音不同的頻率高低而已,那聲音的頻率其實可以透過傅立葉分析的方式來得到,這邊不會深入討論背後的數學原理,有興趣的朋友可以自己去找看看。

在我們把聲音從時間域轉換成頻率域的時候,我們圖形的縱軸就會變成了不同的頻率,因此這個頻譜圖的意義就表示這個聲音在不同時間時候的頻率分佈。

使用stft轉換成頻率域

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)


上一篇
【Day16-搜尋】茫茫文海當中找到那個對的詞——文字處理利器之正規表達式在python的應用
下一篇
【Day18-音調】我們怎麼聽出來不同音高的差別?——python中對於聲音頻率的處理
系列文
資料三十-那些最基本的資料處理與分析技能30

尚未有邦友留言

立即登入留言