--- date: July 08, 2022 id: 2022-07-001 tags: Acoustic, Machine Learning --- # 聲音訊號的特徵擷取 ## 聲音訊號(audio signal) 聲音訊號一般指語音(speech)、音樂(music), 會依據特性進行頻率與強度的波動, 又可以分為規則與不規則兩類, 三個要素是音調、音強、音色, 工程分析上可視為頻率(frequenncy)、幅值(amplitude)、相位(phase)。 例如一段聲音的time domain大概是長這樣 ![pic](https://codertw.com/wp-content/uploads/img/8O3nz1dYdw.jpg) 從上圖可以看出, 聲音信號為一維度的時域信號, 直觀上很難看出上述特徵點的變化, 所以在ASC(acoustic scene classification)問題, 或者語音分析等應用, 都衍伸出許多特徵擷取方式, 這邊嘗試紀錄筆者接觸過的項目。 ## 常見的音頻特徵[^pyfeature] [^pyfeature]: [使用Python對音頻進行特徵提取](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/683650/) ### 過零率(zero crossing rate, ZCR) &emsp;&emsp;ZCR是指在每幀(frame)資料中, 信號通過零點(正變成負, 或負變成正)的次數, 此特徵<font color=#0080FF>在語音辨識和音訊信息檢索領域廣泛應用</font>, 是金屬聲音和搖滾樂的關鍵特徵 </br> ### 頻譜中心(spectral centroid) &emsp;&emsp;頻譜中心代表聲音的"質心", 又可稱為頻譜一階距, 其數值越小, 代表越多的頻譜能量集中在低頻範圍內 </br> ### 頻譜滾降點(Spectral Rolloff) &emsp;&emsp;其含意大概是:比該頻率低的頻率的所有能量大於一定比例的整個頻譜的能量,通常這個比例為0.85。 文獻資料顯示其計算方法為 ![spectral rolloff](https://codertw.com/wp-content/uploads/img/78GJ7KZ7XE.jpg) </br> ### <font color=#0080FF>**梅爾頻率倒譜系數(Mel Frequency Cepstral Coefficents, MFCCs)**</font> &emsp;&emsp;MFCCs、STFT、小波轉換(wavelet)都是時頻分析的工具, 只是相較之下MFCCs是對人類聽覺特別優化的一種工具, 其在1980年由Davis和Mermelstein合作提出後, 至今(2022)仍持續被應用在語音相關領域中。[^MFCCs] [^MFCCs]: [MFCC梅爾頻譜](https://blog.csdn.net/zouxy09/article/details/9156785/) 人類聽覺天生對不同頻率有不同的反應, 簡單以頻率變化敏感度來說, 低頻>高頻 但響度(聽覺上的大小聲)的敏感度卻反過來是高頻>低頻 具體的聽覺等響曲線可參見 ![人類聽覺等響曲線](https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Lindos1.svg/1024px-Lindos1.svg.png) 那麼為了得到適當大小的聲音特徵, 就可以透過通過梅爾標度濾波器組(mel-scale filter bank),變換為梅爾頻譜; 最後取倒譜分析(取對數,做DCT變換)就得到了梅爾倒頻譜。 (梅爾標度濾波器組的原理來自於梅爾標度) ![梅爾標度](https://miro.medium.com/max/1000/0*kksvemIVnub54E4i) 總結一下, 取得MFCC的分析流程可以大致分為 1. 先對語音進行預加重,分幀和加窗 2. 對每一個短時分析窗,通過FFT得到對應的頻譜 (至此類似於STFT分析) 3. 將上面的頻譜通過Mel濾波器組得到Mel頻譜 4. 在Mel頻譜上面進行倒譜分析(取對數,做逆變換,實際逆變換一般是通過DCT離散餘弦變換來實現,取DCT後的第2個到第13個係數作為MFCC係數) 至此可獲得MFCC參數, 其為一個小集合的特徵(一般10-20個),它能夠簡潔的表示頻譜的包絡。 而現在因為MFCC已經是很成熟的分析工具, 很多python package已經內建(ex: librosa), 只要透過如下方的程式碼, 就可以輕易取得 ```python= mfccs = librosa.feature.mfcc(x, sr=sr) # sr= 44100, n_mfcc default is 20 print(mfccs.shape) #Displaying the MFCCs: librosa.display.specshow(mfccs, sr=sr, x_axis='time') ``` 其中.mfcc 用來計算信號的MFCC參數, 通過打印mfccs.shape,可以看看每一幀裡面有多少維的MFCC特徵。第一個參數是mfcc參數的維度,第二個參數是幀數,這裡一共3107幀,每一幀有20維特徵。 ![mfcc](https://codertw.com/wp-content/uploads/img/kCv2c4X10F.jpg) </br>