🔇 H3 视频生成禁用 BGM 调研报告

小江湖 EP01 · 2026-08-04 · 基于 H3 源码分析 + 已有 pitfall 实验数据

📐 问题本质

H3 是 AV(Audio-Visual)联合 DiT 模型。音频和视频在同一个 latent 中联合采样,不存在独立的"BGM 开关"。

音频流(target audio segment)始终被去噪生成——它同时包含:TTS 对白(由 ref_audio 条件约束)+ 环境音 + 模型自发生成的配乐。

DiT Packed Sequence 布局: [text tokens] → [keyframe] → [ref_image] → [ref_audio (TTS, 固定)] → [target AUDIO (去噪)] → [target VIDEO (去噪)] ↑ ↑ TTS 条件注入 环境音+BGM+对白 一起生成

🔍 当前 batch 脚本分析

当前 h3_batch_xiaojianghu_resume.py 的 prompt 写了:

"Strictly diegetic in-world sound, no scored music."

但这正是 Pitfall 1 的触发条件——"No music" 类负面描述会杀死所有音频(不只是 BGM),RMS 从 -18dB 暴跌到 -57dB。

📊 五种方案对比

方案 原理 可行性 风险 推荐度
A. Prompt 引导(正面描述) Prompt 中只描述想要的 diegetic 声音(脚步声、风声等),不提 music。靠模型理解。 中等 模型可能仍自发生成配乐(DiT 音频生成分支不完全受文本控制) ⭐⭐⭐
B. 音频后处理:频谱过滤 渲染完成后用 ffmpeg/demucs 分离人声+环境音 vs 配乐,去掉配乐频段。 可行 可能损伤对白/环境音质量;需要额外处理步骤 ⭐⭐⭐⭐
C. 丢弃 H3 音频,纯 TTS 替代 不使用 H3 生成的音频,直接用 P10 TTS 对白作为唯一音轨。 最简单 完全丢失环境音(脚步、风声、碰撞等氛围声) ⭐⭐⭐
D. 两遍渲染合成 第一遍正常渲染取视频,第二遍只取 TTS + 环境音段(利用 TTS 静默段提取环境音),再混音。 复杂 渲染时间 ×2;音频处理逻辑复杂 ⭐⭐
E. TTS + 人工环境音 H3 只出视频,音频完全后期:TTS 对白 + 预制环境音素材库混音。 可控 需要环境音素材库 + 混音管线;工作量最大 ⭐⭐⭐⭐⭐

🔬 各方案技术细节

方案 A:Prompt 正面引导(最小改动)

做法:修改 prompt,去掉所有负面描述,只写正面 diegetic 声音。

# ❌ 当前(触发 Pitfall 1)
"Strictly diegetic in-world sound, no scored music."

# ✅ 改为正面描述
"Footsteps on wooden floor, rustling leaves, wind howling, 
 wooden bowls clinking, distant crowd murmurs. 
 Natural ambient sound, cinematic foley."

效果预估:BGM 会减弱但不一定完全消除——H3 的 DiT 音频生成分支不完全受文本约束,模型在训练数据中见过大量配乐,可能自发放出旋律。

方案 B:Demucs 人声分离(推荐·渲染后处理)

原理:用 AI 音源分离模型(Demucs/Spleeter)把 H3 输出音频拆成人声+环境 vs 配乐,丢弃配乐轨。

# Demucs 4 分轨:drums / bass / other / vocals
pip install demucs

# 分离出 vocals(对白)+ 其他非音乐成分
demucs --two-stems vocals h3_audio.flac -o /tmp/separated

# 结果:
#   vocals.wav      → 对白(保留)
#   no_vocals.wav   → 环境音+BGM(需进一步判断)

问题:Demucs 的 "vocals" 只留人声,环境音(脚步、风声)会被分到 "no_vocals" 轨,跟 BGM 混在一起。

更精准方案:用 Demucs 4-stem 分出 other(通常含环境音)vs bass+drums(通常含配乐节奏),自定义混音。

