VoiceMusicBoost
Music over the in-game microphone without the mud and dropouts.音乐语音增强 (VoiceMusicBoost) 1.0.1
R.E.P.O. 的语音走 Photon Voice,默认按 人声 调优:Opus 单声道 30kbps / 24kHz、开启语音检测(VAD)、叠加 WebRTC 的 AEC/NS/AGC 处理。用麦克风链路放音乐时,这三样叠加起来就是「发闷 + 断续 + 一阵阵断口」。
本插件只改这三处,只写运行期参数,不修改任何游戏文件:
- Opus 编码:30000bps / 24000Hz → 96000bps / 48000Hz(单声道不变),帧长 20ms → 40ms。
- 语音检测(VAD):关闭,让安静与低频段落照常发送。
- WebRTC 音效链:关闭 AEC / NS / AGC / 高通滤波 / WebRTC 自带 VAD,并旁路整条处理链。
游戏原生的「按 45m/60m 距离与视野动态增删语音接收者」逻辑 不做任何改动,1.0.1 已移除该改动。
安装
把 VoiceMusicBoost-1.0.1.dll 放进:
<游戏目录>\BepInEx\plugins\
配置文件:`BepInEx\config\com.voicemusicboost.repo.cfg`,改完重启生效(也可用 ConfigurationManager 游戏内改)。
## 只在你自己电脑上装就够
- 补丁挂在 `Recorder` / `WebRtcAudioDsp` 这两个组件的类型上,作用于**本机的语音发送链路**,与房间角色无关。
- 你是**房主**、或作为**客机**加入别人的房间,效果完全一样,都是本机生效。
- 队友**不需要装**:这是发送端参数优化,接收端解 Opus 是自适应的,96kbps/48kHz 的流对方照常播得出来。
- 反过来,别人装了这个插件、你没装,对你没有任何影响。
## 配置项
### 1-编码参数
| 配置项 | 默认 | 说明 |
|---|---|---|
| 启用编码覆盖 | 开 | 关掉则不覆盖编码参数,只保留 VAD 与 WebRTC 处理开关 |
| Opus 码率 (bps) | 96000 | 游戏默认 30000。64000 够用 / 96000 推荐 / 128000 最佳 |
| 采样率 (Hz) | 48000 | 游戏默认 24000,音乐高频被削。可选 16000/24000/32000/48000 |
| 帧长 (毫秒) | 40 | 游戏默认 20。40 抗抖动更均衡,20 延迟最低 |
### 2-音频处理
| 配置项 | 默认 | 说明 |
|---|---|---|
| 关闭语音检测 (VAD) | 开 | 语音检测会把安静/低频段落判为静音停止发送,音乐因此频繁断口 |
| 语音检测阈值 | 0.001 | 仅在未能关闭 VAD 时生效 |
| 关闭 WebRTC 音效处理 | 开 | 关掉 AEC / 噪声抑制 / AGC / 高通滤波 / WebRTC VAD 并旁路处理链。这些算法专为人声设计,会把音乐当噪声压制。**外放音箱而非戴耳机时可能给队友带来回声** |
### 3-传输
| 配置项 | 默认 | 说明 |
|---|---|---|
| 可靠传输 | 关 | 丢包重传,音乐不易被丢包撕裂,但延迟与带宽上升。网络差时可试开 |
### 4-诊断
| 配置项 | 默认 | 说明 |
|---|---|---|
| 输出详细日志 | 开 | 每次建立语音流后打印实际采样率/声道/帧长/码率/采样管道,以及**麦克风输入端的真实格式** |
日志形如:
[实际语音流] 采样率=48000Hz 声道=1 帧长=40ms 码率=96000bps 采样管道=LocalVoiceAudioShort | 麦克风输入: 48000Hz x2
## 关于你本地的 48000Hz / 32bit
- **采样率 48000 是对齐项**:插件请求 48000Hz,正好等于设备格式,Windows 通信角色不会把输入降到 16kHz 再重采样。这是「照 48kHz 优化」的实际含义。
- **位深 32bit 保不住,也不用保**:Opus 是有损编码,内部按 16bit 量化,并且没有 24/32bit 模式。32bit float 只是设备侧的采集格式,进编码器前必然降到 16bit。想提升听感要加**码率**,不是位深。
- **声道会被合并**:Opus 单声道下,设备的 2 声道输入会 downmix 成单声道,音乐的左右声像会丢失。若要立体声必须改 Opus 立体声(码率翻倍、上行带宽翻倍),本版按你要求保持单声道。
- 若日志里「麦克风输入」低于 48000Hz,说明虚拟声卡或系统在采集端就降频了,插件救不回来:去 Voicemeeter 系统设置/Windows 声音设置把设备格式设为 48000Hz,并把该设备从「通信设备」角色取消(声音控制面板 → 通信 → 不执行任何操作)。
## 仍需手动配合
1. **关闭游戏内「按键说话」**(设置 → 音频/控制),否则只在按键时发送。
2. **发送端音量**:游戏内麦克风音量调高;音乐偏小就在 Voicemeeter 的 B1 总线加增益,不要靠堆码率。
## 原理(补丁点)
| 补丁 | 目标 | 作用 |
|---|---|---|
| Prefix | `Recorder.CreateLocalVoiceAudioAndSource` | 建流前直写私有字段 bitrate / samplingRate / frameDuration / voiceDetection / voiceDetectionThreshold / reliableMode,不触发 RestartRecording(避免重启死循环) |
| Postfix | `WebRtcAudioDsp.Awake` | 关 AEC / NS / AGC / HighPass / WebRTC VAD,并设 Bypass |
| Postfix | `PlayerVoiceChat.PhotonVoiceCreated` | 打印实际生效参数、采样管道与麦克风输入格式 |
补丁按组加载,任一组失败只记日志,不影响其余功能。
## 局限说明
- 语音链路的上限没变:Opus 单声道实时编码,音乐达不到推流级音质。96kbps/48kHz 已是可听级(早期网络电台水平)。
- 不碰距离过滤,因此远处队友按游戏原逻辑仍可能收不到你的语音;这属于游戏设计,本插件不干预。
- 若追求真正流畅无损,唯一彻底方案是把音乐做成**游戏内 3D 音源**(AudioSource + 网络同步),完全绕开语音编码。那是另一套实现,本插件不做。
## 兼容性
- BepInEx 5,.NET Framework 4.7.2 目标(Unity Mono),单文件 DLL,无第三方依赖,可与其它 BepInEx 插件共存。
