跳转到内容

librosa — 把声音变成机器学习能吃的数字特征

待复核

librosa 是 Python 里最常用的音频 / 音乐分析库:你丢进一段 wav/mp3,它帮你读出来、切成小窗、抽出频率特征,再交给分类或检索模型。

日常类比:像医院的化验单流水线——血样(原始波形)本身不好直接下诊断;化验室先测血糖、胆固醇(特征),医生再看报告。librosa 就是那间化验室,不是医生(模型)。

它的核心不是「给你做 AI」,而是「把经典 DSP 流程收成可复现的 API」,让你少写一遍 STFT / 梅尔滤波自己造轮子。

常见入口:

  • librosa.load —— 读音频,统一采样率
  • librosa.stft —— 短时傅里叶变换(把声音切成「一小段一小段的频谱」)
  • librosa.feature.mfcc —— 梅尔频率倒谱系数(语音分类常用的紧凑特征)
  • librosa.feature.chroma_stft —— 色度特征(看音高落在哪个音级)
  • librosa.display.specshow —— 把谱图画出来,方便肉眼调参

不理解 librosa,下面这些事都说不清:

  • 为什么语音 / 音乐模型几乎从不直接吃原始 PCM 波形,而要先做特征工程
  • 为什么同一首歌换采样率后,模型准确率会莫名掉一截
  • 为什么 MIR(Music Information Retrieval)课程和论文 baseline 总先写 import librosa
  • 为什么「能画谱图」本身就是调参手段——你看得见 hop 太大时节拍糊成一片

librosa 的用法可以压成 三条

  1. 统一的时间轴语义:一切围绕采样率 sr、窗长 n_fft、步长 hop_length。类比:化验单上的「每 10 分钟采一次血」——采得太稀会漏峰,采得太密报告爆炸。

  2. 时域 → 时频域 → 紧凑特征stft 得到频谱热力图;再压成 MFCC / mel / chroma。类比:先拍全身 CT(STFT),再只保留几项关键指标(MFCC)。

  3. 和科学栈无缝对接:返回值是 NumPy 数组,直接 matplotlib 画图、直接喂 sklearn / PyTorch。类比:化验结果导出成 Excel,下游随便接。

实验里不确定 MFCC 参数时,先固定 hop_length,再扫 n_mfcc——路径更短、结果更好比。pipeline 里若同时有重采样和 tempo,应先重采样再节拍分割,反过来会放大误检。

import librosa
y, sr = librosa.load("voice.wav", sr=22050) # 统一到 22.05 kHz
mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
# mfcc.shape ≈ (13, T),T 随时长 / hop_length 变
print(mfcc.shape)

三步:读入并重采样 → 抽 13 维 MFCC → 把 (n_mfcc, time) 矩阵交给下游分类器。sr=22050 写死,避免不同文件采样率不一致。

案例 2:节拍跟踪(拍手 / 鼓点切片)

Section titled “案例 2:节拍跟踪(拍手 / 鼓点切片)”
import librosa
y, sr = librosa.load("drums.wav", sr=22050)
tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
beat_times = librosa.frames_to_time(beats, sr=sr)
print(float(tempo), beat_times[:5]) # BPM + 前几个节拍秒数

beat_track 返回估计 BPM 和节拍帧号;frames_to_time 换成秒,才能按时间切动作片段。短于约 2 秒的片段节拍估计会不稳。

import librosa
import numpy as np
def mel_vec(path):
y, sr = librosa.load(path, sr=22050, duration=30)
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
return np.mean(librosa.power_to_db(S), axis=1)
a, b = mel_vec("a.wav"), mel_vec("b.wav")
sim = np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
print(sim) # 越接近 1 越像

先截 30 秒、抽 mel、对时间维取均值,再算余弦相似度——比直接比原始 PCM 稳得多。

  1. 采样率没统一:A 文件 44.1 kHz、B 文件 16 kHz,不设 sr= 就抽 MFCC,特征时间轴尺度错位,分类器像在比两套尺子。
  2. 默认 n_fft / hop_length 不适合你的长度:默认 hop≈512(约 23 ms @22.05 kHz);子秒级音效会只得到极少帧,模型 shape 对不上。
  3. 解码依赖:mp3/m4a 常要系统装好 ffmpeg;缺解码器时 load 直接报错,不是 librosa 逻辑 bug。
  4. 短片段 STFT 边界假峰:不足一窗的音频两端会冒噪声峰,先 librosa.util.fix_length / pad 再变换。
  5. 特征维与模型输入不同步:改了 n_mfccn_mels 却忘改网络第一层,表现为「模型崩了」,其实是 shape 错了。

适用

  • 离线 MIR / 语音分类 / 声纹实验,片段数秒到数分钟
  • 教学:从波形 → 谱图 → MFCC 的可视化闭环
  • 论文 baseline:先用标准特征证明任务可做,再谈定制 DSP

不适用

  • 纯文本 NLP(根本没有音频)
  • 硬实时(<10 ms 端到端)流式音频——Python + 默认 STFT 延迟和抖动通常不够
  • 要手写卷积 / SIMD 级 DSP 内核时——应下到 C++/Rust 或 Essentia 等更底层栈
  • 2015:Brian McFee 等在 SciPy 发表 librosa: Audio and music signal analysis in python,把 MIR 常用流程收成统一 API
  • 此后:成为课程与 Kaggle 音频赛的默认依赖,和 NumPy/SciPy/matplotlib 绑在一起
  • 定位稳定:强项始终是「标准特征流水线」,不是端到端神经网络训练框架
  • 生态对照:Essentia 更偏完整 MIR 组件;madmom 更偏节拍与事件检测;需要深度学习前端时再接到 torchaudio 等库
  1. 音频任务先把表示做对(STFT / MFCC / 节拍),再堆复杂模型。
  2. 可视化谱图是调参工具,不是装饰——最小闭环是 load → stft → power_to_db → feature → 画图
  3. sr / hop_length / 特征维必须写进实验记录,否则不可复现。
  4. librosa 标准化的是经典流程,不是替代所有 DSP;标签定义与评估指标仍要自己写清。
  • librosa GitHub
  • librosa 官方文档
  • 论文:McFee et al., librosa: Audio and music signal analysis in python, SciPy 2015
  • essentia —— 更重的 MIR 组件库
  • madmom —— 节拍与音频事件检测
  • numpy —— 特征矩阵的底层容器与广播语义
  • audio-feature —— 常见音频特征总览
  • stft —— 短时傅里叶变换在做什么
  • melspectrogram —— mel 频谱为何适合语音 / 音乐
  • speech-recognition —— 语音识别流水线里特征处在哪一步
  • numpy —— librosa 返回值的底层容器
  • matplotlib —— specshow 背后的画图栈
  • aubio —— Aubio — 用音频信号提取节奏与音高
  • essentia —— Essentia — 音乐信息检索的 C++/Python 工具箱