Vencord Volume Booster 插件解析:突破 200% 音量上限的原理与配置指南

原创2026-10-01 14:48:041,758 阅读
文章标签:即时通讯桌面应用前端插件系统

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 其他插件一致:

  1. 在 Discord(桌面版或 Vesktop)中打开 用户设置 → Vencord → 插件(Plugins);
  2. 在搜索框输入 VolumeBooster;
  3. 打开右侧开关即可生效,无需重启客户端。

插件同时带有 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)。

登录后查看全文
Vencord