介紹
音訊訊號處理在各種應用中都發揮著重要的作用,如語音識別、音樂資訊檢索、語音合成等。其中,Mel頻譜是一種常用的頻域特徵表示方法,用於描述人類聽覺系統對頻率的敏感程度。
在深度學習音訊領域,mel頻譜是最常用的音訊特徵。在本文中,我們將對四個常用的音訊處理庫——audioflux、torchaudio、librosa和essentia——進行效能測試,以評估它們在計算Mel頻譜時的效率。
Library | Language | Version | About |
---|---|---|---|
audioFlux | C/Python | 0.1.5 | A library for audio and music analysis, feature extraction |
torchaudio | Python | 0.11.0 | Data manipulation and transformation for audio signal processing, powered by PyTorch |
librosa | Python | 0.10.0 | C++ library for audio and music analysis, description and synthesis, including Python bindings |
essentia | C++/Python | 2.0.1 | Python library for audio and music analysis |
audioFlux:基於C開發和python包裝,底層針對不同平臺有不同的橋接處理,支援OpenBLAS,MKL等
TorchAudio: 基於pytorch開發,pytorch基於C++開發和python包裝,底層使用MKL,pytorch針對CPU是高度最佳化的(本篇評測不涉及到GPU版pytorch);
librosa: 純python開發,主要基於numpy和scipy,numpy底層使用OpenBLAS;
Essentia: 基於C++開發和python包裝,底層使用Eigen,FFTW;
針對音訊領域最常見的mel特徵,涉及到效能主要卡點有FFT計算,矩陣計算,多執行緒並行處理這三部分,其它次要卡點有演算法業務實現,python包裝等。
針對FFT計算,librosa使用scipy的fftpack實現FFT計算加速,比FFTW3,MKL,Accelerate要慢一些;
針對矩陣計算,MKL比OpenBLAS要快些,OpenBLAS比其Eigen快一些;
針對多執行緒並行處理,具體各個專案內部是否有支援。
測試指令碼
- 測試多個庫,使用以下方式:
$ python run_benchmark.py -p audioflux,torchaudio,librosa -r 1000 -er 10 -t 1,5,10,100,500,1000,2000,3000
- -p: The library name, list
- -r: The number of sample data, number
- -er: The number of
run_xxx.py
calls, number - -t: The time of each sample data, list
- 測試單個庫,使用以下方式:
$ python run_audioflux.py -r 1000 -t 1,5,10,100,500,1000,2000,3000
- 需要更多的命令功能,可以
python run_xxx.py --help
注意
在音訊領域,與音訊特徵提取相關的庫具有自己的功能特點,並提供不同型別的特徵。本次評估並不旨在詳細測試所有特徵提取的效能比較,但是由於梅爾頻譜是最重要和基礎的特徵之一,因此所有這些庫都支援它。
許多因素會影響效能評估結果,如 CPU 架構、作業系統、編譯系統、基本線性代數庫的選擇以及專案 API 的使用,這些因素都會對評估結果產生一定的影響。為了儘可能公平地反映實際業務需求,本次評估基於以下條件:
- macOS/Linux 作業系統,三種 CPU:Intel/AMD/M1。
- 庫使用最新的官方釋出版本或使用具有高效能支援的最新官方原始碼編譯,並選擇最快的版本。
- 在 API 使用方面,遵循官方標準,並對每個庫的相應方法進行“預熱”(不計算第一次執行時間),並不計算初始化的執行時間。
- 在資料長度方面,選擇測試資料時考慮各種實際業務需求。
當資料較短時,大多數庫的第一次執行時間可能相對較慢。為了反映實際業務需求並保持公平,不計算第一次執行時間。如果庫的 API 設計提供了初始化函式,則在實際業務場景中會建立並重復呼叫它們,初始化的執行時間也不計入評估結果。
警告
⚠️ 當使用 Conda、PyTorch、TensorFlow、XGBoost、LightGBM 等 Python 科學計算相關的庫時,幾乎所有這些庫都使用 Intel Math Kernel Library (MKL)。MKL 使用 OpenMP 進行並行加速,但是在同一程式中只能存在一個 OpenMP 例項。當這些庫一起使用時,最好將所有庫連結到 libomp 的相同位置,否則會出現錯誤。根據提示修改環境變數可能會導致程式執行變慢併產生不可靠的結果。相關工具可以用於重寫相關庫的 libomp 連結路徑。
效能
使用 audioFlux/torchaudio/librosa 庫, 針對 AMD/Intel/M1 CPUs and Linux/macOS 系統。
計算1000個樣本資料的mel頻譜,針對 1/5/10/100/500/1000/2000/3000每個樣本尺寸大小。 引數為 fft_len=2048, slide_len=512, sampling_rate=32000。
Linux - AMD
- OS: Ubuntu 20.04.4 LTS
- CPU: AMD Ryzen Threadripper 3970X 32-Core Processor
TimeStep | audioflux | torchaudio | librosa |
---|---|---|---|
1 | 0.04294s | 0.07707s | 2.41958s |
5 | 0.14878s | 1.05589s | 3.52610s |
10 | 0.18374s | 0.83975s | 3.46499s |
100 | 0.67030s | 0.61876s | 6.63217s |
500 | 0.94893s | 1.29189s | 16.45968s |
1000 | 1.43854s | 2.23126s | 27.78358s |
2000 | 3.08714s | 4.10869s | 45.12714s |
3000 | 4.90343s | 5.86299s | 51.62876s |
Linux - Intel
- OS: Ubuntu 20.04.4 LTS
- CPU: Intel(R) Core(TM) i7-6850K CPU @ 3.60GHz
TimeStep | audioflux | torchaudio | librosa |
---|---|---|---|
1 | 0.08106s | 0.11043s | 5.51295s |
5 | 0.11654s | 0.16005s | 5.77631s |
10 | 0.29173s | 0.15352s | 6.13656s |
100 | 1.18150s | 0.39958s | 10.61641s |
500 | 2.23883s | 1.58323s | 28.99823s |
1000 | 4.42723s | 3.98896s | 51.97518s |
2000 | 8.73121s | 8.28444s | 61.13923s |
3000 | 13.07378s | 12.14323s | 70.06395s |
macOS - Intel
- OS: 12.6.1 (21G217)
- CPU: 3.8GHz 8‑core 10th-generation Intel Core i7, Turbo Boost up to 5.0GHz
TimeStep | audioflux | torchaudio | librosa |
---|---|---|---|
1 | 0.07605s | 0.06451s | 1.70139s |
5 | 0.14946s | 0.08464s | 1.86964s |
10 | 0.16641s | 0.10762s | 2.00865s |
100 | 0.46902s | 0.83551s | 3.28890s |
500 | 1.08860s | 5.05824s | 8.98265s |
1000 | 2.64029s | 9.78269s | 18.24391s |
2000 | 5.40025s | 15.08991s | 33.68184s |
3000 | 7.92596s | 24.84823s | 47.35941s |
macOS - M1
- OS: 12.4 (21F79)
- CPU: Apple M1
TimeStep | audioflux | torchaudio | librosa |
---|---|---|---|
1 | 0.06110s | 0.06874s | 2.22518s |
5 | 0.23444s | 0.07922s | 2.55907s |
10 | 0.20691s | 0.11090s | 2.71813s |
100 | 0.68694s | 0.63625s | 4.74433s |
500 | 1.47420s | 3.37597s | 13.83887s |
1000 | 3.00926s | 6.76275s | 25.24646s |
2000 | 5.99781s | 12.69573s | 47.84029s |
3000 | 8.76306s | 19.03391s | 69.40428s |
詳細Benchmark和指令碼: https://github.com/libAudioFlux/audioFlux/tree/master/benchmark
總結
總的來說,從三個庫的效能比較結果來看,librosa 執行時間最長,這也符合常識。
在 linux/amd 處理器上,audioflux 比 torchaudio 稍快,但在 linux/intel 上稍慢。
在 macOS 系統上,對於大尺寸樣本資料,audioflux 比 torchaudio 快,intel 比 m1 明顯;對於小尺寸樣本資料,torchaudio 比 audioflux 更快。
⚠️儘管本次基準測試的開發旨在儘可能客觀和公正,但每個基準測試都有其缺點,並且限於特定的測試程式、資料集和平臺。此外,本次基準測試未比較庫可能支援的其他功能或其他 API、跨平臺等。我們鼓勵使用者使用自己的資料集和平臺進行基準測試。