Releases: Mzaxd/EqualLoud
Release list
v2.1.0
EqualLoud 2.1
🇬🇧 English
A refinement release focused on making the loudness target trustworthy —
a sane, enforced target range and a fix for mono content measurement.
Changed
- Target-LUFS slider narrowed to [−36, −6] — The old [−60, 0] axis allowed
nonsense targets: −60 demands a ~+54 dB boost the protection limiter would
clamp into pumping mush, and 0 LUFS forces maximum compression. The popup
meter and knob are retargeted to the practical axis, and the Options slider
uses the same bounds.
Added
- Target range enforced end-to-end — The bounds are a shared config
constant checked in every layer: the service worker clamps incoming
SET_TARGET_LUFSmessages, and a settings migration clamps any stored
target into range, dropping corrupt non-numeric values instead of passing
them through. Existing stored targets migrate automatically.
Fixed
- Mono loudness over-read (2.0.1 regression) — Mono media was up-mixed to
identical stereo before measurement, biasing mono LUFS ~+3 dB high, so quiet
mono podcasts/clips were under-boosted. Mono now stays native 1-channel;
5.1 input still down-mixes to stereo correctly. - Re-attach on SPA pages — Elements managed via the volume fallback
(CORS-tainted or takeover-failed) stayed permanently claimed after teardown,
so an SPA re-inserting the same node never got re-managed. Handles now
un-claim on every dispose path.
Verification
- Full release gate: type-check, lint, unit tests, and the LUFS accuracy
(golden-reference) suite - Target-range behavior covered by new unit tests across config, service
worker, and storage migration
🇨🇳 中文
一次聚焦让响度目标值得信赖的打磨版本——收紧并全链路强制目标范围,
修复单声道内容的测量偏差。
改进
- 目标响度滑杆收窄到 [−36, −6] — 旧的 [−60, 0] 轴允许明显不合理的
目标:−60 需要约 +54 dB 的提升,会被保护限幅器压成忽大忽小的糊状声;
0 LUFS 则意味着极限压缩。弹出面板的刻度盘和旋钮已重定向到实用区间,
选项页滑杆同步使用相同边界。
新增
- 目标范围全链路强制 — 边界值是共享的配置常量,在每一层都被校验:
Service Worker 对SET_TARGET_LUFS消息做钳制;设置迁移会把已存储的
超范围目标值收敛进区间,并丢弃损坏的非数值而不是透传。现有已存储的
目标会自动完成迁移。
修复
- 单声道响度偏高(2.0.1 回归) — 单声道媒体在测量前被上混成相同的
左右声道,导致单声道 LUFS 读数偏高约 +3 dB,安静的单声道播客/片段
提升不足。现在单声道保持原生 1 声道;5.1 输入仍正确下混为立体声。 - SPA 页面重新挂载 — 走音量回退路径管理的元素(CORS 污染或接管
失败)在销毁后仍被永久占用,SPA 重新插入同一节点时再也无法被管理。
现在每条销毁路径都会解除占用标记。
验证
- 完整发布门禁:类型检查、lint、单元测试、LUFS 精度(黄金参考)套件
- 目标范围行为在 config、Service Worker、存储迁移三层均有新增单元测试覆盖
Full Changelog: v2.0.1...v2.1.0
v2.0.1
v2.0.0
EqualLoud 2.0
🇬🇧 English
A major upgrade focused on professional loudness measurement. EqualLoud now
not only balances loudness — it shows you exactly what's happening to the audio.
New
- True Peak metering (dBTP) — Measures inter-sample peaks via BS.1770 §5.2
4× oversampling, the same standard broadcast engineers use. Sample-peak meters
miss the peaks that happen between digital samples; true-peak catches them. - Integrated loudness — The whole-programme gated LUFS (the figure EBU R128
delivery specifies), now surfaced in the Pro panel. The worklet always
computed it; 1.0 just never showed it. - Loudness Range (LRA) — EBU Tech 3342's measure of dynamic range, shown as
both a number and a thermometer bar. Tells you whether content is dynamic
(classical, cinema) or compressed (ads, loudness-war pop). - Loudness presets — One tap to set a correct, industry-standard target:
Streaming (−14, Spotify/YouTube), Podcast (−16, Apple Podcasts/AES), or
Broadcast (−23, EBU R128). Each preset shows its cited source on hover. - Pro mode — Toggle a loudness-analysis panel (dBTP / integrated / LRA).
Off by default for a clean, minimal interface.
Changed
- Boost ceiling raised 12 → 24 dB — Quiet content (ASMR, low-volume
podcasts, old recordings) can now actually reach the target loudness. The
true-peak Protection limiter (−1 dBTP) is the safety net. - Output Protection: always on — The old 5-knob Limiter is gone. Protection
runs silently at −1 dBTP (EBU R128 spec) in the background — no toggle, no
knobs, because clipping protection should never be something you can turn off. - Tooltip overflow fixed — InfoTip bubbles are now teleported to the page
body and positioned withposition: fixed, structurally eliminating the
recurring "tooltip clipped by the popup border" bug. - "Analyzing" indicator — Moved inline into the tab row (no extra height).
- Auto language detection — Follows the browser/system language
automatically on install and whenever the OS language changes. Manual toggle
still available but no longer required.
Removed
- Limiter panel (5 sliders → silent background protection)
- "Loud" preset (−10 LUFS had no standard basis)
Verification
- 246 unit tests + 38 LUFS accuracy (golden-reference) tests pass
- True peak verified against pure tones (+1.6 dBTP overshoot at Nyquist) and
the +1/−1 worst-case signal - LRA algorithm verified against EBU Tech 3342 v2.0 specification
🇨🇳 中文
一次聚焦专业响度测量的大版本升级。EqualLoud 现在不仅平衡响度——
还能让你清楚地看到音频到底发生了什么。
新增
- 真峰值测量(dBTP) — 基于 BS.1770 §5.2 的 4× 过采样算法,测量采样
点之间的真实峰值。普通峰值表会漏掉数字采样点之间的失真峰值,真峰值能
抓住它们——这正是广播工程师使用的标准。 - 整体响度(Integrated LUFS) — 整段节目的 gated LUFS(EBU R128 交付
标准规定的那个数值),现在在专业面板中展示。worklet 一直在算,1.0 只是
没显示出来。 - 动态范围(LRA) — EBU Tech 3342 定义的动态范围指标,同时以数字和
温度计条展示。告诉你内容是动态丰富(古典、电影)还是被压缩过(广告、
响度战争后的流行乐)。 - 响度预设 — 一键设置正确的行业标准目标:流媒体(−14,Spotify/
YouTube)、播客(−16,Apple Podcasts/AES)、广播(−23,EBU R128)。
每个预设 hover 时显示依据来源。 - 专业模式 — 切换响度分析面板(真峰值 / 整体响度 / 动态范围)。默认
关闭,保持界面简洁。
改进
- 提升上限从 12 提高到 24 dB — 安静的内容(ASMR、低音量播客、老录音)
现在能真正达到目标响度。真峰值保护限幅器(−1 dBTP)是安全网。 - 输出保护:永远开启 — 旧的 5 旋钮限幅器已移除。保护以 −1 dBTP
(EBU R128 标准)在后台静默运行——没有开关、没有旋钮,因为削波保护
不应该是你能关掉的东西。 - 修复提示气泡遮挡 — InfoTip 气泡现在 teleport 到页面 body 层并用
position: fixed定位,从结构上彻底解决了反复出现的"问号提示被弹窗
边框裁切"的问题。 - "分析中"标识 — 内联进标签行,不再额外占用纵向空间。
- 自动语言检测 — 安装时以及系统语言变更时,自动跟随浏览器/系统
语言。手动切换仍可用,但不再必须。
移除
- 限幅器面板(5 个滑块 → 后台静默保护)
- "响亮"预设(−10 LUFS 没有标准依据)
验证
- 246 个单元测试 + 38 个 LUFS 精度(黄金参考)测试全部通过
- 真峰值算法经纯音验证(Nyquist 频率处 +1.6 dBTP 过冲)和 +1/−1
最坏情况信号验证 - LRA 算法经 EBU Tech 3342 v2.0 规范核对
What's Changed
Full Changelog: v1.1.0...v2.0.0
v1.1.0
EqualLoud v1.1.0
🔊 Automatically balance loudness across every video/audio tab — install and forget.
Open as many YouTube videos, podcasts, and music tabs as you like; EqualLoud
keeps their loudness consistent. No clicking, no per-site setup — it just
works in the background.
📦 Download & Install
Option A — Load the unpacked build (recommended)
- Download
release.zipfrom the assets below. - Unzip it — you get a
dist/folder. - Open
chrome://extensions/in Chrome or Edge. - Turn on Developer mode (top-right toggle).
- Click Load unpacked → select the
dist/folder. - Done. Open any video/podcast tab and the loudness evens out within seconds.
Requires Chrome / Edge 120+.
Option B — Build from source
git clone https://github.com/mzaxd/EqualLoud.git
cd EqualLoud
pnpm install
pnpm build # produces dist/ and release/release.zipThen load dist/ as an unpacked extension (same as step 3–5 above).
✨ What it does
- 100% automatic — the moment audio starts playing in any tab, EqualLoud
takes over. No icon clicks, no setup. - Cross-tab balancing — every playing tab converges to one loudness target
(default −14 LUFS). Loud ads, quiet podcasts, and normal videos all sit at
the same level. - Boost and cut — quiet content is lifted up toward the target, not just
loud content pushed down. No more "I can't hear this podcast." - Accurate loudness measurement — ITU-R BS.1770-4 K-weighted loudness via
an AudioWorklet, with sample-rate-aware filter coefficients (correct on both
44.1 kHz and 48 kHz contexts). - Survives restarts — settings are remembered; balancing resumes after a
browser restart. - Per-tab A/B toggle — one click to hear any tab with vs. without
balancing. - Output limiter — on by default, so a loud boost never distorts or clips.
- 100% on-device — audio is processed locally. No data is collected,
uploaded, or tracked. SeePRIVACY.md.
Click the toolbar icon to
- Toggle balancing on/off.
- Drag the target-loudness slider (left = quieter overall, right = louder).
- See the live gain applied to each tab (
+5.2 dB,−3.0 dB, …). - Toggle per-tab balance to A/B the effect.
- Open Settings for the output limiter.
🔧 What's in this release (since 1.0.0)
- Sample-rate-aware K-weighting — the ITU-R BS.1770 filter coefficients are
now designed for the runtimeAudioContext.sampleRatevia bilinear-transform
pre-warping, instead of fixed 48 kHz constants. Corrects a 0.3–0.7 LU drift
on 44.1 kHz contexts (the macOS default). At 48 kHz the output is numerically
identical to before. - Popup long-lived Port — the popup now streams state from the service
worker overchrome.runtime.connectinstead of polling, so the live gain
readout is smoother and the SW isn't woken by poll traffic. - Storage schema versioning — settings and limiter records now carry a
__vtag and run through an idempotent migration chain on load. - AudioContext lifecycle backstop — the shared context is closed when the
extension is invalidated and all media elements have detached, preventing
leaks across extension reloads. - Favicon privacy — tab favicons are served from Chrome's local
_favicon/cache. Zero network egress. - Mono-source fix — mono audio is no longer duplicated into both channels
before K-weighting, fixing a +3 dB bias on podcasts and single-channel clips.
See CHANGELOG.md for the full list.
⚠️ Known limitations
- DRM content (Netflix HD, Disney+, etc.): Chrome forces protected media
silent when an extension takes over the audio. EqualLoud detects this and
falls back to a simpler volume-only control (attenuate, no boost). <all_urls>permission: required so balancing works on every site
automatically. EqualLoud processes audio locally and uploads no data.- Pages that synthesise audio without a media element (rare) aren't covered.
📄 License
MIT — see LICENSE.
🇨🇳 中文简介
EqualLoud 会自动把你打开的每一个音视频标签拉到同一个目标响度,全程后台运行,零操作。
安装: 下载下面的 release.zip → 解压 → 在 chrome://extensions/ 开启开发者模式 → "加载已解压的扩展程序" → 选择解压出来的 dist/ 文件夹。(需要 Chrome / Edge 120+)
功能亮点:跨标签自动均衡、既能放大也能衰减、基于 ITU-R BS.1770-4 的 K 加权响度测量(适配 44.1/48 kHz)、重启不丢设置、单标签 A/B 对比、输出限幅器、100% 本地处理不上传任何数据。
What's Changed
- fix(ui): InfoTip 被遮挡 + 挤出横向滚动条 by @Mzaxd in #1
- EqualLoud 顶尖化升级 by @Mzaxd in #2
- polish: code review pass toward top-tier extension quality by @Mzaxd in #3
- fix(sw): 实时音量条经常空白——LUFS_REPORT 被 throttle 时不 push by @Mzaxd in #4
New Contributors
Full Changelog: https://github.com/Mzaxd/EqualLoud/commits/v1.1.0
