- 音频处理
- 科研
【免费下载链接】librosa
Python library for audio and music analysis
本文围绕 librosa 官方文档中的 Display API 索引页 展开,系统讲解librosa.display模块的三大组成部分——数据可视化函数、展示工具函数与展示对象参考(坐标格式化器)。读完本文,你将掌握specshow、waveshow、multiplot等核心 API 的完整参数体系、坐标轴类型与色彩映射机制,并能结合 源码实现 理解其底层原理。
模块定位:matplotlib 之上的音乐学友好封装
librosa.display的模块文档(见 librosa/display.py 开头的 docstring)说明了它的定位:
Librosa display functionality is built on top of matplotlib. The display module provides a collection of convenience functions that make construction of common visualizations easier, and also provides a set of custom tick formatters for musical axes (time, frequency, pitch, etc.).
也就是说,该模块完全构建在 matplotlib 之上,提供两类能力:
- 便利可视化函数:把"画频谱图、画波形、画多通道对比"这类常见需求封装成一行调用,并自动处理时间/频率/音高坐标的物理换算;
- 自定义刻度格式化器(tick formatters):把帧索引、Hz 数值等"机器坐标"翻译成秒/分/时、音符名、梅拉(mel)、1/3 倍频程刻度等"音乐学坐标"。
官方文档将该 API 拆分为三节(见 docs/api/display.rst 中的 toctree):
| 文档小节 | 文件 | 内容 |
|---|---|---|
| Data visualization | display_viz.rst | specshow、waveshow、wavebars、wavef0、multiplot |
| Display utilities | display_helpers.rst | colorbar_db、colorbar_phase、highlight、infer_cmap、legend_for_axes |
| Display object reference | display_classes.rst | TimeFormatter、NoteFormatter、SvaraFormatter、FJSFormatter、LogHzFormatter、ChromaFormatter、ChromaSvaraFormatter、ChromaFJSFormatter、TonnetzFormatter、AdaptiveWaveplot、Transformf0 |
模块的公开符号清单见 display.py 的__all__,可将其分为"绘图函数"与"可复用对象"两组。
数据可视化函数(Data visualization)
specshow:频谱类可视化的核心入口
specshow是模块中使用频率最高的函数(定义于 librosa/display.py#L1340),用于显示频谱图、chromagram、CQT 结果、tempogram 等矩阵数据,返回一个matplotlib.collections.QuadMesh对象,可直接用于后续colorbar_db等调用。
其关键默认参数(来自函数签名):
sr=22050、hop_length=512:用于确定 x 轴时间刻度;n_fft默认按data形状推断为2*(d-1),若使用奇数帧长需显式指定;tempo_min=16、tempo_max=480:tempogram 显示时的 BPM 范围;tuning=0.0、bins_per_octave=12、key="C:maj":CQT/音符轴相关参数;top_db=80.0:分贝模式下相对峰值的裁剪阈值;- 色图默认值:
cmap_seq="magma"(顺序)、cmap_bool="gray_r"(布尔)、cmap_div="coolwarm"(发散)、cmap_cyclic="twilight_shifted"(相位); auto_aspect=True:当横纵两轴覆盖相同范围且类型匹配时自动设为等比例。
坐标轴类型体系。specshow的x_axis/y_axis参数是整个模块信息密度最高的部分,源码 display.py#L1279-L1327 中以元组常量定义了全部合法类型:
- 频率类:
linear/fft/hz(由 FFT 窗与采样率决定范围)、log(对数刻度)、oct3(1/3 倍频程科学计数法刻度,支持 SI 前缀如1 kHz、2 MHz,适合高频科学数据)、fft_note/fft_svara(音高标注)、mel/mel_oct3(梅拉刻度)、cqt_hz/cqt_note/cqt_svara/cqt_oct3(CQT 刻度)、vqt_hz/vqt_note/vqt_oct3/vqt_fjs(变 Q 变换刻度)。所有频率类轴以 Hz 为单位绘制; - 类别类:
chroma(按给定调性在 0–11 整数位置排列音级)、chroma_h/chroma_c(按印度 Hindustani/Carnatic 音乐 svara 标注)、chroma_fjs(纯律 Functional Just System 标注)、tonnetz(Tonnetz 维度 0–5)、frames(原始帧号); - 时间类:
time/h/m/s/ms,以及 lag 变体lag/lag_h/lag_m/lag_s/lag_ms(超过中点按负值计,适用于自相关类数据); - 节奏类:
tempo(BPM 对数刻度,配合librosa.feature.tempogram)、fourier_tempo(频域 tempogram,配合librosa.feature.fourier_tempogram)。
一个实现细节值得注意:源码用_AXIS_COMPAT集合(display.py#L1329-L1337)约束 x/y 轴类型必须"同族配对"(如频率轴只能配频率轴、时间轴只能配时间轴),非法组合会在调用时报错。
vscale:值域变换。specshow的vscale参数支持分贝与相位两种物理量(详见 display.py#L1486-L1514):
'dB':以 1 为参考幅度的分贝;'dB[<value>]':自定义参考幅度,如'dB[0.1]';'dB[power]'/'dB[power,<value>]':把data当作功率而非幅度处理;'dBFS':以np.max(data)为参考满刻度分贝;'dBFS[power]'同理;'phase':弧度相位,范围[-π, π];'dphase':解卷绕相位差(相对上一时刻的静止频率假设),'dphase_t'则沿垂直轴计算,用于时间轴竖直的转置频谱图。使用 dphase 模式时必须通过x_axis/y_axis或显式x_coords/y_coords提供坐标。
当vscale指定时,色图会自动选择:分贝用顺序色图、相位与相位差用循环色图(cmap_cyclic)。
一个典型用法(源自colorbar_db的官方示例):
import matplotlib.pyplot as plt import librosa y, sr = librosa.load('examples/trumpet.wav') S = librosa.stft(y) fig, ax = plt.subplots() im = librosa.display.specshow( np.abs(S), ax=ax, x_axis='time', y_axis='log', vscale='dB', ) librosa.display.colorbar_db(im) ax.set(title='Magnitude spectrogram (dB)') plt.show()specshow的**kwargs透传给plt.pcolormesh,默认设置rasterized=True、shading='auto'、edgecolors='none'以兼顾性能与 PDF 导出质量。
waveshow:自适应波形显示
waveshow(librosa/display.py#L2572)绘制时域波形,其设计亮点是自适应视图切换:
- 当当前视图跨越的时间长度小于
max_points / sr(默认max_points=11025,即 22.05 kHz 下约 0.5 秒)时,使用原始采样的plt.step视图; - 否则退化为降采样幅度包络视图(
plt.fill_between),包络由非重叠窗口的最大包络计算(内部函数__envelope用util.frame实现),保证绘制的视觉元素复杂度有上界; - 在 Jupyter 等交互式环境下,缩放视图时图形会自动更新。
常用参数:axis支持全部时间类刻度(time/h/m/s/ms及 lag 变体);offset指定起始偏移(秒);transpose=True可竖直显示;mask提供布尔掩码控制采样点显示;invert/invert_color用于反色风格。对于立体声输入(shape=(2, n)),上包络取左声道、下包络取右声道,放大到采样级时只显示第一声道,文档建议用multiplot分开展示。
wavebars 与 wavef0
wavebars(librosa/display.py#L2891)以柱状形式显示波形幅值,适合离散化的时域展示;wavef0(librosa/display.py#L3075)在波形之上叠加 f0 基频轮廓线,并处理基频轴与波形轴的比例关系(借助Transformf0变换类实现坐标联动)。
multiplot:多通道/多信号网格
multiplot(librosa/display.py#L3842)用于在子图网格上并排展示多个相关波形或频谱,典型场景是多通道音频的各通道波形/频谱对比。核心参数:
func:'waveshow'、'wavebars'或'specshow'之一,指定底层绘制函数;*data:提供单个数组时视为多通道数据(前导维度为通道),提供多个数组时每个数组独占一个子图;orient:'v'(垂直堆叠,默认)或'h'(水平并排);share_properties:None/False不共享;True全组共享;'row'/'col'按行/列分组共享;也可传入与网格同形的 ndarray 自定义分组标识;sharex、sharey(均默认True):新建图时共享坐标轴;label_outer=True只在最外侧显示刻度标签;labels/titles:逐子图标题;prop_cycle可自定义属性循环(线色/线宽等)。
返回值是一个与子图网格形状一致的显示对象数组,便于逐个调用highlight等后处理。
展示工具函数(Display utilities)
infer_cmap:色图自动推断
infer_cmap(librosa/display.py#L1190-L1261)按数据特征自动选择色图:
- 布尔数据 →
cmap_bool(默认'gray_r'); - 数据在阈值
div_thresh(默认 0.0)两侧同时存在 → 发散色图cmap_div(默认'coolwarm'),且色标会以中心值归一化; - 否则 → 顺序色图
cmap_seq(默认'magma')。
robust=True时按 2%–98% 分位数计算范围以抗离群值。注意:旧版 API 名librosa.display.cmap已弃用,源码中通过moved(...)装饰器做了重命名桥接(display.py#L1264-L1267),新代码应使用infer_cmap。若想把cmap=None传给specshow,会得到 matplotlib 的默认色图。
colorbar_db 与 colorbar_phase
两个色条工厂函数,分别服务于分贝与相位色标:
colorbar_db:im为specshow返回的 QuadMesh;format默认为"% -3.f"(整数刻度显示);kwargs默认补充label="dB",因此vscale='dBFS'时建议显式传label='dBFS';colorbar_phase:为相位类色标(循环色图)创建色条。
官方文档给出的双子图示例展示了标准用法(dB 幅度 + dphase 相位,分别挂两个色条,并用ax.label_outer()收敛标签)。
highlight:自适应对比度描边
highlight(librosa/display.py#L4155)解决"在暗色频谱图上画亮线(如 f0 轮廓)对比度不足"的问题:
- 自动检查
ax上的色彩映射数据,用 YIQ 色彩空间的亮度分量与luminance_threshold(默认 0.5)比较,判定底色偏暗则用bright_color(默认白)、偏亮则用dark_color(默认黑);若轴上找不到色彩映射数据,则回退到轴/图背景色; - 返回一组
matplotlib.patheffects.withStroke路径效果对象;提供artist时就地应用,不提供则可稍后通过artist.set_path_effects(effects)或plot(..., path_effects=hl)使用; **kwargs透传给withStroke,常用linewidth(默认 2)与alpha(默认 1.0);文档特别提示不要同时提供foreground,应通过color参数指定高亮色。
典型用法(源自其 docstring):
fig, ax = plt.subplots() librosa.display.specshow(D, x_axis='time', y_axis='log', ax=ax, vscale='dBFS') line, = ax.plot(times, f0) librosa.display.highlight(artist=line) # 自动选择白/黑描边legend_for_axes
legend_for_axes(librosa/display.py#L4026)用于为同一坐标轴上的多组 artist(如叠加在频谱上的多条 f0/beat 线)批量构建图例,支持自定义位置(上/下/左/右及轴内外),tests/test_display.py 中test_legend_for_axes_*系列用例覆盖了 1D/行列方向、上下位置等组合场景。
展示对象参考(Display object reference)
这部分是可长期复用的"坐标翻译器"与辅助对象,对应 docs/api/display_classes.rst 列出的全部类。
时间刻度:TimeFormatter
TimeFormatter继承matplotlib.ticker.Formatter,在秒(S.sss科学计数法)、分秒(M:SS)、时分秒(H:MM:SS)三种格式间自动切换。参数:
lag:为True时轴按 lag 坐标解释,超过中点的刻度转为负时间;unit:'h'/'m'/'s'/'ms'或None。为None时按数据范围自适应:≥3600 s 用'h',60–3600 s 用'm',1–60 s 用's',<1 s 用'ms'。
官方示例:
import matplotlib.pyplot as plt import numpy as np import librosa times = np.arange(30) values = np.random.randn(len(times)) fig, ax = plt.subplots() ax.plot(times, values) ax.xaxis.set_major_formatter(librosa.display.TimeFormatter()) ax.set(xlabel='Time') plt.show() # 手动指定毫秒 fig, ax = plt.subplots() ax.plot(np.arange(100), np.random.randn(100)) ax.xaxis.set_major_formatter(librosa.display.TimeFormatter(unit='ms')) ax.set(xlabel='Time (ms)') plt.show() # lag 图 fig, ax = plt.subplots() ax.plot(np.arange(60), np.random.randn(60)) ax.xaxis.set_major_formatter(librosa.display.TimeFormatter(lag=True)) ax.set(xlabel='Lag (s)') plt.show()音高与频率刻度
NoteFormatter:把频率/音高刻度渲染为音符名(含八度),与tuning、unicode(Unicode 变音符号 vs ASCII 回退)等参数联动;SvaraFormatter:印度音乐 svara 标注(对应cqt_svara、chroma_h/chroma_c轴);FJSFormatter:Functional Just System 纯律记谱(对应chroma_fjs/vqt_fjs轴,依赖librosa.core.interval_frequencies的音程表);LogHzFormatter:对数 Hz 轴的刻度格式化。
以上四类(除 TimeFormatter 外)共享一个内部基类AdaptiveFormatterBase,负责根据轴的物理范围自适应刻度密度。
类别刻度与辅助变换
ChromaFormatter、ChromaSvaraFormatter、ChromaFJSFormatter:分别为chroma、svara 染色与 FJS 染色轴生成音级标签,按key/thaat/mela重排 0–11 的位置与名称;TonnetzFormatter:Tonnetz 二维坐标轴的 0–5 维度标注。
AdaptiveWaveplot 与 Transformf0
AdaptiveWaveplot是waveshow的引擎类:内部维护"原始采样视图"与"包络视图"两套绘制元素,随视图范围在两者间切换。模块级字典_WAVESHOW_ADAPTORS用WeakKeyDictionary以 Axes 为键保活适配器,防止 Axes 仍存活时其渲染回调被垃圾回收;Transformf0继承matplotlib.transforms.Transform,把 f0 数值映射到波形显示的坐标空间,使wavef0能把基频轮廓与波形精确对齐,同时兼容视图缩放。
参数速查与最佳实践
| 场景 | 推荐调用要点 |
|---|---|
| STFT 幅度谱 | specshow(np.abs(S), x_axis='time', y_axis='log', vscale='dB')+colorbar_db |
| 满刻度分贝 | vscale='dBFS',色条label='dBFS' |
| 相位/相位差 | vscale='phase'或'dphase'+colorbar_phase;dphase 必须提供时间/频率轴 |
| CQT/VQT 谱 | y_axis='cqt_note'/'vqt_note',并传fmin、tuning、bins_per_octave |
| Chromagram | y_axis='chroma'+key;印度音乐用chroma_h/chroma_c+thaat/mela |
| Tempogram | y_axis='tempo'或'fourier_tempo'+tempo_min/tempo_max |
| 波形 | waveshow(自适应包络);采样级细节用multiplot('waveshow', ...)分通道 |
| 叠加分析曲线 | ax.plot后highlight(artist=line)自动保证对比度 |
| 多通道对比 | multiplot('waveshow'/'specshow', Y, sharex=True) |
两条源自文档的重要约定:其一,specshow要求"生成数据的参数即显示参数"——sr、hop_length、n_fft、fmin等若与生成特征时的取值不一致,坐标刻度会整体错位;其二,auto_aspect=True会在横纵范围与类型匹配时强制等比例,做长条布局时可显式置False。
测试与实现验证
display 模块的回归测试集中在 tests/test_display.py,基线图像存于 tests/baseline_images/test_display/,覆盖:坐标轴类型组合(test_time_unit、test_time_unit_lag)、CQT/FFT 音符轴(test_cqt_note、test_fft_note)、1/3 倍频程刻度(test_oct3)、chroma/svara/Tonnetz 轴、unicode 开/关(test_specshow_unicode_true/_false)、发散色标归一化(test_colorbar_db、test_specshow_vscale_phase)、multiplot的多通道布局与共享轴(test_multiplot_*)、waveshow缩放前后(test_waveshow_mono_zoom/_zoom_out)、wavef0转置显示(test_wavef0_transpose)等场景。这些基线测试可作为"参数改动了什么"的可视化验证手段:修改任一轴参数后,对应测试即可暴露坐标映射差异。
小结
librosa.display通过三个层次把 matplotlib 变成音乐分析工具:specshow/waveshow/multiplot等函数封装"画什么",colorbar_*/highlight/infer_cmap等工具函数封装"怎么好看且物理正确",而各类 Formatter 与Transformf0封装"坐标如何说人话"。文档入口为 docs/api/display.rst,实现全部集中在 librosa/display.py 单文件中,阅读 docstring 与上述行号定位的源码即可完整掌握该模块。
- 音频处理
- 科研
【免费下载链接】librosa
Python library for audio and music analysis
相关推荐
深入理解Rick Roll Lang解释器:歌词如何被翻译成机器可执行代码
深入理解Rick Roll Lang解释器:歌词如何被翻译成机器可执行代码 Rick Roll Lang是一种以Rick Astley歌词为基础的面向过程动态编
突破听觉边界:YesPlayMusic音频可视化全解析——基于WebGL的音乐特效编程指南
突破听觉边界:YesPlayMusic音频可视化全解析——基于WebGL的音乐特效编程指南 引言:当音乐遇见像素——音频可视化的技术魅力 你是否曾好奇那些随音乐
音视频前端daedalOS中的音频可视化:基于Web Audio API的频谱分析
daedalOS中的音频可视化:基于Web Audio API的频谱分析 在现代浏览器环境中,音频可视化不仅能提升用户体验,更是音乐类应用不可或缺的功能模块。d
前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考