Files
Popiai-skill/audio-creation/drama-soundtrack/SKILL.md
T

493 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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
```