使用FastAI 和即時頻率變換進行音頻分類

2020-12-06 雷鋒網

目前深度學習模型能處理許多不同類型的問題,對於一些教程或框架用圖像分類舉例是一種流行的做法,常常作為類似「hello, world」 那樣的引例。FastAI 是一個構建在 PyTorch 之上的高級庫,用這個庫進行圖像分類非常容易,其中有一個僅用四行代碼就可訓練精準模型的例子。隨著v1版的發布,該版本中帶有一個data_block的API,它允許用戶靈活地簡化數據加載過程。今年夏天我參加了Kaggle舉辦的Freesound General-Purpose Audio Tagging 競賽,後來我決定調整其中一些代碼,利用fastai的便利做音頻分類。本文將簡要介紹如何用Python處理音頻文件,然後給出創建頻譜圖像(spectrogram images)的一些背景知識,示範一下如何在事先不生成圖像的情況下使用預訓練圖像模型。

點擊原文查看文中涉及的代碼,以及相關的notebooks。

音頻文件轉圖像

起初把音頻文件作為圖像分類聽起來有些怪異。圖像是二維數據(其中包含RGBA等4個通道), 而音頻文件通常是一維的 (可能包含2個維度的通道,單聲道和立體聲)。本文只關注單聲道的音頻文件。我們知道,每個音頻文件會有一個採樣率,即音頻的每秒採樣數。如果文件是一個3秒長採樣率為44100Hz的聲音片段,這就意味著文件是由 3*44100 = 132300 表示氣壓變化的連續數字組成。 librosa是Python中處理音頻效果最好的庫。

clip, sample_rate = librosa.load(filename, sr=None)clip = clip[:132300] # first three seconds of file

雖然從上圖可以感受到各時點音頻的響亮或安靜程度,但圖中基本看不出當前所在的頻率。為獲得頻率,一種非常通用的方案是去獲取一小塊互相重疊的信號數據,然後運行Fast Fourier Transform (FFT) 將數據從時域轉換為頻域。經過FFT處理後,我們可以將結果轉換為極坐標,就得到不同頻率的幅度和相位。雖然相位信息在某些情況下適用,本文中主要適用幅度信息,我們將其轉換為分貝單位,因為耳朵是以對數尺度感知聲音的。

n_fft = 1024 # frame length

start = 45000 # start at a part of the sound thats not silence

x = clip[start:start+n_fft]

X = fft(x, n_fft)

X_magnitude, X_phase = librosa.magphase(X)

X_magnitude_db = librosa.amplitude_to_db(X_magnitude)

以1024為長度計算FFT,我們得到一個以1024為頻點的頻譜。譜的第二部分是多餘的,因而實際處理我們只用前(N/2)+1個頻點,在本例中也就是513。

我們用一個採樣窗口長度為1024的FFT計算獲取整個文件的頻譜信息,每次計算向前滑動512個樣本(hop length),這樣採樣窗口就會互相重疊。第二個文件將產生步長為259的頻譜,可以看作是一張二維圖像。我們把這些操作稱為短時傅立葉變化(STFT),它可以提供一段時間內頻率變化的信息。

stft = librosa.stft(clip, n_fft=n_fft, hop_length=hop_length)stft_magnitude, stft_phase = librosa.magphase(stft)

stft_magnitude_db = librosa.amplitude_to_db(stft_magnitude)

本例中我們可以看到那些有趣的頻率,所有低於12500 Hz的數據。另外可以看到有相當多的無用的頻點,這些信息並沒有準確反映人類是如何感知頻率的。事實上人類是以對數尺度的頻率結合聲音強弱來進行感知的。我們可以分辨對數尺度上相同『距離』的頻率,比如50Hz到100Hz,這感受如同400Hz到800Hz的變化。

