OpenMontage 音乐技能实战:用 ACE-Step 1.5 生成视频 BGM、人声歌曲与分轨(Stem)
【免费下载链接】OpenMontageWorld's first open-source, agentic video production system. 12 production pipelines, 100+ tools, 700+ agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage
本文为 OpenMontage 音频技能体系中acestep技能(Agent Skill)的深度解读。该技能文档定义了基于开源模型 ACE-Step 1.5 的完整音乐生成工作流——覆盖纯器乐 BGM、带歌词的完整歌曲、参考曲翻唱/风格迁移与干声分轨,并给出了面向视频制作的场景预设、提示词工程方法与音画合成规范。读完本文,你可以直接在 OpenMontage 的 Agent 工作流中复现这些命令,理解其参数约束与工程边界,并弄清它与仓库中其他音乐生成工具(ComfyUI 本地推理、ElevenLabs API)的关系。
技能定位:Agent Skill 而非独立 CLI
.claude/skills/acestep/SKILL.md是一份标准的 Agent Skill 文件:YAML frontmatter 声明了name: acestep与触发条件(background music、soundtrack、jingle、stem extraction、cover、style transfer 等任务关键词),正文则是 Agent 执行音乐任务时遵循的操作手册。技能文档自述:
- 基于 MIT 许可的开源音乐生成模型 ACE-Step 1.5,通过
tools/music_gen.py封装; - 推理托管在 RunPod serverless 上,
.env中需要配置RUNPOD_API_KEY与RUNPOD_ACESTEP_ENDPOINT_ID两个环境变量,首次可通过--setup参数创建 RunPod 端点。
从仓库结构看,acestep在 skills/INDEX.md 的技能目录中被归入 Infrastructure(基础设施)类别,并在 AGENT_GUIDE.md 的音频技能清单中与music、sound-effects等并列,说明它服务于整条视频生产流水线的"配乐"环节,而不是孤立工具。
需要注意适用前提:技能文档中的命令入口tools/music_gen.py是技能定义指向的 CLI 形态(源自其上游视频工具包);以当前仓库实际存在的源码为准,可直接调用的 ACE-Step 推理入口是 ComfyUI 本地后端comfyui_music(详见文末"仓库中的 ACE-Step 证据链"一节),而music_gen工具名在仓库中对应的是 ElevenLabs API 版实现 tools/audio/music_gen.py。
快速参考:一条命令完成常见任务
技能文档给出的 Quick Reference 覆盖了全部八种典型用法,以下完整继承并按用途分组:
基础生成与音乐控制
# 基础生成 python tools/music_gen.py --prompt "Upbeat tech corporate" --duration 60 --output bg.mp3 # 带音乐参数控制(BPM / 调性) python tools/music_gen.py --prompt "Calm ambient piano" --duration 30 --bpm 72 --key "D Major" --output ambient.mp3场景预设(面向视频制作)
python tools/music_gen.py --preset corporate-bg --duration 60 --output bg.mp3 python tools/music_gen.py --preset tension --duration 20 --output problem.mp3 python tools/music_gen.py --preset cta --brand digital-samba --duration 15 --output cta.mp3人声与歌词
# 带歌词的 Jingle python tools/music_gen.py --prompt "Indie pop jingle" --lyrics "[verse]\nBuild it better\nShip it faster" --duration 30 --output jingle.mp3翻唱/风格迁移与分轨
# Cover / style transfer python tools/music_gen.py --cover --reference theme.mp3 --prompt "Jazz piano version" --duration 60 --output jazz_cover.mp3 # Stem extraction python tools/music_gen.py --extract vocals --input mixed.mp3 --output vocals.mp3 # 列出全部预设 python tools/music_gen.py --list-presets场景预设:为视频叙事节奏预置的音乐参数
技能内置了 8 个场景预设,每个预设锁定 BPM 与调性,直接对齐视频叙事段落的情绪曲线。完整预设表如下:
| Preset | BPM | Key | 适用场景 |
|---|---|---|---|
corporate-bg | 110 | C Major | 专业感背景音、演示类内容 |
upbeat-tech | 128 | G Major | 产品发布、技术演示 |
ambient | 72 | D Major | 概览页、反思性内容 |
dramatic | 90 | D Minor | 揭幕、重大宣告 |
tension | 85 | A Minor | 问题陈述、挑战桥段 |
hopeful | 120 | C Major | 方案揭晓、释然时刻 |
cta | 135 | E Major | 行动号召、收尾高能量段落 |
lofi | 85 | F Major | 屏幕录制、编码演示 |
预设本质上是"caption + BPM + Key"的打包,配合--duration即可让配乐与镜头时长严格对齐。
创建一首歌:三种实战路径
路径一:纯器乐背景音(最简单)
python tools/music_gen.py --prompt "Upbeat indie rock, driving drums, jangly guitar" --duration 60 --bpm 120 --key "G Major" --output track.mp3路径二:带人声与歌词的完整歌曲
技能推荐将长歌词先写入临时文件再用$(cat ...)注入,并用结构标签(structure tags)控制歌曲段落。完整示例:
# 先把歌词写入文件(长歌曲推荐做法) cat > /tmp/lyrics.txt << 'LYRICS' [Verse 1] Walking through the morning light Coffee in my hand feels right Another day to build and dream Nothing's ever what it seems [Chorus - anthemic] WE KEEP MOVING FORWARD Through the noise and doubt We keep moving forward That's what it's about [Verse 2] Screens are glowing late at night Shipping code until it's right The deadline's close but so are we Almost there, just wait and see [Chorus - bigger] WE KEEP MOVING FORWARD Through the noise and doubt We keep moving forward That's what it's about [Outro - fade] (Moving forward...) LYRICS # 生成歌曲 python tools/music_gen.py \ --prompt "Upbeat indie rock anthem, male vocal, driving drums, electric guitar, studio polish" \ --lyrics "$(cat /tmp/lyrics.txt)" \ --duration 60 \ --bpm 128 \ --key "G Major" \ --output my_song.mp3路径三:视频场景直接用预设
python tools/music_gen.py --preset tension --duration 20 --output problem_scene.mp3出好结果的关键技巧
技能文档总结的七条经验法则(直接继承,无删减):
- Caption = 整体风格(流派、乐器、情绪、制作质感)
- Lyrics = 时间结构(主歌/副歌走向、人声演绎方式)
- 歌词全大写= 高能量人声
- 括号= 和声/背景人声:"We rise (together)"
- 每行保持 6–10 个音节以获得自然节奏
- 不要在 caption 里描述旋律——描述的是"声音与感觉"
- 迭代调参时用
--seed锁定随机性,只改变 prompt/lyrics
任务类型:六种能力的边界
技能定义了 6 种任务类型,其中 3 种可用、3 种为规划中的能力:
| 任务 | 状态 | 说明 |
|---|---|---|
text2music | 默认 | 文本 prompt + 可选歌词生成音乐 |
cover | 可用 | 参考音频风格迁移,--cover-strength控制混合度 |
extract | 可用 | 干声/分轨分离 |
repaint | 规划中 | 在保留其余部分的前提下重生成音频的某时间段 |
lego | 规划中(需 base model) | 在既有音频上下文中生成单独乐器轨 |
complete | 规划中(需 base model) | 为不完整编曲补全指定乐器 |
cover 的强度参数--cover-strength取值 0.0–1.0:0.2是宽松的风格启发(创作自由度高);0.5均衡迁移;0.7贴近原曲结构(默认值);1.0最高保真度。
extract 支持的分轨共 10 种:vocals、drums、bass、guitar、piano、keyboard、strings、brass、woodwinds、other。
提示词工程:Caption 的分层写法
分层维度
技能主张用多维度叠加来写 caption,而不是单个形容词。可用的维度:
- 流派/风格:pop、rock、jazz、electronic、lo-fi、synthwave、orchestral
- 情绪:melancholic、euphoric、dreamy、nostalgic、intimate、tense
- 乐器:acoustic guitar、synth pads、808 drums、strings、brass、piano
- 音色(Timbre):warm、crisp、airy、punchy、lush、polished、raw
- 年代感:"80s synth-pop"、"modern indie"、"classical romantic"
- 制作方式:lo-fi、studio-polished、live recording、cinematic
- 人声:breathy、powerful、falsetto、raspy、spoken word(或 "instrumental")
对比示例(技能原文):
- 好:"Slow melancholic piano ballad with intimate female vocal, warm strings building to powerful chorus, studio-polished production"
- 差:"Sad song"
五条核心原则
- 具体胜于含糊——写出乐器、情绪、制作风格;
- 避免自相矛盾——不要同时要求 "classical strings" 和 "hardcore metal";
- 重复即强调——重要元素重复出现可提升优先级;
- 稀疏 caption = 更多创作自由——描述越细,模型越被约束;
- BPM/调性走元数据参数——不要写 "120 BPM" 进 caption,用
--bpm 120。
歌词排版语法
结构标签(写在歌词里,不写在 caption 里):
[Intro] / [Verse] / [Chorus] / [Bridge] / [Outro] [Instrumental] / [Guitar Solo] / [Build] / [Drop] / [Breakdown]人声控制前缀(修饰某行或某段):
[raspy vocal] / [whispered] / [falsetto] [powerful belting] / [harmonies] / [ad-lib]能量标记:全大写 = 高强度("WE RISE ABOVE");括号 = 背景人声("We rise (together)");段落内每行保持 6–10 音节。
完整示例——科技产品 Jingle:
[Verse] Build it better, ship it faster Every feature tells a story [Chorus - anthemic] THIS IS YOUR PLATFORM Your vision, your stage Digital Samba, every page [Outro - fade] (Build it better...)视频制作集成:配乐、混音与品牌一致性
按场景类型选曲
技能给出了与叙事段落一一对应的配乐方案表(完整继承):
| 场景 | 预设 | 时长 | 备注 |
|---|---|---|---|
| Title | dramatic或ambient | 3–5s | 短促、定调 |
| Problem | tension | 10–15s | 阴暗、不安 |
| Solution | hopeful | 10–15s | 释然、乐观 |
| Demo | lofi或corporate-bg | 30–120s | 不抢戏,时长匹配演示内容 |
| Stats | upbeat-tech | 8–12s | 建立可信度 |
| CTA | cta | 5–10s | 最高能量、干脆有力 |
| Credits | ambient | 5–10s | 轻柔收尾淡出 |
时长对齐工作流
- 先从配音脚本规划各场景时长;
- 用
--duration <场景秒数>生成匹配长度的音乐; - 技能声明生成时长精确(与请求值误差在 0.1s 内);
- 需要跨多个场景的连续 BGM 时,一次性生成长曲目。
与人声旁白混音
在 Remotion 合成中,背景音乐建议压到 10–20% 音量:
<Audio src={staticFile('voiceover.mp3')} volume={1} /> <Audio src={staticFile('bg-music.mp3')} volume={0.15} />规则:旁白之下用纯器乐预设(corporate-bg、ambient、lofi);音乐主导型场景(Title、CTA)可以提高音量甚至使用带人声版本。这一"器乐优先"的约束在仓库的 skills/creative/music-gen-usage.md 与 tools/audio/music_gen.py 中同样被强制(force_instrumental默认True),是整个项目音频技能的一致口径。
品牌一致性
--brand <name>:从brands/<name>/brand.json加载品牌音乐提示;--cover --reference brand_theme.mp3:以品牌主题曲为参考做变体,保持声音身份;- 跨项目统一音色:固定
--seed 42,只变动时长/prompt。
技术细节与禁用边界
技能声明的技术参数(完整继承):
- 输出格式:48kHz MP3/WAV/FLAC;
- 时长范围:10–600 秒;
- BPM 范围:30–300;
- 推理耗时:GPU 上 turbo 模式约 2–3s(8 步),Mac MPS 约 40–60s;
- Turbo 模型:8 步采样、无需 CFG,速度快且质量良好;
- Shift 参数:turbo 下推荐 3.0,可改善质量。
什么时候不要用 ACE-Step
技能明确划出的四条边界:
- 声音克隆——应使用 Qwen3-TTS 或 ElevenLabs;
- 音效(SFX)——应使用 ElevenLabs SFX;
- 语音/旁白——用 TTS 类工具,不要用音乐生成;
- 从视频直接分轨——先用 FFmpeg 抽出音轨,再走
--extract。
仓库中的 ACE-Step 证据链:本地 ComfyUI 推理路径
技能文档描述的是 RunPod 托管形态;而当前仓库源码中,ACE-Step 的"实体"落在 ComfyUI 本地推理路径上,可互为印证:
- 工具实现:tools/audio/comfyui_music.py 定义了
ComfyUIMusic工具(capability = "music_generation"、provider = "comfyui"、determinism = SEEDED,支持seed/lyrics/离线运行)。它默认加载内置工作流ace-step-1-t2a.json,并把输入参数逐节点注入:prompt → 节点2的tags,lyrics/lyrics_strength(默认 0.99)→ 节点2,duration_seconds→ 节点4的seconds,seed/steps(默认 50)/cfg(默认 5.0)→ 节点8,输出文件名 → 节点10。这与技能文档中"caption 描述风格、结构标签进歌词、seed 锁定随机性"的语义完全同构。 - 工作流模板:tools/_comfyui/workflows/ace-step-1-t2a.json 基于 ComfyUI 核心原生节点
TextEncodeAceStepAudio与EmptyAceStepLatentAudio构建,不需要第三方节点包;tools/_comfyui/metadata.py 声明了该工作流所需的检查点ace_step_v1_3.5b.safetensors及下载位置。 - 设计文档:docs/comfyui-adapter-plan.md 说明 ACE-Step 选择走 ComfyUI 的原因(diffusers 生态在部分新硬件上不可用),并明确该工具面向 ACE-Step v1;ACE-Step 1.5 可通过
workflow_json/workflow_path自定义工作流方式接入(自定义工作流必须提供output_node)。 - 契约测试:tests/contracts/test_comfyui_tools.py 验证了内置路径无需自定义工作流、缺模型时返回含下载 URL 的结构化错误、以及 prompt/lyrics/duration/seed 确实被正确 patch 进工作流等断言。
- 选型关系:
comfyui_music的fallback_tools声明为["suno_music", "music_gen"]——本地 ComfyUI 不可用时回退到其他音乐工具,说明 ACE-Step(本地/RunPod)与 ElevenLabs API 在工具选择器中是同一music_generation能力下的并列/互备 provider。
可以推断:技能文档面向"云端 RunPod 上的 ACE-Step 1.5",仓库源码面向"本地/自托管 ComfyUI 上的 ACE-Step v1 并可扩展 1.5",两者共享同一套 ACE-Step 提示词方法论(tags/lyrics/结构标签/seed),技能中沉淀的 caption 分层与歌词排版规则对两条路径都适用。
适用前提与限制小结
- 运行 ACE-Step 技能需要配置
RUNPOD_API_KEY与RUNPOD_ACESTEP_ENDPOINT_ID,首次可执行--setup创建端点(技能文档声明); - 参数硬边界:时长 10–600s、BPM 30–300、输出 48kHz;
repaint/lego/complete目前为规划能力,不可当作可用功能引用;- 音乐生成不覆盖声音克隆、音效与旁白——这些属于仓库内其他音频技能(TTS、SFX)的职责范围;
- 仓库当前实际代码路径以 ComfyUI 版
comfyui_music(ACE-Step v1 内置工作流)为准,技能文档中的tools/music_gen.pyCLI 参数集(预设、brand、extract、cover-strength)是该技能定义的能力面,引用时应以技能文档声明为前提。
【免费下载链接】OpenMontageWorld's first open-source, agentic video production system. 12 production pipelines, 100+ tools, 700+ agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考