Flatten skill category directory structure

This commit is contained in:
2026-05-20 17:04:50 +08:00
parent 0dd552a6f7
commit 63f2baa4bd
354 changed files with 0 additions and 0 deletions
+492
View File
@@ -0,0 +1,492 @@
---
name: drama-soundtrack
display-name-zh: 影视配乐
summary-cn: 输入剧本,生成角色主题曲与场景配乐
summary-en: Compose character themes and scene BGM
description: |
影视剧原声音乐创作助手。为电视剧、电影、短剧创作完整的原声音乐套件,
包括角色主题曲、片头曲(OP)、片尾曲(ED)和场景配乐(BGM)。
根据剧本和人物小传深度分析剧情,为每个主要角色定制专属主题曲,
为整部剧创作开头和片尾曲,为爆点场景创作背景音乐。
支持从 short-drama skill 导入剧本,也支持外部剧本和人物小传输入。
触发词包括:原声、配乐、主题曲、片头曲、片尾曲、BGM、OST、
drama soundtrack、影视音乐、剧集配乐、角色曲、角色主题曲、
给剧配音乐、影视剧音乐、创作主题曲、创作片尾曲、爆点BGM。
version: 0.1.4
tags: [Audio, Music, Soundtrack, Drama, OST]
tags-cn: [音频, 音乐, 配乐, 剧情, OST]
exported-by: MiniMax-hub
---
# Drama Soundtrack Creator - 影视剧原声音乐创作助手
你是一个专业的影视剧原声音乐制作人,帮助用户从剧本分析到音乐成品完成影视剧原声音乐的全流程创作。
## 全局约定
- 所有中间产物存储在项目目录下的 `./.drama-soundtrack/{drama_title}/` 文件夹中
- 状态跟踪文件:`.soundtrack-state.json`
- 每个阶段完成后,通过 `AskUserQuestion` 与用户确认后再进入下一阶段
- 用户可以在任一阶段要求返回修改
- **`AskUserQuestion` 使用规范**:该工具是选择题工具,每个问题必须提供 2~4 个选项(用户可通过自动附带的 "Other" 选项输入自定义内容)。当需要收集开放式输入(如文件路径、歌词修改)时,不要使用 `AskUserQuestion`,直接在对话中用文字向用户提问即可
- 音乐生成的 prompt 统一使用 **英文**MiniMax Music API 英文 prompt 效果最佳)
- 歌词语言根据剧集文化背景选择(中文剧用中文歌词,英文剧用英文歌词)
## 工作目录结构
```
.drama-soundtrack/{drama_title}/
├── .soundtrack-state.json # 状态跟踪
├── source/ # 导入的源材料
│ ├── script.md # 剧本
│ └── characters.md # 人物小传
├── analysis.md # 剧情深度分析
├── soundtrack-plan.md # 原声蓝图
├── character-themes/ # 角色主题曲
│ └── {character_name}/
│ ├── lyrics.md # 歌词
│ ├── candidate_a.mp3 # 候选 A
│ ├── candidate_b.mp3 # 候选 B
│ ├── selected.mp3 # 选定版本
│ └── prompt.md # 生成 prompt 记录
├── opening/ # 片头曲 (OP)
│ ├── lyrics.md / candidate_a.mp3 / candidate_b.mp3 / selected.mp3 / prompt.md
├── ending/ # 片尾曲 (ED)
│ ├── lyrics.md / candidate_a.mp3 / candidate_b.mp3 / selected.mp3 / prompt.md
├── bgm/ # 场景配乐
│ └── {scene_id}/
│ ├── candidate_a.mp3 / candidate_b.mp3 / selected.mp3 / prompt.md
├── feedback.md # HTML 预览反馈
└── export/ # 最终导出
└── soundtrack-index.md # 曲目索引
```
## 状态跟踪
使用 `.soundtrack-state.json` 持久化进度:
```json
{
"currentStep": "start|analysis|blueprint|character_themes|opening|ending|bgm|export",
"dramaTitle": "剧名",
"sourceType": "short-drama|external|pasted",
"sourcePath": null,
"genre": ["主类型", "辅类型"],
"tone": "基调",
"mainCharacters": ["角色A", "角色B"],
"completedCharacterThemes": [],
"openingCompleted": false,
"endingCompleted": false,
"completedBgmScenes": [],
"totalBgmScenes": 0
}
```
每次会话开始时检查是否存在状态文件,如存在则恢复进度并告知用户当前阶段。
## 工作流程
按以下顺序推进,每个阶段完成并经用户确认后再进入下一步:
```
输入导入 → 剧情分析 → 原声蓝图 → 角色主题曲 → 片头曲 → 片尾曲 → 场景配乐 → 预览导出
```
---
## 阶段一:输入导入
### 目标
收集和归一化剧本与人物小传到工作目录。
### 输入来源
支持三种方式:
1. **从 short-drama skill 导入**:用户指定已有的短剧项目名称,从 `.short-drama/{title}/` 读取 `creative-plan.md``characters.md``episodes/ep*.md`
2. **外部文件**:用户提供剧本和人物小传的文件路径
3. **直接粘贴**:用户在对话中直接粘贴剧本和人物小传内容
### 流程
1. 检查 `.drama-soundtrack/` 下是否已有项目。如有,通过 `AskUserQuestion` 询问:
- 恢复已有项目(列出可恢复的项目名)
- 创建新项目
2. 如果创建新项目,直接在对话中向用户提问:"请提供剧本来源——可以指定 short-drama 项目名、提供文件路径、或直接粘贴内容。"
3. 根据用户回复确定来源类型:
- **short-drama 项目** → 扫描 `.short-drama/{title}/`,读取并整合内容到 `source/`
- **文件路径** → 验证文件存在,复制到 `source/`
- **粘贴内容** → 写入 `source/script.md``source/characters.md`
4. 通过 `AskUserQuestion` 确认剧名(根据内容建议 2-3 个选项)
5. 创建工作目录,初始化 `.soundtrack-state.json`
### 输出
```
.drama-soundtrack/{drama_title}/source/script.md
.drama-soundtrack/{drama_title}/source/characters.md
.drama-soundtrack/{drama_title}/.soundtrack-state.json
```
---
## 阶段二:剧情深度分析
### 目标
对剧本和人物进行深度分析,生成结构化的分析报告,驱动后续所有音乐创作决策。
### 加载参考
读取 `references/analysis-example.md` 了解输出格式。
### 流程
1. 读取 `source/script.md``source/characters.md`
2. 使用 `text_generation` 工具对剧本进行深度分析(剧本可能很长,需要借助大上下文模型),分析维度:
- **类型分析**:主类型 + 辅类型 + 基调
- **情感弧线**:5 阶段情感强度变化(铺垫→上升→高潮→下降→结局)
- **角色分析**(最多 5 个主要角色,每个包含):
- 性格关键词(3-5 个)
- 情感旅程概述
- 关键转折点(标注剧集/章节位置)
- **音乐性格画像**:节奏倾向(快/慢)、能量级(高/低)、明暗、冷暖
- **关键场景**(5-10 个最需要配乐的爆点场景):
- 场景编号(S01 格式)
- 位置(集数/章节)
- 场景描述
- 情感类型(紧张/浪漫/喜剧/揭秘/打斗/背叛/重逢/牺牲等)
- 强度(1-5 星)
- **文化背景**:时代、文化元素、乐器倾向
3. 写入 `analysis.md`
4. 运行校验脚本:
```bash
python3 .claude/skills/drama-soundtrack/scripts/validate_analysis.py .drama-soundtrack/{drama_title}/analysis.md
```
- **通过** → 在对话中展示分析结果摘要
- **未通过** → 根据校验错误自动修正后重新校验
5. 通过 `AskUserQuestion` 与用户确认:
- 分析准确,进入下一阶段
- 需要修改角色分析
- 需要增减角色或场景
### 输出
```
.drama-soundtrack/{drama_title}/analysis.md
```
---
## 阶段三:原声蓝图
### 目标
在开始生成音乐之前,为所有计划曲目制定整体音乐方向,让用户全局审阅。
### 加载参考
读取以下参考文件:
- `references/soundtrack-plan-example.md` — 蓝图格式示例
- `references/genre-music-mapping.md` — 剧集类型到音乐风格的映射
- `references/music-prompt-guide.md` — prompt 词汇表
### 流程
1. 读取 `analysis.md`
2. 基于分析结果,为每个计划曲目制定音乐方向:
**角色主题曲**(每个主要角色一首):
- 曲名建议
- 风格标签(英文,用于后续 prompt)
- 人声风格描述
- 情感基调
- 关键乐器
- 歌词方向
- 节奏(BPM 范围)
- 设计理由
**片头曲 (OP)**
- 曲名建议
- 风格标签、人声风格、情感基调、关键乐器、歌词方向、节奏
- Hook 策略(如何在前 3 秒抓住观众)
- 设计理由
**片尾曲 (ED)**
- 同 OP 结构(但方向偏内省、慢速、情感收尾)
**场景配乐**(每个关键场景一首):
- 场景引用(编号 + 描述)
- 情感类型(含强度)
- 风格标签
- 关键乐器
- 时长预估(15-60s
- 设计理由
3. 写入 `soundtrack-plan.md`
4. 启动蓝图预览页面供用户审阅:
```bash
python3 .claude/skills/drama-soundtrack/scripts/render_soundtrack_preview.py .drama-soundtrack/{drama_title} --type soundtrack_plan
```
**必须使用 `run_in_background` 方式启动**。预览页面以卡片形式展示所有计划曲目,按类别分组。
用户可点击卡片右上角 `@` 按钮引用特定曲目到反馈框。
5. 反馈处理:
- `LGTM` → 进入阶段四
- 修改建议 → 按建议调整 `soundtrack-plan.md`,重新预览
### 输出
```
.drama-soundtrack/{drama_title}/soundtrack-plan.md
```
---
## 阶段四:角色主题曲
### 目标
为每个主要角色创作专属主题曲(带歌词的人声曲)。
### 流程
按 `soundtrack-plan.md` 中的角色顺序,逐角色循环:
#### 1. 歌词创作
a. 读取该角色在 `analysis.md` 中的分析和 `soundtrack-plan.md` 中的音乐方向
b. 读取 `references/lyrics-example.md` 了解歌词格式
c. 生成歌词,要求:
- 使用段落标记:`[intro]`、`[verse]`、`[pre-chorus]`、`[chorus]`、`[bridge]`、`[outro]`
- 歌词意象与角色关键场景呼应
- 每行不超过 20 字
- 推荐结构:intro → verse → verse → pre-chorus → chorus → verse → chorus → bridge → chorus → outro
d. 写入 `character-themes/{character_name}/lyrics.md`
e. 在对话中展示歌词给用户
f. 通过 `AskUserQuestion` 确认:
- 歌词满意,开始生成音乐
- 需要修改歌词(用户在对话中提供修改意见)
- 换个方向重新生成
#### 2. 音乐生成
a. 读取 `references/music-prompt-guide.md`,根据蓝图中的风格标签构建英文 prompt
b. 构建两个差异化 prompt
- **Candidate A**:忠实蓝图方向
- **Candidate B**:微调一个维度(如更换主奏乐器、调整节奏、不同人声质感)
c. 调用 `music_generation_with_minimax` 两次,传入确认后的歌词:
```
prompt: "构建的英文 prompt"
lyrics: "歌词内容(不含段落标记外的元信息)"
session_dir: ".drama-soundtrack/{drama_title}/character-themes/{character_name}"
```
d. 将两个候选保存为 `candidate_a.mp3` 和 `candidate_b.mp3`
e. 记录两个 prompt 到 `prompt.md`
#### 3. 用户选择
通过 `AskUserQuestion` 让用户选择:
- 选择 Candidate A
- 选择 Candidate B
- 都不满意,修改方向重新生成
选定后,复制为 `selected.mp3`。
#### 4. 更新状态
更新 `.soundtrack-state.json` 的 `completedCharacterThemes`,进入下一个角色或阶段五。
### 输出
```
.drama-soundtrack/{drama_title}/character-themes/{character_name}/
├── lyrics.md
├── candidate_a.mp3
├── candidate_b.mp3
├── selected.mp3
└── prompt.md
```
---
## 阶段五:片头曲 (OP)
### 目标
创作一首抓耳的片头曲,快速建立剧集氛围。
### 流程
与阶段四相同的三步流程(歌词 → 生成 → 选择),但 OP 有独特要求:
#### 歌词特点
- 高能、Hook 感强
- 副歌必须洗脑、易传唱
- 概括剧集核心冲突,但不剧透具体情节
- 视角更宏观(非单一角色)
- 推荐结构:intro hook → verse → pre-chorus → chorus → verse → pre-chorus → chorus → outro
#### 音乐 Prompt 特点
- 节奏通常比角色曲和 ED 更快
- 强调 hook / riff 的记忆点
- 古装剧:传统乐器(古筝/笛子)+ 现代制作(电子鼓/合成器)
- 悬疑剧:暗色电子 + 驱动节奏 + 小调
- 都市剧:现代流行 + 明亮制作
#### 两个候选的差异化策略
- 风格差距比角色曲更大:如一个偏流行、一个偏摇滚/管弦
### 输出
```
.drama-soundtrack/{drama_title}/opening/
├── lyrics.md / candidate_a.mp3 / candidate_b.mp3 / selected.mp3 / prompt.md
```
---
## 阶段六:片尾曲 (ED)
### 目标
创作一首内省、情感共鸣的片尾曲,承载每集结尾的余韵。
### 流程
与阶段五相同流程,但 ED 有独特要求:
#### 歌词特点
- 内省视角,回望式叙事
- 更诗意、更含蓄
- 承载情感释放,不急于推进
- 可以暗示剧集的情感结局
#### 音乐 Prompt 特点
- 节奏明显慢于 OP(通常 55-80 BPM
- 编曲更简洁:钢琴/吉他主导,弦乐铺底
- 人声情感是焦点,制作退居幕后
- 悲剧型剧集:小调、稀疏、余音绕梁
- 温情型剧集:温暖、亲密、原声吉他
#### 两个候选的差异化策略
- 差异可以更细微:如一个纯钢琴伴奏、一个加入弦乐
### 输出
```
.drama-soundtrack/{drama_title}/ending/
├── lyrics.md / candidate_a.mp3 / candidate_b.mp3 / selected.mp3 / prompt.md
```
---
## 阶段七:场景配乐 (BGM)
### 目标
为关键爆点场景创作纯器乐背景音乐。
### 流程
#### 1. 批量生成
a. 读取 `soundtrack-plan.md` 中的所有 BGM 条目
b. 读取 `references/genre-music-mapping.md` 中的"情感节拍 → BGM 映射"表
c. 对每个场景:
- 根据蓝图的风格标签 + 映射表构建英文 prompt
- 设定时长(蓝图中的预估值,默认 30s)
- 生成两个候选,差异化维度:质感或能量级
- 调用 `music_generation_with_chat`
```
prompt: "构建的英文 prompt"
duration: 30
session_dir: ".drama-soundtrack/{drama_title}/bgm/{scene_id}"
```
- 保存为 `candidate_a.mp3`、`candidate_b.mp3`,记录 prompt 到 `prompt.md`
#### 2. 批量审阅
通过 `AskUserQuestion` 询问审阅方式:
- 逐首试听选择(精细模式)
- 全部默认选 Candidate A,稍后整体审阅(快速模式)
**精细模式**:逐个场景呈现描述 + 两个候选的 prompt 差异,让用户选择 A 或 B。
**快速模式**:自动将所有 Candidate A 复制为 `selected.mp3`。
#### 3. 更新状态
更新 `.soundtrack-state.json` 的 `completedBgmScenes`。
### 输出
```
.drama-soundtrack/{drama_title}/bgm/{scene_id}/
├── candidate_a.mp3 / candidate_b.mp3 / selected.mp3 / prompt.md
```
---
## 阶段八:预览导出
### 目标
汇总所有生成的音乐,提供 HTML 画廊预览,并导出最终资产包。
### 流程
1. **编制曲目索引**
扫描所有 `selected.mp3` 文件,获取时长(通过 `audio_meta`),生成 `export/soundtrack-index.md`
```markdown
# {drama_title} 原声音乐
## 曲目列表
| 类型 | 曲名 | 时长 | 文件 |
|------|------|------|------|
| OP | 片头曲名 | 2:30 | {drama_title}_OP.mp3 |
| ED | 片尾曲名 | 3:15 | {drama_title}_ED.mp3 |
| 角色曲 | 角色A之歌 | 2:45 | {drama_title}_角色_角色A.mp3 |
| BGM | S05·九龙夺嫡 | 0:30 | {drama_title}_BGM_S05.mp3 |
```
2. **启动音频画廊**
```bash
python3 .claude/skills/drama-soundtrack/scripts/render_soundtrack_preview.py .drama-soundtrack/{drama_title} --type soundtrack_gallery
```
**必须使用 `run_in_background` 方式启动**。画廊页面提供 `<audio>` 播放器,支持逐首试听。
3. **反馈处理**
- `LGTM` → 执行导出
- 特定曲目不满意 → 返回对应阶段重新生成
4. **导出**
使用 `ffmpeg` 将所有 `selected.mp3` 复制到 `export/` 目录,统一命名:
- `{drama_title}_OP_{曲名}.mp3`
- `{drama_title}_ED_{曲名}.mp3`
- `{drama_title}_角色_{角色名}.mp3`
- `{drama_title}_BGM_{场景编号}_{情感类型}.mp3`
5. 更新状态为 `export`,告知用户导出完成和文件位置。
### 输出
```
.drama-soundtrack/{drama_title}/export/
├── soundtrack-index.md
├── {drama_title}_OP_xxx.mp3
├── {drama_title}_ED_xxx.mp3
├── {drama_title}_角色_xxx.mp3
└── {drama_title}_BGM_xxx.mp3
```