這就是為什麼許多人會用 melspectrogram 表示頻譜的原因,該操作即將頻點轉換為梅爾刻度(mel scale)。用Librosa庫,可以方便的把常規的譜數據轉換為melspectrogram格式,我們需要定義有多少「點」 ,並給出需要劃分的最大最小頻率範圍。

mel_spec = librosa.feature.melspectrogram(clip, n_fft=n_fft, hop_length=hop_length, n_mels=n_mels, sr=sample_rate, power=1.0, fmin=fmin, fmax=fmax)mel_spec_db = librosa.amplitude_to_db(mel_spec, ref=np.max)

上面的melspectrogram我採用的頻點數為64(n_mels)。不同點在於,右側圖像裡只關注20Hz到8000Hz的頻率範圍。 這樣顯著減少了從最初513點每時點進行轉換的規模。

用fastai分類聲音頻譜

雖然我們可以分類原始聲音波形數據,但目前更流行用melspectrogram分類音頻,這種方法相當好用。那麼我們需要將整個數據集用上述方法轉換為頻譜圖。在GCP實例上用了所有CPU,我大約花了10分鐘處理完這些數據。以下是我生成melspectrogram用到的參數:

n_fft = 1024hop_length = 256

n_mels = 40

f_min = 20

f_max = 8000

sample_rate = 16000

本文從此處往下,我採用的都是NSynth數據集,該數據集由Google Magenta團隊提供。該數據集非常有趣,是由305979個音符組成,每段長4秒。我裁剪了這個數據集,只保留用聲學方法生成的音符,這樣管理起來相對簡單。分類目標是從10種樂器家族中分辨出音符是由哪個樂器家族產生的。

用fastai最新的data_block API,大大簡化了構建DataBunch對象的過程,數據集包括所有頻譜圖像機器對應的標籤——本例中用正則表達式通過解析文件名獲得所有分類標籤。

NSYNTH_IMAGES = 'data/nsynth_acoustic_images'instrument_family_pattern = r'(\w+)_\w+_\d+-\d+-\d+.png$'

data = (ImageItemList.from_folder(NSYNTH_IMAGES)

.split_by_folder()

.label_from_re(instrument_family_pattern)

.databunch())

數據一旦加載完成實例化預訓練卷積神經網絡 (CNN) ,這裡用的是 resnet18,然後在頻譜上做fine-tune。

learn = create_cnn(data, models.resnet18, metrics=accuracy)learn.fit_one_cycle(3)

2分14秒後,模型在驗證集(與訓練集完全分離的數據集)上準確度達到了84% 。當然數據一定有一些過擬合,這裡沒有做數據增強或類似正則化的優化,不過這是一個很不錯的開始!

利用fastai提供的ClassificationInterpretation類,可以快速查看錯誤是從哪來的,如下:

interp = ClassificationInterpretation.from_learner(learn)interp.plot_confusion_matrix(figsize=(10, 10), dpi=60)

看起來木槌跟吉他有點混了,另外簧片聲音月銅管樂器分不清。有了這些信息,我們可以更進一步查看這些樂器的頻譜數據,看看是否可以調整參數,從而更好的分辨它們。

為什麼在訓練過程中生成頻譜?

如果用圖像分類音頻效果這麼好,你也許會問在訓練過程中生成頻譜圖有什麼好處(相對於之前的方法)。可能有這麼幾個原因:

生成圖像的時間前例中,我們花了10分鐘產生所有圖像的頻譜圖。我經常會嘗試不同的參數設置,或把melspectrogram換成簡單的STFT,這樣就需要重新生成所有圖片,這樣就很難快速測試不同的參數配置。磁碟空間同樣的每次生成數據集後,數據集就會佔用大量磁碟空間,大小依賴於數據集以及變換。本例中,生成的數據佔了1G空間。數據增強提升圖像分類器性能的一個最有效的策略是採用數據增強。常規圖像變換諸如(rotating, flipping, cropping等) 在譜分類算法中可能不怎麼用得上。但是我們可以處理基於時域的音頻文件,然後再轉換為頻譜,最後進行分類。GPU 與 CPU過去我一直用 librosa 進行轉換,主要用CPU。但我們可以用 PyTorch提供的stft方法,該方法可直接使用GPU處理,這樣就會快很多,並且可以進行批處理 (而不是一次處理一張圖)。 如何在訓練過程中生成頻譜?

