Vencord Volume Booster 插件解析:突破 200% 音量上限的原理与配置指南
Vencord Volume Booster 插件解析:突破 200% 音量上限的原理与配置指南
本篇指南围绕 Vencord 内置插件 Volume Booster(插件源码、官方说明)展开,讲解它如何借助 Discord 补丁与 Web Audio API,把用户音量、机器人音量乃至直播间音量推到 Discord 原生上限(桌面端 200%、其他客户端 100%)之外。读完本文,你将掌握该插件的安装启用方式、multiplier 倍率滑块的完整配置方法,以及其底层补丁机制与 Web Audio 增益链路的实现细节,可直接运用于语音调试与插件二次开发。
插件定位:突破音量上限的语音工具
Volume Booster 是 Vencord 的官方语音类插件,官方说明原文如下:
Allows you to boost the volume over 200% on desktop and over 100% on other clients. Works on users, bots, and streams!
它解决的核心痛点是:Discord 原生的音量滑块存在上限——桌面客户端最高 200%,Web/Vesktop 等其他客户端最高 100%。Volume Booster 通过修改 Discord 内部音量滑块的 maxValue,并拦截音频渲染链路,让用户、机器人与直播间音频都能超出这一上限继续放大。
插件元数据(见 index.ts)也印证了这一点:
export default definePlugin({
name: "VolumeBooster",
authors: [Devs.Nuckyz, Devs.sadan],
description: "Allows you to set the user and stream volume above the default maximum",
tags: ["Voice", "Utility"],
settings,
...
});
从源码结构看,该插件由三部分组成:一份 multiplier 倍率设置、一组针对 Discord 模块的正则补丁(patches),以及一个基于 Web Audio 的 patchVolume 运行时函数。
安装与启用
Volume Booster 是 Vencord 仓库内置插件,位于 src/plugins/volumeBooster/,无需额外下载。启用方式与 Vencord 其他插件一致:
- 在 Discord(桌面版或 Vesktop)中打开 用户设置 → Vencord → 插件(Plugins);
- 在搜索框输入
VolumeBooster; - 打开右侧开关即可生效,无需重启客户端。
插件同时带有 Voice 与 Utility 两个标签,便于在插件列表中检索。启用后,各频道成员右侧音量滑块的最高值即被抬高为“原生上限 × multiplier”,桌面端默认最高可达 400%。
核心配置:multiplier 倍率滑块
Volume Booster 仅暴露一个设置项 multiplier,定义在 index.ts:
const settings = definePluginSettings({
multiplier: {
description: "Volume Multiplier",
type: OptionType.SLIDER,
markers: makeRange(1, 5, 0.5),
default: 2,
stickToMarkers: true,
}
});
各字段含义如下(类型定义见 src/utils/types.ts):
| 字段 | 值 | 说明 |
|---|---|---|
description |
"Volume Multiplier" |
设置界面显示的文案,即“音量倍率” |
type |
OptionType.SLIDER |
滑块类型,见 OptionType 枚举 |
markers |
makeRange(1, 5, 0.5) |
滑块可取的全部档位:1、1.5、2、2.5、3、3.5、4、4.5、5 |
default |
2 |
默认倍率为 2,即桌面端上限被抬到 200% × 2 = 400% |
stickToMarkers |
true |
强制吸附在档位上,不允许选中档位之间的任意值 |
其中 makeRange(1, 5, 0.5) 由 src/utils/types.ts 实现:从 1 开始、以 0.5 为步长递增到 5,并对浮点误差做四舍五入归一,最终生成 [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5] 共 9 个档位。
最终音量上限计算公式:最高滑块值 = 客户端原生上限 × multiplier。桌面端原生上限 200%,默认倍率 2 时最高为 400%;将倍率调到 5,则最高可达 1000%。Web/Vesktop 端原生上限 100%,默认倍率 2 时最高为 200%。
实现原理:从滑块到音频链路的全链路改造
Volume Booster 并不是“把音量乘个系数”这么简单,它需要对 Discord 的多个内部模块打补丁,并在音频渲染层注入增益节点。全部补丁定义在 index.ts。
1. 抬高滑块 maxValue
插件用两条补丁分别处理用户音量滑块与直播/流音量滑块:
- 针对用户音量滑块(
find: "#{intl::USER_VOLUME}"),把maxValue替换为原生上限 × multiplier(见 index.ts):replace: (_, higherMaxVolume) => `${higherMaxVolume}*$self.settings.store.multiplier` - 针对流音量滑块(
find: "currentVolume:"),用同样的正则策略抬高maxValue(见 index.ts)。
这两处补丁共同保证了“滑块能拖到 200% 以上”,是交互层的入口。
2. 运行时增益:Web Audio GainNode
补丁只能改 UI,真正把音量放大靠的是 patchVolume 函数(index.ts)。它利用 Web Audio API 建立了一条独立的增益链路:
patchVolume(data: StreamData) {
if (data.stream.getAudioTracks().length === 0) return;
data.streamSourceNode ??= data.audioContext.createMediaStreamSource(data.stream);
if (!data.gainNode) {
const gain = data.gainNode = data.audioContext.createGain();
data.streamSourceNode.connect(gain);
gain.connect(data.audioContext.destination);
}
...
data.gainNode.gain.value = data._mute ? 0 : data._volume / 100;
}
关键点:
- 以
MediaStream为源创建MediaStreamAudioSourceNode,经由createGain()生成的GainNode连接到audioContext.destination,形成“流 → 增益 → 输出”的旁路; - 增益值直接取自
data._volume / 100,因此音量被抬到 200%、300% 时,GainNode.gain会对应大于 1,实现真实放大; - 静音时增益强制归零(
data._mute ? 0 : ...),与 Discord 的静音状态保持一致; - 通过
data.sinkId与setSinkId处理输出设备切换(扬声器/耳麦),确保放大后的音频仍路由到正确的输出设备(index.ts)。
StreamData 接口(index.ts)中新增的 gainNode 与 streamSourceNode 字段,正是插件在 Discord 流数据结构上“挂载”增益链路的位置。
3. Web / Vesktop 专属补丁
由于桌面版与 Web 版的音频实现不同,插件用 predicate: () => !IS_DISCORD_DESKTOP 条件(index.ts)为 Web/Vesktop 追加了三处修正(index.ts):
- 移除舍入算法:
Math.max...的取值被替换为arguments[0],避免 Discord 把音量强制夹回 100% 以内; - 修复流音频不播放:在
}return"video"前注入this.updateAudioElement(),解决“调整音量后直播流不出声直到再次更新”的 Web 端 bug; - 接入增益链路:把
.volume=this._volume/100替换为.volume=0.00;$self.patchVolume(this),即把原生音量置零、改由 GainNode 接管放大。
这三处补丁协同工作:先不依赖原生 volume 属性,再注入插件自己的增益节点,从而在 Web 端也能突破 100% 上限。
4. 与 Discord 设置同步的防御
插件还处理了两个“回写”风险:
- Audio Context Settings 同步:当 Discord 尝试把本地音量同步给服务端时,若值超过 200 会触发异常或被回压。补丁(
find: "AudioContextSettingsMigrated",index.ts)把同步值截断为>200?200:值,保证外发数据合法; - MediaEngineStore 覆盖:为防止 Discord 的音频上下文同步把本地高于 200 的音量覆盖回原生值,补丁(
find: '="MediaEngineStore",',index.ts)将本地音量改为“仅在不超过 200 时才接受同步值”的守卫逻辑,保住放大后的音量设置。
使用场景与注意事项
适用场景:
- 对方麦克风或直播流音量过低,滑块已拉到原生上限仍听不清;
- 希望统一放大所有用户、机器人与直播流,而不逐个调整;
- 在 Web/Vesktop 端需要超过 100% 的音量(桌面端上限本就为 200%)。
注意事项:
- 放大的是“听感音量”,可能引入失真或爆音,建议从默认倍率 2 开始,按需上调;
- 倍率 5 时桌面端滑块上限达 1000%,过度放大可能损伤听觉或扬声器,请谨慎使用;
- 该插件仅作用于音频播放链路,不会修改对方实际发送的音量,属于本地增强;
- 与
definePluginSettings机制一致,设置会自动持久化并与 Vencord 设置同步,无需手动保存。
如需进一步研究其设置系统与滑块类型的通用实现,可阅读 src/utils/types.ts(makeRange)、src/utils/types.ts(滑块设置定义)以及 src/api/Settings.ts(definePluginSettings)。