H3 的 target audio 流在采样过程中每一步都被去噪生成(audio_update = True)。生成的音频包含三样东西:
ref_audio 条件约束,但不是硬替换——DiT 联合生成时会"重新演绎")这三者在同一个 latent 中联合生成,文本 prompt 无法精确控制"要环境音但不要 BGM"。
原理:shift_audio 控制音频流的 sigma schedule。它决定音频在每一步采样中被去噪的"强度"。
shift_audio = 3.0(当前默认):音频正常去噪,完整生成环境音+BGMshift_audio ↓(如 1.0):音频在更早的时间步就开始去噪 → 更强的生成 → 可能更多 BGMshift_audio ↑(如 8.0~15.0):音频去噪被推迟 → 更接近 TTS 条件 → 环境音和BGM都减弱,但对白更干净# 当前:
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 测试。
原理:利用 ComfyUI 的 denoise_mask(NestedTensor 支持 video/audio 独立 mask)。
latent_image,设 denoise_mask = NestedTensor(video_mask=0, audio_mask=1),denoise=部分 → 只对 audio 做少量去噪步骤本质上是视频锁死、音频重采样几步,用更少的步数让音频只有粗略的环境音轮廓而不生成精细的 BGM 旋律。
问题:需要自定义 ComfyUI 节点构造 nested denoise_mask。工作量中等。
原理: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需要 | ⭐⭐⭐ 可试 |
源码依据: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都弱化)。