聲音這東西實在是太自然了,所以我們很少去思考這東西的本質到底是什麼
簡單的來複習一下聲音是什麼,你可以到維基百科上面看看,寫的是相當清楚 ; 而我是這樣子理解它的,聲音它就是來自於物體的波(振)動,它每秒鐘振動的次數就叫做「頻率」,我們把每秒鐘振動一次稱做1赫茲(1Hz)。
人類的耳朵,可以聽見 20Hz ~ 20000Hz 之間的聲音,所以我們處理資料當然也是這個範圍的。
人的聲音就是從我們的聲道發出來的,人的聲帶透過震動發出聲音之後再經過喉嚨舌頭牙齒等等 (合在一起叫做聲道),最後發出我們聽到的聲音,又因為每個人的聲道都不一樣,所以你是很難找到兩個人的聲音完全一模一樣的。
看一下聲帶長怎樣吧 ~~~
稍微了解一下之後,我們在 Python 上面稍微看一下之後要面對的資料吧!
import librosa
import numpy as np
import matplotlib.pyplot as plt
signal, sample_rate = librosa.load("test.wav")
上面使用了 librosa 來讀進音檔,實際上你還可以用 scipy.io 或是 soundfile 等其他不同的 library 讀,不同的 library 讀進來的格式不一樣,sample rate 也不一樣,在看別人訓練的 code 時候需留意一下。
如上圖,左邊是 librosa 讀進來的,右邊是 scipy.io 讀進來的,你可以看到 scipy 有些許的藍色,那是因為它是讀雙聲道的,而且值也不一樣,librosa 的有正規化過。
因為我們的聲音是類比訊號,像是大自然所聽到的聲音或看到的影像等等這類的都是,它是一個連續值,但電腦並不能夠真的去處理這樣子的訊號,電腦只看得懂 0 跟 1 所以我們必須把它轉成數位訊號,它是不連續的值,並且只用 0 跟 1 表示。
Sample Rate 的意思就是每秒鐘對這個聲音訊號的取樣幾次,標準 CD 音質的 Sample Rate 是 44.1Khz,意思就是在一秒鐘的聲音訊號被取樣了 44100 次。
前面我們提到,聲音它是來自於物體的波(振)動,如果它是一個波,那一定會有一些特徵可以被觀察到,像是三角波跟方波你一眼就可以說出他們的差異了,但看一看上面的圖,其實你很難去說明他們哪裡不一樣,那是因為在時域上我們看到的是信號如何隨著時間變化,但其實很多物理元件的特性是隨著訊號的頻率而改變,像電容在低頻時阻抗會變大,聲音也是一樣要在頻率下才比較能夠觀察到它的特徵。
想要畫出頻譜圖來觀察聲音,首先我們先看一下頻譜怎麼算的,基本上就只是單純的把信號做傅立葉變換再取 DB 而已
scipy 跟 matplotlib 也有提供 function 讓你使用
你可以看到左邊 scipy 取的是 10 * log10 (因為他沒幫你算 DB),但其實也有人會取 20 * log10,這個不一定,要看作者怎麼去使用。
如果只是使用一般的聲音頻率的話,並不能夠很完美的符合人的聽覺感受,因此在1980年由 S.B. Davis和 Paul Mermelstein 提出了一種叫做梅爾刻度的一種非線性刻度單位,用以表示人耳實際上對音高變化的感受
這是因為人類的聽覺是非線性的,
定義是將 1000Hz,且高於 40 分貝以上的聲音信號,定做 1000 mel。
而在頻率 500Hz 以上時,人耳每感覺到等量的音高變化,所需要的頻率變化隨頻率增加而愈來愈大,如下圖所示。
轉換公式如下:
不一定數字要如同上面的公式一樣,歷史上也有一些人提出不同的參數,像是把 700 改成 1000。
明日我們會專注在介紹更多 Feature,謝謝正在看這篇文章的你。