---
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)
  ZCR是指在每幀(frame)資料中, 信號通過零點(正變成負, 或負變成正)的次數, 此特徵<font color=#0080FF>在語音辨識和音訊信息檢索領域廣泛應用</font>, 是金屬聲音和搖滾樂的關鍵特徵
</br>
### 頻譜中心(spectral centroid)
  頻譜中心代表聲音的"質心", 又可稱為頻譜一階距, 其數值越小, 代表越多的頻譜能量集中在低頻範圍內
</br>
### 頻譜滾降點(Spectral Rolloff)
  其含意大概是:比該頻率低的頻率的所有能量大於一定比例的整個頻譜的能量,通常這個比例為0.85。
文獻資料顯示其計算方法為
![spectral rolloff](https://codertw.com/wp-content/uploads/img/78GJ7KZ7XE.jpg)
</br>
### <font color=#0080FF>**梅爾頻率倒譜系數(Mel Frequency Cepstral Coefficents, MFCCs)**</font>
  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>