跳转到内容

Essentia — 音乐信息检索的 C++/Python 工具箱

待复核

Essentia 是西班牙 Pompeu Fabra 大学 MTG(Music Technology Group)开源的音频分析与音乐信息检索(MIR)库:底层 C++,带 Python 绑定,AGPL-3.0。

日常类比:把一首歌交给一位「听音化验员」——它不替你写歌评,而是量出响度、节拍、调性、音色指纹这些可计算指标,方便检索、推荐、可视化。

librosa 比:librosa 是纯 Python 科研前台;Essentia 更像「工业级化验流水线」——算法多、可流式、可命令行批量抽特征,也有 TensorFlow 扩展包做高阶标签。

先记住三个入口词:

  • descriptor / 描述子:从音频算出的一组数字(BPM、调性、MFCC…)
  • extractor:官方预置的命令行/可执行流水线,输入 wav 输出 JSON
  • streaming graph:按音频块推进的算法图,适合长文件和近实时

不理解 Essentia,下面这些事不好解释:

  • 为什么 MIR 论文常写「用 Essentia 抽 descriptor」——它把频谱、节奏、调性、高阶语义特征收成统一算法图
  • 为什么大规模曲库标注不全靠深度学习——先用稳健 DSP 描述子做索引,再叠模型
  • 为什么 Sonic Visualiser 能挂 Vamp 插件看特征曲线——Essentia 提供了可视化桥
  • 为什么「pip 装完就能抽 BPM」和「嵌入移动端」可以是同一套算法——C++ 核 + 多平台绑定
  • 为什么工业原型常同时保留 JSON 特征与模型向量——可解释基线方便排查「模型坏了还是音频坏了」
  1. 算法是积木,不是黑盒一键。类比:厨房里每样厨具单独可用。你把 MonoLoaderWindowingSpectrumMFCC 串成 streaming / standard 两种模式的处理图。
  2. 描述子覆盖面广。从低层(能量、过零率、频谱质心)到中层(节拍、调性、和弦)再到高层(舞蹈性、情绪相关标签,常配合 essentia-tensorflow)。
  3. 同一套核,多入口。Python 原型、命令行 extractor、Vamp 插件、移动端——换入口不换算法语义。
  4. 稳健性优先于花哨。MTG 强调 descriptor 在噪声、编码、响度变化下尽量稳,适合曲库级批处理。
  5. 先解码,再分析。采样率、声道数、响度归一没对齐时,后面所有特征都会漂;生产管线常先 ffmpeg 统一成 44.1/48 kHz mono。
Terminal window
pip install essentia
import essentia.standard as es
audio = es.MonoLoader(filename="song.wav", sampleRate=44100)()
w = es.Windowing(type="hann")
spec = es.Spectrum()
mfcc = es.MFCC()
frame = audio[:2048]
melbands, mfcc_coeffs = mfcc(spec(w(frame)))
print(len(mfcc_coeffs)) # 一帧 MFCC 维数

逐步:MonoLoader 变单声道 → 切一窗 → 加窗 → 频谱 → MFCC。整首歌请按 hopSize 滑窗循环,或改用 streaming 图一次连好。

Terminal window
essentia_streaming_extractor_music song.wav song.json
# 看关键字段(字段名随版本略有差异)
python -c "import json; d=json.load(open('song.json')); print(d.get('rhythm',{}).get('bpm'), d.get('tonal',{}).get('key_key'))"

得到 JSON:节奏、调性、响度等汇总。适合「先批量抽特征,再离线训练」,不必先写 Python 图。

import essentia.standard as es
import librosa
path = "song.wav"
audio = es.MonoLoader(filename=path, sampleRate=44100)()
bpm_e, _, _, _, _ = es.RhythmExtractor2013()(audio)
y, sr = librosa.load(path, sr=44100, mono=True)
tempo_l, _ = librosa.beat.beat_track(y=y, sr=sr)
print("essentia", bpm_e, "librosa", float(tempo_l))