方案 C:丢弃 H3 音频,纯 TTS(最简单)

做法:H3 渲染时仍生成音频(架构无法关闭),但最终输出只用 TTS 对白,丢弃 H3 音频。

# 批量脚本中,直接跳过 H3 音频的 mux
ffmpeg -y -i video.webm -i tts_dialogue.wav \
  -c:v libx264 -crf 20 -c:a aac -b:a 128k \
  -map 0:v:0 -map 1:a:0 \
  -shortest output.mp4

优点:零风险,对白干净清晰。

缺点:完全没有环境音,场景沉浸感降低。

方案 E:TTS + 人工环境音(最高质量)

做法:H3 只取视频流,音频完全后期制作:

  1. TTS 对白:来自 P10 voice 产物
  2. 环境音:从 freesound.org / 预制素材库按场景匹配(室内→回响、室外→风声、战斗→碰撞)
  3. 混音:ffmpeg amix 混合,对白 -3dB,环境音 -12dB
# 三轨混音示例
ffmpeg -y -i video.webm \
  -i tts_dialogue.wav \
  -i ambient_room_tone.wav \
  -filter_complex "[1:a]volume=-3dB[a1];[2:a]volume=-12dB[a2];[a1][a2]amix=inputs=2:duration=shortest[aout]" \
  -map 0:v:0 -map "[aout]" \
  -c:v copy -c:a aac -b:a 192k \
  output.mp4

优点:100% 可控,零 BGM,环境音按需定制。

缺点:需要环境音素材库 + 按分镜匹配的自动化逻辑。


⚠️ 已知限制:H3 架构层面无法禁用 BGM

从源码分析确认:

结论:模型层面无法精确控制"只禁 BGM 保留环境音"——必须在后期处理。

🎯 推荐方案

方案 C(纯 TTS)作为当前 baseline + 方案 A(正面 prompt)逐步优化

立即可做(改 1 行代码)

批量脚本 prompt 中把 "no scored music" 替换为正面描述:

# 替换为:
"Natural diegetic sounds: footsteps, 
 rustling fabric, wooden objects, 
 ambient room tone. Cinematic foley."

同时准备 纯 TTS fallback:如果 H3 音频仍有 BGM,直接用 TTS 替代。

中期方案(管线集成)

在 P12 合成阶段加一个 BGM 检测 + 剔除步骤:

  1. 用 Demucs 分离 H3 音频
  2. 检测 "other" 轨是否有明显旋律(FFT 峰值规律性)
  3. 有 BGM → 用 TTS + 环境音素材替代
  4. 无 BGM → 保留 H3 原始音频

📋 当前 9 个分镜音频频谱分析

各分镜频谱能量分布(Mid 频段占比高 = 人声为主,Low+High 均衡 = 有环境音):

分镜时长RMSLow(<200Hz)Mid(200-2kHz)Hi(>2kHz)判断
S1_a016.6s65.8dB3%74%23%对白主导
S1_a025.9s50.9dB11%57%32%有环境音
S1_a045.2s50.1dB0%57%42%偏尖锐
S1_a057.3s56.7dB17%57%25%有低频
S2_a015.2s68.6dB21%32%47%高频丰富⚠️
S2_a025.2s44.8dB4%48%48%偏安静
S2_a035.2s55.2dB3%53%44%对白主导
S2_a048.0s59.6dB23%31%46%低频丰富⚠️
S2_a055.2s57.9dB0%45%55%高频主导

⚠️ S2_a01 和 S2_a04 的低频+高频双高峰可能含有配乐成分,建议用 Demucs 验证。


数据来源:H3 ComfyUI 源码 (comfy/ldm/minimax/model.py, comfy_extras/nodes_minimax_h3.py) + 已有 pitfall 实验 (minimax-h3-audio-pitfalls, minimax-h3-audio-architecture skills) + 小江湖 EP01 9 分镜音频频谱分析 (2026-08-04)