音频处理库性能对比:计算mel频谱的速度哪个更快?
介绍
音频信号处理在各种应用中都发挥着重要的作用,如语音识别、音乐信息检索、语音合成等。其中,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.pycalls, 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、跨平台等。我们鼓励用户使用自己的数据集和平台进行基准测试。
音频处理库性能对比:计算mel频谱的速度哪个更快?的更多相关文章
- Java常用Json库性能对比
Java对于处理JSON数据的序列化与反序列化目前常用的类库有Gson.FastJSON.Jackson.jettison以及json-lib.在这里我们将对这些类库在json序列化与反序列化方面的性 ...
- raid5 / raid5e / raid5ee的性能对比及其数据恢复原理
RAID 5 是一种存储性能.数据安全和存储成本兼顾的存储解决方案. RAID 5可以理解为是RAID 0和RAID 1的折中方案.RAID 5可以为系统提供数据安全保障,但保障程度要比Mirror低 ...
- 更轻更快的Vue.js 2.0与其他框架对比(转)
更轻更快的Vue.js 2.0 崭露头角的JavaScript框架Vue.js 2.0版本已经发布,在狂热的JavaScript世界里带来了让人耳目一新的变化. Vue创建者尤雨溪称,Vue 2.0 ...
- 前端性能优化(四)——网页加载更快的N种方式
网站前端的用户体验,决定了用户是否想要继续使用网站以及网站的其他功能,网站的用户体验佳,可留住更多的用户.除此之外,前端优化得好,还可以为企业节约成本.那么我们应该如何对我们前端的页面进行性能优化呢? ...
- C# String.Join 与 StringBuilder 对比,谁更快
String.Join 文档 StringBuilder 文档 这两天刷 Leedcode 做到一道 String 的题时突然想到这俩对比的问题,于是查了一下资料并简单对比了一下. 首先对于 ...
- C正则库做DNS域名验证时的性能对比
C正则库做DNS域名验证时的性能对比 本文对C的正则库regex和pcre在做域名验证的场景下做评测. 验证DNS域名的正则表达式为: "^[0-9a-zA-Z_-]+(\\.[0-9a ...
- java中常见的json解析方法、库以及性能对比
常见的json解析有原生的JSONObject和JSONArray方法,谷歌的GSON库,阿里的fastjson,还有jackson,json-lib. Gson(项目地址:https://githu ...
- FLV提取AAC音频单独播放并实现可视化的频谱
如上图,要实现对FLV直播流中音频的识别,并展示成一个音频相关的动态频谱. 一. 首先了解下什么是声音? 能量波,有频率有振幅,频率高低就是音调,振幅大小就是音量:采样率是对频率采样,采样精度是对幅度 ...
- Solr与MySQL查询性能对比
本文简单对比下Solr与MySQL的查询性能速度. 测试数据量:10407608 Num Docs: 10407608 这里对MySQL的查询时间都包含了从MySQL Server获取数据的时 ...
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析
最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...
随机推荐
- 利用fread读取二进制文件的bug
最近在做一个项目时需要读取二进制文件,我用C语言的fread进行读取,代码如下: FILE *fp; int read_data; fopen_s(&fp, file_path, " ...
- Shell脚本实现模拟并发及并发数控制
#!/bin/bash #by inmoonlight@163.com #下面的代码控制并发数.其实是利用令牌原理实现 #一个线程要运行,首先要拿到令牌在该代码中即read一行数据,读取不到就会暂停, ...
- 备份linux系统日志脚本
#!/bin/bash#script_name bkup_log.sh#7 0 * * 1 cd /home/tools/;./bkup_log.sh >& /dev/nullproce ...
- 生产环境实现Docker部署宝塔面板
生产环境中,为了避免极小概率的数据丢失,我们将容器内的宝塔文件映射到宿主机的目录中(您之后安装的 Nginx.MySQL 等服务均会挂载到宿主机目录).该方法是 Docker 部署宝塔面板的最优方案, ...
- 使用python来搭建一个简易的文件下载环境以及用droopy来实现一个文件上传环境
ubuntu在安装的时候一般都是自带python环境的,大家可以查看一下查看demo如下 用于共享的命令很简单python2: python -m SimpleHTTPServer 8888pytho ...
- GDB使用详解
来源:GDB使用详解 - 知乎 (zhihu.com) 1. 概述 GDB 全称"GNU symbolic debugger",从名称上不难看出,它诞生于 GNU 计划(同时诞 ...
- 微信小程序中如何设置跳转页面
修改project.config.json内容 "cloudfunctionRoot":"cloud", //配置云开发的路径 更改app.js文件内容 App ...
- 关于windows cmd 控制台输出中文
由于中文在window 输出总是优乱码可能性 ,先建cmd.reg 负责下面内容 ,双击运行即可. Windows Registry Editor Version 5.00 [HKEY_CURR ...
- 再次打开Spring界面,多处报错
分享一下经历 在我再次打开Srpring之后,打算解决一下"历史遗留问题",发现多处标红(挺崩溃的)! 就比如这句话,刚才就是不亮: 毕竟我上次的应用还是很顺利的,所以也就没有第一 ...
- 【手搓模型】亲手实现 Vision Transformer
前言 博客主页:睡晚不猿序程 首发时间:2023.3.17,首发于博客园 最近更新时间:2023.3.17 本文由 睡晚不猿序程 原创 作者是蒻蒟本蒟,如果文章里有任何错误或者表述不清,请 tt 我, ...