专业监听和 IDE,听上去南辕北辙的两件事,今天走到了同一个路口。

本文介绍 EAR Audio Preview (下称EAR) 的功能与技术实现。它面向语音/音乐/音效等研发环境中的样本检查、算法对比和监听判断:打开音频文件后,可以在同一个编辑器里查看波形、时频结构、实时频谱、相位关系、响度、F0 与 onset,也可以完成片段导出和耳机频响校准。它不替代 DAW 混音母带,只是忠实地完成一件事: 严肃监听。

⏩一、天下苦 audio-preview 久矣

EAR 的起点是上游 sukumo28/vscode-audio-preview (https://github.com/sukumo28/vscode-audio-preview)。该项目较早实现了 VS Code 打开音频文件, 并且进行简单频域可视化的功能:资源管理器里点开文件,预览出现在编辑器区域,工作流不必切到外部播放器。路径成立之后,工程与能力缺口同样明确。

EAR 从这里开始重构。项目保留了 Custom Editor 所需要的 host 与 webview 通信方式,但解码、频谱分析、渲染、响度、计量和配置体系都重新组织。音频按格式选择 WASM 解码器,浏览器原生支持的格式交给 Web Audio API;文件传输采用分段方式,并在界面上显示加载进度;离线分析放在扩展宿主中执行,webview 主要负责解码、播放和绘制。

这些调整直接对应日常使用中的等待、卡顿和反复切换。打开文件时能够知道加载进行到哪里,拖动频谱时界面能够保持响应,设置和监听入口始终处于固定位置,分析结果也不必先导出到另一套软件。EAR 与上游之间留下的主要是通信协议,解码、FFT、渲染、计量、响度与配置都已经换成新的实现。

⏩二、此专业, 非彼专业

DAW 与母带工具链里的 Waves PAZ Analyzer、ADPTR Metric AB、iZotope Insight 2、Youlean Loudness Meter,分别代表了频谱、响度、立体声场和真峰值等不同的监听方向。EAR参考这些行业规范, 在ide上对监听的边界进行扩展与实现.

1. 专业监听首先要能观察整段音频的静态结构。波形可以暴露削波、静音和动态变化,STFT 可以显示谐波、噪声、共振和瞬态。对于语音,擦音能量、低频噪声、合成伪影和频带缺失,通常首先出现在时频图上。

2. 其次是播放过程中的动态状态。实时频谱用于观察当前能量分布,示波器用于观察左右声道的空间关系,相位相关谱则把同相和反相的变化展开到频率轴上。一个宽带相关数值能够说明总体趋势,但无法指出问题发生在哪个频段。

3. 还需要响度和动态范围指标。LUFS-M、LUFS-S、LUFS-I、LRA、PLR 与 dBTP 分别描述不同尺度下的响度、响度范围、峰值与响度的关系,以及采样点之间可能出现的真峰值, 这些信息有助于工程上的数据筛选与边界检查。

4. 最后是序列特征与监听路由。F0 可以帮助检查语音的基频连续性、清浊音切换和音高抖动;onset 强度可以帮助定位字头、瞬态和突发噪声;L/R、M/S 以及分频段 solo 则让这些判断可以在不同监听视角下重复验证。

EAR 把这些能力放在 STFT、Live Spec 和 Loudness 等工作区中。语音研发里常见的「改完增强或 TTS,立刻听样本并检查指标」可以在一个窗口完成,不需要每次导出到 Audition、Insight 或临时 notebook。

⏩三、好不好看, 够不够用

STFT 工作区

Edit & Export

设置面板

3.1 功能区分布

界面分为四个工作区。STFT是默认入口,显示多通道波形和 GPU 频谱图,支持线性、对数和 mel 等频率尺度;Live Spec集中显示实时频谱、示波器和相位相关谱;Loudness把 LUFS、F0 与 onset 放到共享时间轴;Edit & Export用于选区预听和 WAV 导出。

左下角的悬浮球集中放置播放、音量和 Monitor 控件, 长按可拖动位置。设置面板分为 Options、Player 和 EasyCut,分析设置、播放器设置和导出设置各自独立。工作区采用懒加载,首次打开文件时不会同时初始化所有分析组件。

个性化设置不需要离开当前工作区:点击左下角齿轮可以打开当前视图的设置,也可以使用Cmd+/或Ctrl+/快速进入。Options 用于调整波形、频谱和 Live 分析,Player 负责音量、空格播放和滤波器,EasyCut 则管理选区与导出;这些设置会自动保存到 VS Code 的globalState。在画布上按?可以临时调出快捷键预览,Space控制播放,拖拽时配合Ctrl/Cmd或Shift可以约束缩放方向,右键及组合键可以重置对应视图;耳机校准则可用Cmd/Ctrl+Shift+E直接打开。

使用流程很简单:打开音频后,先在 STFT 中查看整体结构,再在 Live Spec 中播放并观察实时变化,需要确认响度或基频时进入 Loudness,发现问题后拖选一段进入 Edit & Export。耳机补偿从 Monitor 面板进入。波形、频谱和响度区域共享选区与 cue 的操作逻辑,用户不需要为每个图重新学习一套手势。

3.2 使用要点

打开 音频文件后,本插件会自动进入预览界面。STFT 中可以单击设置播放位置、拖拽缩放和选择区域;Live Spec 在播放时更新;Loudness 在需要时进行离线分析;导出页则接收前面工作区产生的时间选区。若希望音频文件默认使用 EAR 打开,可以在 VS Code 的编辑器关联设置中指定earAudioPreview.audioPreview。

3.3 双进程数据流

双进程数据流

扩展宿主负责文件传输、离线分析、设置持久化、频响校准曲线请求和导出写入;webview 负责拼包解码、Web Audio 播放、图形绘制和实时表头。较重的 STFT、F0 与 onset 分析不会长期占用界面线程,AutoEq 也通过宿主代理访问,音频数据不会发送到网络端。

⏩四、技术选型与考量

Live Spec

Monitor

4.1 监听矩阵:L / R / M / S

实时监听采用一个 2×2 的线性矩阵,把输入的左右声道重新组合到输出:

Monitor mode

原始立体声使用单位矩阵;L 或 R solo 会把单个声道送到双耳;M 模式使用 (L+R)/2,S 模式使用 (L-R)/2,另有左右交换模式。这个矩阵同时服务输出监听和实时分析,因此切换到 M/S 后,耳朵听到的内容与频谱、示波器和相关谱使用的内容一致。

分析器不在主播放链上串行处理音频,而是从播放路径取得一份旁路数据。浏览器端不预先做时间平滑,频谱和声场的释放速度由应用层统一控制,这样不同表头的动态反应可以保持一致。

4.2 五段 band solo

频段监听把全频带分成五个可以独立 solo 的区域,默认边界为 20、60、240、900、5000 和 24000 Hz。每个区域由级联的高通和低通滤波器构成,使用 Butterworth 响应,使相邻频段之间保持有限但可控的过渡, 并且每段分频点都独立可调节, 有助于适配不同场景的不同工作习惯 (例如speech与music相比, 的所谓"低频"往往不是同一码事)。

多个频段同时选择时,输出会按选择数量归一化,避免频段相加造成不必要的电平抬升。频段矩阵位于音量增益之后、分析器之前,因此 band solo 会同时改变实际监听和表头看到的信号。它适合快速检查低频噪声、低中频浑浊、齿音区或高频噪声,而不需要临时制作一组新的音频文件。

4.3 Live 频谱:FFT 与 CQT

Live 频谱提供 FFT 和 CQT 两种分析视角。FFT 适合实时跟踪,CQT 适合阅读听觉尺度上的频率结构;二者共享监听矩阵、峰值保持和释放逻辑。

FFT 模式

浏览器分析器提供左右声道的短时幅度谱,EAR 先按照当前监听模式组合声道,再映射到对数频率轴。设左右复数频谱为 X_L 和 X_R,监听矩阵作用后的两路复数频谱为:

它只改变显示,不改变声音。接近噪声底时,倾斜会逐渐减弱,避免静音谱被画成一条人为的斜线。

FFT 窗口大小决定时间分辨率和频率分辨率之间的取舍。小窗口响应更快,大窗口更容易分辨低频和窄带结构。EAR 不依赖浏览器默认的时间平滑,而是在应用层统一处理峰值和释放。其 EMA 形式为:

这样实时频谱、相位谱与声场显示可以使用相近的动态响应,peak hold 则在释放开始前保留短暂的峰值信息。

CQT 模式

等宽 FFT 放到对数频率轴上时,低频频点过稀,高频频点过密。CQT 为不同中心频率使用不同长度的分析窗,低频窗长、高频窗短,使相对带宽更加稳定。其基本关系为:

EAR 的 CQT 使用 Goertzel 计算各频段能量,并采用 Hann 窗。250 Hz 以下的低频段根据 LF resolution 使用约 3.85、5.07 或 6.97 的 Q,250 Hz 以上接近 Q=10。低频段使用较疏的频率布局,高频段使用接近常数的 Q,因此低频结构不会被几个稀疏 bin 粗略带过,高频曲线也不会因为频点过密而失去可读性。横坐标使用相邻中心频率的几何平均作为频段边界,使曲线落在对数轴的自然分界上。

这套方法适合观察语音谐波、共振峰和宽带噪声的整体轮廓。它与普通 FFT 的差别在于, 分析带宽被重新分配到更接近听觉的尺度。项目中另有一篇文章(https://github.com/Eps-Acoustic-Revolution-Lab/EAR-Audio-Preview/blob/main/doc/blog/cqt-spectrum-analyzer.md)记录 Waves PAZ Analyzer 的 CQT 曲线逆向探寻过程,感兴趣的读者可以参考。

4.4 Polar 立体声场与相位相关谱

Polar / Lissajous

Goniometer 将左右声道映射到半圆声场中。对样本 (L,R),方向由左右差值与左右和决定,半径与 $\sqrt{L^2+R^2}$ 成正比。

样本能量用

表示,再根据显示模式做归一化或分箱。Polar Sample 直接显示采样点的分布,Polar Level 先按方向统计能量并压低不显著的方向,Lissajous 则保留经典的左右声道 X-Y 轨迹。三种视角分别适合观察瞬时散点、稳定声场和左右声道关系。

同相信号通常集中在声场中部,反相成分会向两侧展开。显示层对能量做平滑和峰值保持,使声场轮廓能够随播放变化而稳定更新。

相位相关谱

相位相关谱对左右声道分别进行短时傅里叶变换,再计算归一化互谱实部:

低能量频段不会主导总体结果。曲线经过对数频率重采样和时间平滑,正相关与负相关使用不同颜色显示。对于立体声语音、多麦克风处理、Mid/Side 编码和声道对齐,这比只给出一个全频相关数更容易定位问题。

监听模式和相位分析使用同一套声道组合方式。切换到 L、R、M 或 S 后,听到的信号和图上的分析对象保持一致。

4.5 后端重设计与加速

项目对解码、STFT 和频谱渲染做过独立 benchmark。下表中的渲染数据来自 10 秒、60 秒和 300 秒的测试样本,比较的是旧项目的 Canvas2D 逐点着色和新的 WebGL2 texture pack:

频谱图把 STFT 幅度交给 GPU 作为纹理,再由片元阶段完成频率映射和颜色计算。虽然可调用GPU, 但是本任务十分轻量化, 经测试, 在正常无GPU的ssh服务器或是集成显卡的笔记本电脑中, 均工作良好. 这个变化直接影响拖拽缩放时的重绘成本:300 秒样本上,处理时间从 40.88 ms 降到 6.00 ms。解码路径的 cold / warm 微基准分别约为 3.94 ms 和 0.15 ms,但整文件打开还包括分段传输、内存拼接和浏览器解码,因此不能把这两个数字理解为完整加载时间。

STFT 后端采用分工策略。Ooura 适合启动快、响应及时的交互路径;Essentia 提供更多窗函数和离线分析能力,也承担 F0、onset 等序列计算。300 秒样本中,Ooura 约 386.44 ms,Essentia 的外推值约 3397.35 ms。重计算放在扩展宿主,webview 负责解码、播放和绘制;AutoEq 请求也通过扩展宿主代理,音频数据不会离开本地。

4.6 F0 与 onset 序列

F0 与 onset 都采用短时分帧分析。每帧先经过窗函数和频谱变换,再用基于 Yin 的方法估计基频,用谱通量描述相邻帧的能量变化。F0 估计带有置信度判断,清浊音边界、无声段和噪声段不会被强行填成一条连续曲线。

这些序列在扩展宿主中计算,结果返回到 Loudness 工作区,与 LUFS 曲线共享时间轴。这样可以同时观察响度变化、基频连续性和瞬态位置,快速定位值得回听的区域。真峰值则在波形、电平表和整段响度信息中分别提供,帮助区分样本峰值与插值后的 dBTP。

它仍然不是完整的语音学标注工具,没有 TextGrid 或精细手工标注界面。这里的目标是打开一个样本之后,用很短的时间得到一组可靠的初步判断。

⏩五、Two More Things

耳机频响校准

5.1 听力保护

试听算法输出时,异常峰值有可能突然出现在耳机里。EAR 提供可选的峰值保护:检测到左右声道峰值超过设定阈值时,输出自动静音;峰值回落到阈值以下一定范围后恢复播放,并使用回差减少反复触发。默认阈值为 +6 dBFS,用户可以根据监听环境调整。

这项功能只负责保护监听者,不会修改音频文件,也不会把保护动作写入导出结果。

5.2 耳机频响校准

不同耳机的频响差异会直接影响主观评测。EAR 通过 AutoEq 项目提供的各常见设备的频响曲线, 自动获取存量的耳机测量数据和目标曲线,将参数均衡器插入实时播放路径。用户可以搜索型号、选择测量与目标、应用或旁路补偿,并把 profile 保存到 workspace 或全局配置中。

AutoEq 请求只包含耳机型号、测量来源、目标曲线等元数据,音频文件不会上传。校准只作用于实时播放,不修改导出的 WAV;这使它适合用来统一听感参考,也避免把监听补偿意外带入数据交付。

需要注意的是, 本项目使用的监听校准是基于简单多段滤波器的轻量级实现, 本身不具备FIR的相位一致性, 势必会一定程度上影响最终听感, 仅仅可用于不同监听环境的粗糙找平.

⏩六、整体音频信号链路

EAR 的播放和监听可以概括为以下路径:

整体音频信号链路

五段频带选择位于音量增益之后,它同时影响输出和送往分析器的内容。响度分析单元统计 LUFS 和真峰值,不承担音色处理。

图中从音频源到输出的是主播放路径。左右分析器取得同一播放路径上的信号,之后一份进入 L/R、M、S 监听矩阵,形成最终输出;另一份只供电平表、实时频谱、Goniometer 和相位相关谱读取,不再回到主路径。因此表头是旁路观察,不会额外改变声音。

离线分析从完整解码缓冲单独开始,计算 STFT、响度 profile、F0 与 onset,不依赖播放进度,也不经过实时监听矩阵。没有打开实时分析和听力保护时,相关实时节点会被释放,播放可以直接连接到输出。

⏩七、结语

EAR Audio Preview 把谱、相位、响度、序列与监听路由收进 VS Code Custom Editor,同时满足样本质检、算法前后对照、立体声/相位排查、F0/onset 粗看、听感评测前的频响曲线补偿,以及截取坏例导出等等工作流。如感兴趣, 可在插件市场中搜索ear-audio-preview:

项目地址与 issue:https://github.com/Eps-Acoustic-Revolution-Lab/EAR-Audio-Preview

许可为MIT,欢迎 issue 与 pull request。

开发与维护由Eps Acoustic Revolution Lab(ear-lab)推进,本组织专注与音频相关的研究与工程, 静候各位合作:https://github.com/Eps-Acoustic-Revolution-Lab