两边都锁 44100 mono。先对照 3–5 首歌:若系统偏差稳定,可做校准;若乱跳,先查解码/重采样是否一致,再查是否是变速曲把置信度打崩。

  1. 许可证是 AGPL:链进闭源 SaaS 要评估传染性;只当离线研究工具通常压力小,商用嵌入先问法务。
  2. 安装轮子平台有限pip install essentia 主要覆盖常见 Linux x86;macOS/ARM/Windows 可能要源码编或用官方 Docker mtgupf/essentia
  3. standard vs streaming 别混用对象:前者一次吃完整数组,后者按 buffer 推;把 streaming 算法当函数乱调用会报图连接错误。
  4. 版本间 descriptor 可能变:升级大版本后同一首歌 JSON 字段或数值会漂,曲库特征要锁版本并记录 extractor 名。
  5. 别把「有 BPM 字段」当成节拍完美:变速曲、散板、电子碎拍上置信度会掉;下游最好保留 confidence,而不是只存一个平均数。

适用

  • 曲库级批量特征抽取、MIR 基线实验、推荐/检索的前置索引
  • 需要 C++ 性能或嵌入式/移动端同一算法语义
  • 要命令行或 Vamp 可视化,而不只是 notebook
  • 需要把 DSP 描述子与 TensorFlow 标签放在同一工具链里对比

不适用

  • 只要 20 行 Python 画个 mel 谱做课设 → librosa 更轻
  • 只要 onset/pitch/tempo 三件套、要极简依赖 → aubio
  • 不能接受 AGPL 的闭源产品核心路径
  • 端到端只跑大模型、完全不需要可解释 DSP 特征
  • 2000 年代中后期:MTG 在 MIR 研究中积累大量描述子实现,需要统一工程化,避免每篇论文一套私有代码
  • 2013 前后:Essentia 开源,定位「可扩展、可工业」的音频分析库,而不是一次性脚本集合
  • 之后几年:补齐 Python 绑定、out-of-box extractor、Vamp 插件;研究组与内容平台原型大量引用
  • 深度学习浪潮后:并没有丢掉 DSP 描述子;反而用 essentia-tensorflow 把深度标签接到同一生态
  • 今天:文档站点 essentia.upf.edu + Docker 镜像仍是新人最快上手路径
  1. MIR 的第一步常常是可解释特征,而不是直接上大模型
  2. 同一算法多入口(CLI / Python / 插件)比「只有 notebook API」更接近生产
  3. 开源音频库要同时看能力、许可证与安装矩阵——三者缺一都会卡住落地
  4. 特征版本要当数据契约:锁版本与 extractor 名,否则索引与模型会悄悄错位
  5. 和 librosa/aubio 不是谁取代谁:按许可证、性能、特征覆盖选工具,常可并存
  • 官网文档:essentia.upf.edu
  • Python 教程入口:官网 “Essentia Python tutorial” / 仓库内 Jupyter notebook
  • GitHub:MTG/essentia
  • librosa —— Python MIR / 音频特征的常用对照
  • aubio —— 更轻的 onset / pitch / tempo 工具箱
  • ffmpeg —— 解码转码前置,常和特征抽取串在一起
  • sonic —— 实时音频相关对照阅读
  • librosa —— 纯 Python 科研向特征库,和 Essentia 常对照
  • aubio —— 专注节奏与音高的轻量分析库
  • ffmpeg —— 统一解码与重采样,喂给 Essentia 之前常用
  • coqui-tts —— 语音合成侧;特征与采样率对接时会碰到同类 DSP 概念
  • sonic —— 另一条实时音频处理线索
  • ffmpeg-kit —— 移动端 ffmpeg 封装;和 Essentia 移动场景常前后衔接
  • librosa —— librosa — 把声音变成机器学习能吃的数字特征