音頻特徵提取方法和工具彙總

本文首發於:行者AI

絕大多數音頻特徵起源於語音識別任務,它們可以精簡原始的波形採樣信號,從而加速機器對音頻中語義含義的理解。從20世紀90年代末開始,這些音頻特徵也被應用於樂器識別等音樂信息檢索任務中,更多針對音頻音樂設計的特徵也應運而生。

1. 音頻特徵的類別

認識音頻特徵不同類別不在於對某一個特徵精準分類而是加深理解特徵的物理意義,一般對於音頻特徵我們可以從以下維度區分:

(1)特徵是由模型從信號中直接提取還是基於模型的輸出得到的統計,如均值、方差等;

(2)特徵表示的是瞬態還是全局上的值,瞬態一般以幀爲單位而全局則覆蓋更長的時間維度;

(3)特徵的抽象程度,底層特徵抽象程度最低也是最易從原始音頻信號中提取,它可以進一步被處理爲高一級的中間特徵代表樂譜中常見的音樂元素,如音高、音符的起始時間等;高層特徵最爲抽象大多用於音樂的曲風和情緒任務;

(4)根據特徵提取過程的差異可以分爲:從原始信號中直接提取的特徵(如過零率)、將信號轉換爲頻率得到的特徵(如譜心質)、需經過特定的模型得到的特徵(如旋律)、受人耳聽覺認知啓發改變量化特徵尺度得到的特徵(如MFCCs)。

我們以“特徵提取過程的差異”爲主要分類基準,列出各類下比較常見的特徵:

音頻特徵提取方法和工具彙總

同時我們也發現部分特徵並非完全屬於其中一個類別例如MFCC,因爲提取MFCC會將信號從時域轉換至頻域然後根據模仿人類聽覺響應的MEL尺度過濾器得到的,因此它屬於既屬於頻域特徵又屬於感知特徵。

2. 常用提取工具

下面羅列出一些常用提取音頻特徵的工具和使用平臺。

名稱 地址 適配語言
Aubio https://aubio.org c/python
Essentia https://essentia.upf.edu c++/python
Librosa https://librosa.org python
Madmom http://madmom.readthedocs.org python
pyAudioAnalysis https://github.com/tyiannak/pyAudioAnalysis python
Vamp-plugins https://www.vamp-plugins.org c++/python
Yaafe http://yaafe.sourceforge.net python/matlab

3. 音頻信號處理

音頻數字信號是一系列數字代表時域中連續變化的樣本,也就是常常說的“波形圖”。要對數字信號進行分析操作需對信號進行採樣和量化。

採樣是指連續時間的離散化的過程,其中均勻採樣是指每隔相等時間間隔採樣一次,每秒需要採集的聲音樣本個數叫做採樣頻率,音頻文件中常常見到的44.1kHz、11kHz就是指的採樣(頻)率。

量化將連續波形轉變爲離散化的數字,先將整個幅度劃分爲有限個量化階距的集合,幅度的劃分可以是等間距或不等間距的把落入某個階距內的樣本值賦予相同的量化值。音頻文件中的位深代表的就是量化值,16bit位深代表的就是將幅值量化爲2^16。

奈奎斯特定律指出如果採樣頻率大於等於信號中最高頻率分量的2倍,一個信號可以從他的採樣值精確地重構,實際上採樣頻率明顯大於奈奎斯特頻率。

4. 常用變換

4.1 短時傅里葉變換

短時傅里葉變換(Short Time Fourier Transform, STFT)適用於分析緩慢時變信號的頻譜分析,在音頻和圖像分析處理中已經得到廣泛應用。其方法是先將信號分幀,再將各幀進行傅里葉變換。每一幀語音信號可以被認爲是從各個不同的平穩信號波形中截取出來的,各幀語音的短時頻譜就是各個平穩信號波形頻譜的近似。

由於語音信號是短時平穩的,因此可以對信號進行分幀處理,計算某一幀的傅里葉變換,這樣得到的就是短時傅里葉變換。

傅里葉變換(FFT)可以將信號從時域轉變爲頻域,而逆傅里葉變換(IFFT)則可以將頻域轉換爲時域信號;傅里葉變換將信號從時域轉變爲頻域是音頻信號處理最常用的方式。STFT得到的頻譜圖在音頻信號中又叫做聲譜圖或語譜圖。

音頻特徵提取方法和工具彙總

4.2 離散餘弦變換

