基于火山引擎 GenSong:从创意到成品歌曲(歌词、音频、结构化标签),不含 MV 生成。 所有任务须从 P0_PRECHECK 开始,按阶段汇报进度;配置见 scripts/.env。
本 Skill 专注于歌曲生成链路,从一句模糊想法到「歌词 + 成品音频 + 结构化标签」,不涉及分镜与 MV 生成。
所有任务必须从
P0_PRECHECK开始执行。
整体阶段如下:
[P0_PRECHECK] 环节准备与检测
↓
[S1_INTENT] 结构化意图 & 场景
↓
[S2_LYRICS] 歌词生成 & 清洗
↓
[S3_PARAM_INFER] 演唱者/乐器/音色推断(宿主 Agent)
↓
[S4_GENSONG_SUBMIT] GenSong 任务提交
↓
[S5_GENSONG_POLL] GenSong 结果轮询 & 下载
↓
输出:song.mp3 + lyrics.txt + song_meta.json
执行过程中,宿主 Agent 需要实时向用户汇报当前阶段,例如:
在进入任何生成逻辑之前,必须先完成以下检查:
scripts/.env 文件必须存在且可读。.env 中建议配置:
VOLC_ACCESS_KEY_IDVOLC_ACCESS_KEY_SECRETVOLC_REGION(可选,默认 cn-beijing)VOLC_SERVICE(可选,默认 imagination)OUTPUT_ROOT(可选,用于统一输出根目录)python 3.10+ 与 uv;uv 在 scripts/pyproject.toml 所在目录安装,例如:
# 在 song-production/scripts 目录下
uv sync
uv run python scripts/main.py --mode submit ...
S1_INTENT。OUTPUT_ROOT(若配置)和一次任务的歌名或随机 ID,规划本次的 output_dir:
OUTPUT_ROOT:OUTPUT_ROOT/music_output/<歌曲名|6位随机数>/music_output/<歌曲名|6位随机数>/通过以上检查后,宿主 Agent 需向用户确认当前阶段已完成,例如:
当前阶段:P0_PRECHECK 已通过,开始进入 S1_INTENT(结构化意图)。
从用户的一句话或几句话中,提炼成适合火山 GenSong 调用的结构化音乐描述信息(角色、人设、情绪、场景、时长等)。
宿主 Agent 应构造一个结构化 JSON(示例):
{
"character": "猪八戒",
"emotion_theme": "打工人职场疲惫与想回家的念头",
"music_style": "流行 + 轻说唱",
"tempo_mood": "中速,主歌偏丧,副歌略带释怀和自嘲",
"duration_seconds": 70,
"scene": "下班地铁刷短视频",
"platform": "Douyin",
"notes": "强调高老庄、取经路与打工路的类比,把紧箍咒写成生活压力和 KPI。"
}
该结构将作为后续歌词创作与参数推断的统一输入。
S1_INTENT 的结构化信息,生成完整歌词与一个适合作为 GenSong Prompt 的音乐描述。lyrics.txt,便于后续 GenSong 或其它系统直接使用。可参考原 music-generate Skill 中的歌词创作模板,并做轻度泛化(不局限西游):
你是一位擅长用 IP / 历史人物 / 原创人设做情绪歌二创的短视频音乐创作者。
请以【{{character}}】为第一视角,创作一段**{{music_style}}**风格的中文歌词。
要求:
- 角色人设贴合其基础特质,但需加入「当代人情绪」:{{emotion_theme}}。
- 歌词可以融入该题材世界观的专属元素(如地点、道具、称呼等),用场景隐喻现实困境。
- 歌词结构建议包含主歌和副歌(可用
[Verse 1]、[Chorus]标注),字数控制在适合 {{duration_seconds}} 秒左右的短视频歌曲长度。- 语言口语化,适合短视频平台传播,但要保证有 2–3 句具有共鸣感的金句。
- 请先给出一句简短的歌名,然后给出一段简短的「音乐描述 prompt」(供音乐模型使用),最后输出完整歌词。
歌名:《{{title}}》
音乐描述 Prompt:
{{enhanced_prompt}}
歌词:
{{lyrics}}
其中:
enhanced_prompt:结合人物设定、情绪、风格与关键意象的中/英混合描述。lyrics:包含 [Verse] / [Chorus] 等标签的完整歌词。宿主 Agent 应在生成歌词后进行简单清洗:
[Verse 1]、[Chorus] 等段落标签,可根据需要选择保留或去掉;output_dir/lyrics.txt本阶段完全由宿主 Agent 实现,脚本不内置规则。
S1_INTENT 输出的结构化信息;S2_LYRICS 生成的歌词文本。宿主 Agent 应参考 reference/performance_inference_rules.md,推断:
vocal_gender:如 Male / Female;vocal_persona:如「沧桑中年男声」「少年感男声」「治愈系女声」等。emotion_theme / tempo_mood 进一步映射为 Mood。Instrument 可选值。Scene、Lang、Duration 等补充参数。最终输出写入:
output_dir/song_meta.jsonsong_meta.json 字段设计 & GenSong 参数映射字段均为「宿主 Agent 可读/可写」的中间层,调用脚本时再映射到 GenSong 的正式参数。
推荐字段(带约束)如下:
{
"character": "猪八戒",
"emotion_theme": "打工人职场疲惫与想回家的念头",
"music_style": "流行 + 轻说唱",
"duration_seconds": 70,
"model_version": "v4.3",
"genre": "Chinese Pop,Chinese Ballad Pop",
"mood": "Sorrow/Sad,Sentimental/Melancholic/Lonely",
"vocal_gender": "Male",
"timbre": "Husky,Deep,Gentle",
"instrument": "Acoustic_Guitar,Drums,Strings",
"scene": "Vlog/DailyLife",
"lang": "Chinese",
"vod_format": "wav",
"skip_copy_check": false
}
其中与 GenSong GenSongV4 请求体的对应关系为:
model_version → ModelVersiongenre → Genremood → Moodvocal_gender → Gendertimbre → Timbreduration_seconds → Durationinstrument → Instrumentscene → Scenelang → Langvod_format → VodFormatskip_copy_check → SkipCopyCheck取值与约束(强烈建议宿主 Agent 严格遵守):
genre)
reference/歌曲生成参数信息.md 中的「Genre / GenreExtra 可选值」。, 分隔,如:"Chinese Pop,Chinese Ballad Pop"。mood)
, 分隔,如:"Sorrow/Sad,Sentimental/Melancholic/Lonely"。vocal_gender)
"Male" / "Female"。timbre)
, 分隔,如:"Husky,Deep,Gentle"。instrument)
, 分隔,如:"Acoustic_Guitar,Drums,Strings"。scene)
"Vlog/DailyLife"、"Commute" 等。lang)
"Chinese" / "English"。duration_seconds)
vod_format)
"wav" / "mp3"。skip_copy_check)
false 表示开启版权检测(推荐默认);true 表示关闭。宿主 Agent 在做推断时,可以先在更自由的语义空间中思考,最终落地到 song_meta.json 时必须规整到上述枚举与约束范围内。
本阶段由脚本 scripts/main.py 负责,宿主 Agent 通过 CLI 调用。
在 Skill 根目录(song-production)下执行:
uv run python scripts/main.py \
--mode submit \
--lyrics-file /absolute/path/to/output_dir/lyrics.txt \
--genre "{{song_meta.genre}}" \
--mood "{{song_meta.mood}}" \
--gender "{{song_meta.vocal_gender}}" \
--timbre "{{song_meta.timbre}}" \
--duration {{song_meta.duration_seconds}} \
--model-version {{song_meta.model_version}} \
{{ song_meta.skip_copy_check ? "--skip-copy-check" : "" }}
song_meta.json(由 S3_PARAM_INFER 生成,字段设计见上一节)。scripts/main.py 会从 scripts/.env 读取 VOLC_ACCESS_KEY_ID 等配置。由 .env 提供(详见 P0_PRECHECK):
VOLC_ACCESS_KEY_ID / VOLC_ACCESS_KEY_SECRETVOLC_REGION(可选)VOLC_SERVICE(可选)TaskID=xxx 字样,宿主 Agent 需解析并持久化:
output_dir/song_task.json 中建议记录:{
"task_id": "202408308513817850019840",
"created_at": "2026-03-11T12:00:00+08:00"
}
uv run python scripts/main.py \
--mode poll \
--task-id YOUR_TASK_ID \
--max-attempts 120 \
--interval 5
脚本内部会调用 DescribeSongJob 等接口,返回结果格式可参考:
reference/歌曲结果查询任务结果.md示例返回:
{
"Result": {
"TaskID": "202408308513817850019840",
"Status": 2,
"Progress": 100,
"SongDetail": {
"AudioUrl": "https://..."
}
}
}
AudioUrl 下载歌曲音频到:
output_dir/song.mp3mv-production 中的 download_audio.py)或宿主环境能力。在轮询过程中,宿主 Agent 需定期向用户报告:
成功后,需明确告知:
output_dir 路径;mv-production Skill 继续生成 MV。reference/歌曲生成参数信息.md:GenSong 主要参数说明与可选值。reference/歌曲结果查询任务结果.md:DescribeSongJob/查询结果示例。reference/performance_inference_rules.md:演唱者 / 乐器 / 音色推断规则(宿主 Agent 实现)。