前幾天我一直在試驗創建一個新的基於fastai的聲音處理模塊。後來參考great new fastai documentation,寫出一個簡單類用於加載原始音頻文件,然後用PyTorch提供的方法使用GPU以批處理方式生成頻譜。我也創建了一個 create_cnn 函數,裁剪預訓練模型用以預測單通道數據(頻譜) ,此前模型是使用3通道。讓我驚喜的是,代碼和圖像分類器運行的速度差不多,不需要額外創建實際的圖像。現在建立數據集的代碼如下:

tfms = get_frequency_batch_transforms(n_fft=n_fft,

n_hop=n_hop,

n_mels=n_mels,

sample_rate=sample_rate)

data = (AudioItemList

.from_folder(NSYNTH_AUDIO)

.split_by_folder()

.label_from_re(instrument_family_pattern)

.databunch(bs=batch_size, tfms=tfms))

fastai庫支持預覽批次中的數據:

data.show_batch(3)

在預訓練模型上進行fine tuning跟之前步驟一樣,這裡不同的是需要把卷積的第一層修改為只接收單通道數據 (感謝fastai論壇的David Gutman).

learn = create_cnn(data, models.resnet18, metrics=accuracy)

learn.fit_one_cycle(3)

這一次訓練多花了30秒,執行了3個epoch後在驗證集上的精度為80%! 之前在CPU上創建整個數據集大約需要10分鐘。這樣就可以進行快速試驗,可以微調頻譜的參數,同時也可以對譜計算進行各種增強。

未來的工作

現在的方法已經可以通過不落地的方法直接生成不同譜的表示,我對如何通過數據增強改進原始音頻文件非常感興趣。在librosa庫中有很多方法,從pitch shifting到time stretching,隨機選出音頻的一段,可以做很多實驗。

同時比較感興趣的地方是,如果預訓練模型是基於聲音圖像(而不是基於圖像的),能否達到更好的精度。

