🧪 H3 保留环境音 + 去 BGM:源码级方案分析

基于 H3 DiT 架构源码深度分析 · 2026-08-04

核心理解

H3 的 target audio 流在采样过程中每一步都被去噪生成(audio_update = True)。生成的音频包含三样东西:

这三者在同一个 latent 中联合生成,文本 prompt 无法精确控制"要环境音但不要 BGM"。

从源码发现的 3 个可行思路

方案 1:调整 shift_audio 参数(最简单)

原理:shift_audio 控制音频流的 sigma schedule。它决定音频在每一步采样中被去噪的"强度"。

# 当前:
MiniMaxH3SigmaShift: shift_video=12.0, shift_audio=3.0

# 试验:推高 shift_audio 让音频更贴近 TTS
shift_video=12.0, shift_audio=8.0   # 或 12.0, 15.0

预期:shift_audio 升高时,音频越来越接近纯 TTS 条件(因为没怎么去噪),BGM 和环境音同时减弱。可能存在一个"甜点"值,环境音还在但 BGM 已消。

代价:只需改 1 个参数,代价最小。值得 A/B 测试。

方案 2:两遍采样——视频全去噪 + 音频部分去噪(最精准)

原理:利用 ComfyUI 的 denoise_mask(NestedTensor 支持 video/audio 独立 mask)。

  1. 第一遍:正常 KSampler 完整 15 步 → 得到完整 video latent + audio latent
  2. 第二遍:以第一遍结果为 latent_image,设 denoise_mask = NestedTensor(video_mask=0, audio_mask=1),denoise=部分 → 只对 audio 做少量去噪步骤

本质上是视频锁死、音频重采样几步,用更少的步数让音频只有粗略的环境音轮廓而不生成精细的 BGM 旋律。

问题:需要自定义 ComfyUI 节点构造 nested denoise_mask。工作量中等。

方案 3:采样步数截断(最直接)

原理:BGM(旋律、和声)是高频细节,需要充分去噪才能生成。环境音(低频噪声、风声)是粗略结构,前几步就成形。

当前 15 步——如果只跑 5~8 步,视频可能还不够精细,但音频可能已经够好(有环境音的频谱特征,但来不及生成 BGM 旋律)。

# 方案 A:直接减少步数
steps = 8  # 而非 15

# 方案 B:两阶段不同步数
# Stage 1: 8 步 → 提取 audio latent(有环境音,BGM 未成形)
# Stage 2: 继续跑到 15 步 → 提取 video latent(完整画质)
# 最终:video latent from 15步 + audio latent from 8步

代价:方案 B 需要在中间步截取 audio latent,要自定义节点。方案 A 最简单但会牺牲画质。

可行性矩阵

方案 改动量 保留环境音 去除BGM 需自定义节点 推荐
1. shift_audio↑ 改 1 个数字 ⚠️ 可能同时减弱 ⚠️ 不保证 ❌ 不需要 ⭐⭐⭐⭐ 先试
2. nested denoise_mask 写自定义节点 ✅ 可控 ✅ 可控 ✅ 需要 ⭐⭐⭐ 中期
3. 步数截断 改步数/写节点 ✅ 前5步就有 ⚠️ 不确定边界 方案B需要 ⭐⭐⭐ 可试
💡 建议立即行动:先用方案 1(shift_audio = 8/12/15)做 A/B 测试,零改动零风险

源码依据:comfy/ldm/minimax/model.py L527-531:audio sigma 由 time_shift_sigma(sigma_v, shift_v, shift_a) 从 video schedule 反推。
shift_a 越大 → t_a 越接近 1 → 音频 timestep 越高 → 去噪越少 → 音频越接近 TTS 条件(环境音+BGM都弱化)。