離散餘弦變換(DCT for Discrete Cosine Transform)是與傅里葉變換相關的一種變換,它類似於離散傅里葉變換(DFT for Discrete Fourier Transform),但是隻使用實數。離散餘弦變換相當於一個長度大概是它兩倍的離散傅里葉變換,這個離散傅里葉變換是對一個實偶函數進行的(因爲一個實偶函數的傅里葉變換仍然是一個實偶函數),在有些變形裏面需要將輸入或者輸出的位置移動半個單位。

4.3 離散小波變換

離散小波變換(Discrete Wavelet Transform)在數值分析和時頻分析中很有用,離散小波變換是對基本小波的尺度和平移進行離散化。

4.4 梅爾頻譜和梅爾倒譜

聲譜圖往往是很大的一張圖,爲了得到合適大小的聲音特徵,往往把它通過梅爾標度濾波器組(mel-scale filter banks),變換爲梅爾頻譜。

人耳的音高感覺大致與聲音的基頻對數呈線性關係。在梅爾標度下,如果兩段語音的梅爾頻率相差兩倍,則人耳可以感知到的音調大概也相差兩倍。 當頻率較小時,mel隨Hz變化較快;當頻率很大時,mel的上升很緩慢,曲線的斜率很小。這說明了人耳對低頻音調的感知較靈敏,在高頻時人耳是很遲鈍的,梅爾標度濾波器組啓發於此。

梅爾標度濾波器由多個三角濾波器組成濾波器組,低頻處濾波器密集,門限值大,高頻處濾波器稀疏,門限值低。恰好對應了頻率越高人耳越遲鈍這一客觀規律。上圖所示的濾波器形式叫做等面積梅爾濾波器(Mel-filter bank with same bank area),在人聲領域(語音識別,說話人辨認)等領域應用廣泛,但是如果用到非人聲領域,就會丟掉很多高頻信息。這時我們更喜歡的或許是等高梅爾濾波器(Mel-filter bank with same bank height)。

等面積過濾器
等高過濾器

librosa中MEL頻譜實現:

  import numpy as np

  def melspectrogram(y=None, sr=22050, S=None, n_fft=2048, hop_length=512,
                     power=2.0, **kwargs):
      S, n_fft = _spectrogram(y=y, S=S, n_fft=n_fft, hop_length=hop_length, power=power)

      # Build a Mel filter
      mel_basis = filters.mel(sr, n_fft, **kwargs)

      return np.dot(mel_basis, S)

而梅爾倒譜在梅爾頻譜上做倒譜分析(取對數,做DCT變換)就得到了梅爾倒譜。

  # -- Mel spectrogram and MFCCs -- #
  def mfcc(y=None, sr=22050, S=None, n_mfcc=20, **kwargs):
      if S is None:
          S = power_to_db(melspectrogram(y=y, sr=sr, **kwargs))

      return scipy.fftpack.dct(S, axis=0, type=dct_type, norm=norm)[:n_mfcc]

4.5 恆Q變換

在音樂中,所有的音都是由若干八度的12平均律共同組成的,這十二平均律對應着鋼琴中一個八度上的十二個半音。這些半音臨近之間頻率比爲21/12。顯然,同一音級的兩個八度音,高八度音是低八度音頻率的兩倍。因此在音樂當中,聲音都是以指數分佈的,但我們的傅立葉變換得到的音頻譜都是線性分佈的,兩者的頻率點是不能一一對應的,這會指使某些音階頻率的估計值產生誤差。所以現代對音樂聲音的分析,一般都採用一種具有相同指數分佈規律的時頻變換算法:恆Q變換(Constant Q transform)。

CQT指中心頻率按指數規律分佈,濾波帶寬不同、但中心頻率與帶寬比爲常量Q的濾波器組。它與傅立葉變換不同的是,它頻譜的橫軸頻率不是線性的,而是基於log2爲底的,並且可以根據譜線頻率的不同該改變濾波窗長度,以獲得更好的性能。由於CQT與音階頻率的分佈相同,所以通過計算音樂信號的CQT譜,可以直接得到音樂信號在各音符頻率處的振幅值。

音頻特徵提取方法和工具彙總

參考資料

《A Tutorial on Deep Learning for Music Information Retrieval》

《STFT和聲譜圖,梅爾頻譜(Mel Bank Features)與梅爾倒譜(MFCCs)》

《基於音樂識別的頻譜轉換算法——CQT》

《librosa document》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章