相關焦點

  • 基於小波變換與DSP的實時音頻視頻處理系統
    從遠端接收到壓縮數據後,經過tl16c550b送到dsp中,先在存儲器中緩存,然後根據mpeg-2協議進行解包,分解成獨立的音/視頻數據;然後依據adv611和ct8021的數據申請,將壓縮視頻數據發送給adv611解壓,將壓縮音頻數據發送給ct88021解壓。
  • 音頻信號及音頻分析
    音頻分析原理音頻分析的原理主要涉及數位訊號處理的基本理論、音頻分析的基本方法以及音頻參數測量和分析內容,其中數位訊號處理是音頻分析的理論基礎。1.音頻分析技術基礎傅立葉變換和信號的採樣是進行音頻分析時用到的最基本的技術。
  • librosa-madmom:音頻和音樂分析
    /test.wav')print('data:',data.shape,'\nsample_rate:\n',sample_rate)提取特徵Log-Mel SpectrogramLog-Mel Spectrogram特徵是目前在語音識別和環境聲音識別中很常用的一個特徵,由於CNN在處理圖像上展現了強大的能力,使得音頻信號的頻譜圖特徵的使用愈加廣泛,甚至比MFCC使用的更多。
  • 使用PyTorch實現鳥類音頻檢測卷積網絡模型
    頻譜圖是通過在一個小時間窗口中記錄頻率的存在和各自的強度,沿著x軸(用時間單位表示)堆疊,直到頻譜圖覆蓋音頻信號的總持續時間。在創建譜圖的過程中,時間窗本身會發生重疊,通常頻率強度(音量或響度)用顏色表示,或者用數字來表示高/低值。從上面所示的完全相同的波形中鍛造出的光譜圖。x軸、y軸和標繪顏色分別表示時間單位、頻率(赫茲)和頻率強度。
  • 變頻器如何實現頻率變換
    打開APP 變頻器如何實現頻率變換 電工之家 發表於 2020-02-12 19:14:20   變頻器在現代工控領域中是非常重要的一種設備,它可以單獨控制三相異步電機、也可以配合可編程控制器(PLC)、觸控螢幕(HMI)等設備配合使用然後通過集成控制方式來完成三相電機的精確控制。
  • 使用DBM設計的頻率變換電路及製作
    (使用此匹配用電阻,雖然會使信號衰減3dB,但是,可以減少不匹配的影響。)此時的變換損失為5.5dB,再加上阻抗匹配體的損失3dB,總共有8.5dB的損失。 ▲DBM用變壓器 變壓器可使用環形鐵芯(Toroidal Core)或使用電視UHF用的錳鎘鐵芯。在此使用圖10所示的Amidon公司的環形鐵芯FT37-#43,使用直徑0.26mm的漆包線做3重的4圈卷繞,以作出1:2的變壓器T1,T2。
  • 傅立葉變換、拉普拉斯變換、Z 變換的聯繫是什麼?為什麼要進行這些變換?
    (式1.0)如果看不明白沒關係,下面這張圖能讓你看個清楚,如何用正弦波組成一個近似的方波那麼,有什麼意義呢,要知道,如果可以將信號分解為正弦函數的累加和,不就等於知道了這個信號是由哪些頻率的正弦波構成了的麼,同時,我們還能知道對應頻率的波在信號中的能量和相位信息
  • 音頻分析原理
    二、音頻分析原理音頻分析的原理主要涉及數位訊號處理的基本理論、音頻分析的基本方法以及音頻參數測量和分析內容,其中數位訊號處理是音頻分析的理論基礎。1.音頻分析技術基礎傅立葉變換和信號的採樣是進行音頻分析時用到的最基本的技術。
  • 傅立葉變換、拉普拉斯變換、Z變換的聯繫是什麼?為什麼要進行這些變換?
    而傅立葉變換和拉普拉斯變換的本質都是對連續或有限個第一類間斷點函數的一種積分變換,那麼什麼是積分變換呢?什麼是積分變換? 積分變換通過對原函數對映射函數空間自變量在特定區間進行積分運算,將函數從其原始函數空間映射到另一個函數空間。
  • 使用STM32 的DSP庫進行FFT變換
    * 使用三角函數生成採樣點,供FFT計算* 進行FFT測試時,按下面順序調用函數即可:* dsp_asm_init();* dsp_asm_test();*/#include "stm32f10x.h"#include "dsp_asm.h"#include "stm32_dsp.h"#include "table_fft.h"
  • 音頻鑑黃是如何做到的?深度解析音頻檢測背後的技術
    視頻檢測所使用到的圖像技術就很難在這些應用場景發揮作用,所以音頻檢測需要有針對性的技術手段。 混合神經網絡—隱馬爾科夫模型是將混合高斯模型用深度神經網絡進行替代,但是保留了隱馬爾科夫的結構,對於輸入端的擴幀和深度神經網絡的非線性變換,識別率可以得到很大的提升。
  • 電子測試儀器的分類和使用
    電子測試儀器的分類和使用
  • 科學音頻處理(二):如何使用 Octave 對音頻文件進行基本數學信號處理
    在前一篇的指導教程中,我們看到了讀、寫以及重放音頻文件的簡單步驟,我們甚至看到如何從一個周期函數比如餘弦函數合成一個音頻文件。在這篇指導教程中,我們將會看到如何對信號進行疊加和倍乘(調整),並應用一些基本的數學函數看看它們對原始信號的影響。 信號疊加 兩個信號 S1(t)和 S2(t)相加形成一個新的信號 R(t),這個信號在任何瞬間的值等於構成它的兩個信號在那個時刻的值之和。
  • 使用tensorflow進行音樂類型的分類
    更好的選擇是依靠自動音樂類型分類。與我的兩位合作者張偉信(Wilson Cheung)和顧長樂(Joy Gu)一起,我們試圖比較不同的音樂樣本分類方法。特別是,我們評估了標準機器學習和深度學習方法的性能。我們發現特徵工程是至關重要的,而領域知識可以真正提高性能。在描述了所使用的數據源之後,我對我們使用的方法及其結果進行了簡要概述。
  • 通信電子電路中二極體的頻率變換功能
    通過分析其單向導電性與壓控電容特性,認為在通信電子電路中使用晶體二極體主要有三種典型的頻率變換功能,即在振幅檢波電路中的整流作用,在混頻電路中的開關作用以及在調頻電路中的變容作用。關鍵詞:晶體二極體;頻率變換;單向導電性;壓控電容特性 晶體二極體是通信電子電路中常用的非線性電子元器件。由於具有非線性特性,在其兩端加上交變信號後,輸出信號中會產生新的頻率成分,這就是二極體的頻率變換功能。
  • 為什麼要進行傅立葉變換?
    要理解傅立葉變換,確實需要一定的耐心,別一下子想著傅立葉變換是怎麼變換的,當然,也需要一定的高等數學基礎,最基本的是級數變換,其中傅立葉級數變換是傅立葉變換的基礎公式。傅立葉是一位法國數學家和物理學家的名字,英語原名是Jean Baptiste Joseph Fourier(1768-1830),Fourier對熱傳遞很感興趣,於1807年在法國科學學會上發表了一篇論文,運用正弦曲線來描述溫度分布,論文裡有個在當時具有爭議性的決斷:任何連續周期信號可以由一組適當的正弦曲線組合而成。
  • 傅立葉變換、拉氏變換、z變換的含義
    對於周期信號來說,因為確實可以提取出某些頻率的正弦波成分,所以其加權不為零——在幅度譜上,表現為無限大——但這些無限大顯然是有區別的,所以我們用衝激函數表示。已經說過,傅立葉變換是把各種形式的信號用正弦信號表示,因此非正弦信號進行傅立葉變換,會得到與原信號頻率不同的成分——都是原信號頻率的整數倍。這些高頻信號是用來修飾頻率與原信號相同的正弦信號,使之趨近於原信號的。
  • 基於手部動作感應和即時音頻合成的虛擬演奏系統
    基於手部動作感應和即時音頻合成的虛擬演奏系統 —— ——2008年英特爾杯大學生電子設計競賽嵌入式系統專題邀請賽作品簡介 作者:杜娟,劉中金,梁琦,賈挺祥 北京理工大學 時間:2008-11-10來源:電子產品世界收藏
  • 揚聲器音頻「失真」的基礎知識和測量與計算
    ,它經常被列在揚聲器,功放和其它音頻聲學設備的技術指標中。非諧波失真是那些頻率不是基頻倍數的失真,也就是 IMD (互調失真)的情況。諧波失真頻譜    THD 和 IMD。可以測量 THD 的設備很多且使用簡單。但這些設備的一個主要缺點就是頻率範圍很窄,當測量高頻信號時,諧波失真就會超出量程。要測得精確結果,您就需要更寬頻率範圍的測試系統或者測量 IMD。
  • 傅立葉變換,拉普拉斯變換和Z變換的意義
    我們原來對一個信號其實是從時間的角度去理解的,不知不覺中,其實是按照時間把信號進行分割,每一部分只是一個時間點對應一個信號值,一個信號是一組這樣的分量的疊加。  傅立葉變換用於信號的頻率域分析,一般我們把電信號描述成時間域的數學模型,而數位訊號處理對信號的頻率特性更感興趣,而通過傅立葉變換很容易得到信號的頻率域特性。