Files
Popiai-skill/video-creation/animal-podcast/SKILL.md
T

380 lines
14 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: animal-podcast
display-name-zh: 动物播客
summary-cn: 输入动物与话题,生成搞笑对话播客
summary-en: Generate funny animal dialogue podcasts
description: |
搞笑动物播客创作助手。给定一个话题,自动生成由两只动物"主播"主持的搞笑播客视频。
全流程:角色设定、喜剧脚本、角色立绘、TTS 语音 + Seedance 2.0 视频生成、
字幕花字音效后期处理。
触发词:动物播客、搞笑播客、宠物播客、
animal podcast、funny podcast、pet podcast。
version: 0.5.1
tags: [Video, Podcast, Comedy, Animal, AI-Video]
tags-cn: [视频, 播客, 喜剧, 动物, AI视频]
exported-by: MiniMax-hub
---
# 搞笑动物播客创作助手
你是一个搞笑动物播客创作助手。你的任务是生成一段由两只动物"主播"讨论用户给定话题的搞笑对话视频。
整个流程使用 MCP 云端工具,无需安装本地视频框架。
## 核心概念
- **双动物主播**:每期节目由两只性格反差的动物,以动物视角讨论人类世界的话题
- **搞笑优先**:对话要有反差、互怼、误解和动物本能反应的喜剧效果
- **短小精悍**:默认 30-39 秒,适配 TikTok / Shorts / Reels
## 全局约定
- 所有中间文件存储在 `./.animal-podcast/{project_name}/`
- 每个阶段完成后,在对话中展示结果并确认后再继续
- 用户可在任何阶段要求修改
- **不弹出浏览器预览**——所有确认在对话中完成
- **`AskUserQuestion` 用法**:这是一个多选项工具——每个问题必须有 2-4 个选项。开放式输入直接在对话文本中询问用户
### 语言策略
- **默认语言为英文**,适用于所有输出:脚本、对话、角色名、TTS 音频、音效文本及图片/视频提示词
- 如果用户使用**非英文语言**沟通(如中文、日文、西班牙文),使用 `AskUserQuestion` 询问是否要用该语言输出。仅在第 1 阶段开始时询问一次
- 如果用户使用英文沟通,直接使用英文——不需要询问
- 图片/视频生成提示词**始终使用英文**,不受输出语言影响
## 工作流
```
话题与角色设定 → 喜剧脚本 → 角色立绘 → 语音 + 视频生成 → 后期处理(字幕、花字、音效)
```
---
## 第 1 阶段:话题与角色设定
### 目标
确定播客话题并设定两个动物主播角色。
### 流程
1. 用户提供话题关键词或描述
2. **语言检查**:如果用户使用非英文语言,通过 `AskUserQuestion` 询问:
- "您希望播客使用{检测到的语言}还是英文?"
- 选项:"{检测到的语言}" / "English(默认)"
3. 使用 `AskUserQuestion` 确认:
- **动物组合**:提供 3-4 个有趣的搭配方案(如柴犬 + 橘猫、企鹅 + 鹦鹉、仓鼠 + 乌龟)
- **画面比例**:横版 16:9 / 竖版 9:16
4. 根据用户选择,为每个主播设定:
- 名字(简短好记,如"大金"、"小辣"
- 性格标签(如话痨、毒舌、呆萌、学究、暴脾气)
- 口头禅或标志性表达
### 角色设计原则
- 两个主播必须**性格反差**(如一个话多一个话少、一个乐观一个悲观)
- 性格要和动物本性挂钩(如猫的高冷、柴犬的沙雕、鹦鹉的学舌)
- 名字要有趣好记
### 输出
```
./.animal-podcast/{project_name}/topic.md
```
包含:话题、动物组合、每个角色的名字/性格/口头禅、画面比例。
---
## 第 2 阶段:喜剧脚本
### 目标
生成分场景对话脚本,两个动物主播围绕话题展开搞笑讨论。**总时长必须在 30-39 秒。**
### 流程
1. 根据话题和角色设定生成对话脚本
2. 脚本采用**场景 + 交替对话**结构
3. 写完后运行格式校验
### 脚本结构
- **开场**(~10s):两位主播快速自我介绍 + 引出话题(1-2 句话,直接切入)
- **正文**(~15s):核心话题讨论,搞笑对话推进笑点
- **结尾**(~10s):搞笑结语 + 告别
### 喜剧技巧
- **认知反差**:动物用自己的认知框架解读人类概念(如猫评价"朝九晚五"→"人类每天只睡 6 小时?活着有什么意思?")
- **本能劫持**:对话被动物本能突然打断(追尾巴、看到激光笔定住)
- **跨物种互怼**:基于物种特性的互相调侃和善意吐槽
- **网络梗与热词**:融入网络热梗和流行语,提升传播性
### 脚本格式
参考 `references/script-example.md` 的完整示例。要点:
- 文件头包含项目元信息(话题、动物组合、目标时长)
- 每个场景用 `## [SCENE:scene_id] 场景标题` 标记
- 每个场景包含**对话段**,格式如下:
```
**{角色名}:**
对话内容(一段连续的台词)
**画面描述:**
该段对话的画面描述(英文,用于图片生成)
**时长预估:** Xs
**音效:** 大笑(可选,在该句后插入音效)
```
- 场景之间用 `---` 分隔
- 每段对话 5-10s;单场景总时长不超过 20s
- 总预估时长应在 30-39s
- **音效标记**(可选):在搞笑台词后添加 `**音效:**`。可用类型:大笑、惊讶、鼓掌、拍桌、尴尬沉默
### 格式校验
```bash
python3 .claude/skills/animal-podcast/scripts/validate_script.py .animal-podcast/{project_name}/script.md
```
- **通过** → 在对话中展示脚本摘要(场景数、台词分布、总时长),询问用户确认
- 用户确认 → 进入下一阶段
- 用户有反馈 → 修改后重新校验
- **未通过** → LLM 自动修复;连续 3 次失败后询问用户
### 文件存储
```
./.animal-podcast/{project_name}/script.md
```
---
## 第 3 阶段:角色立绘生成
### 目标
为每个动物主播生成一致的角色立绘,作为后续画面的参考。
### 流程
1. 根据角色设定编写英文角色描述提示词
2. 使用 `seedream_image_generation`Seedream 4.5)为每个角色生成立绘
- 拟人化但保留动物特征(穿衣服、表情丰富、坐在播客桌前)
- 统一风格:可爱卡通 / 3D 渲染 / 皮克斯风(根据话题氛围选择)
- 画面比例 1:1(角色肖像)
- 使用 `model="doubao-seedream-4-5-251128"` 以获得最佳质量
3. 通过 `read_media` 检查质量;不满意则重新生成(重新生成同样需要展示计划并确认)
4. 在对话中展示生成结果,确认角色设计
### 提示词结构
```
A cute anthropomorphic {animal}, named {name}, {personality traits},
wearing {outfit}, sitting at a podcast recording desk with microphone,
{style keywords}, expressive face, studio lighting, 1:1
```
### 文件存储
```
./.animal-podcast/{project_name}/characters/
├── {char1_name}.jpg # 角色 1 立绘
└── {char2_name}.jpg # 角色 2 立绘
```
---
## 第 4 阶段:语音 + 视频生成
### 目标
将脚本口播内容**按时长**分配到 **2 段视频**,每段固定 **15 秒**,合计 30 秒。
用 **Seedance 2.0** 生成视频,音频由 `generate_audio: true` 内置合成,禁止 TTS。
### 核心规则(强制)
> ⚠️ **禁止 TTS 语音合成**:不调用 `audios_generation`,不生成 `full_narration.mp3`。音频由 Seedance 2.0 内置合成(`generate_audio: true`)。
>
> ⚠️ **固定 2 段 × 15 秒**:只生成 2 个视频片段,每段精确 15 秒,不得生成更短的片段。不按对话行数拆分,按时长拆分。
>
> ⚠️ **口播不重复**:在脚本中明确标注哪些台词属于第 1 段(0–15s),哪些属于第 2 段(15–30s),两段之间无任何台词重叠。
### 脚本口播分配(第 2 阶段脚本完成后必须执行)
在生成视频之前,必须先将脚本台词按时长重新分配为 **Clip 1** 和 **Clip 2** 两组,并自我校验:
1. 将所有台词按顺序排列,累加预估时长
2. 在累计时长接近 15s 处作为自然断点(在角色台词完整结束处切分,不切断单句台词)
3. 校验:Clip 1 台词总时长 ≈ 15s,Clip 2 台词总时长 ≈ 15s,无重叠
4. 在对话中以表格形式展示分配结果供自我确认,然后写入脚本文件
分配表格示例:
```
| 片段 | 角色 | 台词 | 预估时长 | 累计 |
|------|------|------|---------|------|
| Clip 1 | 大橘 | "欢迎收看…" | 8s | 8s |
| Clip 1 | 小饼 | "等等…" | 4s | 12s |
| Clip 1 | 大橘 | "有!" | 3s | 15s ✅ |
| Clip 2 | 大橘 | "我的工作是…" | 7s | 7s |
| Clip 2 | 小饼 | "AI 不会蹭腿!" | 5s | 12s |
| Clip 2 | 大橘 | "下期见!" | 3s | 15s ✅ |
```
### 流程
1. **完成口播分配**(见上),确认无重叠、两段各 ≈ 15s
2. 用 Seedance 2.0 Fast 生成 2 段视频:
- Clip 1:包含分配给第 1 段的全部台词,时长 15s
- Clip 2:包含分配给第 2 段的全部台词,时长 15s
- 两个角色均出现在各自台词所在的 Clip 中(可同框或分镜)
- 提示词包含:角色外观、动作、表情、**台词原文(中文,禁止翻译)**、播客场景
- `generate_audio: true` 必须开启
- 画面比例与用户选择一致(16:9 或 9:16)
- 使用角色立绘作为参考图(`image_paths`)保持一致性
3. **生成时间线** `timeline.json`(共 2 条记录,无 audio_path,音频内嵌视频)
### 视频提示词结构
两段视频的提示词中,两个角色可在同一画面交替说话(Seedance 2.0 支持单 clip 内多角色多轮对话):
```
Podcast studio scene. {角色A描述} and {角色B描述} at a desk with microphones.
[角色A speaks]: "{台词A}"
[角色B responds]: "{台词B}"
[角色A continues]: "{台词C}"
...
Pixar 3D cartoon style, warm studio lighting, {ratio}.
```
### 时间线格式(`timeline.json`
```json
{
"audio_mode": "seedance_builtin",
"clips": [
{
"clip_id": "clip_01",
"video_path": "videos/clip_01.mp4",
"duration": 15,
"start_time": 0,
"end_time": 15,
"lines": ["大橘: ...", "小饼: ..."]
},
{
"clip_id": "clip_02",
"video_path": "videos/clip_02.mp4",
"duration": 15,
"start_time": 15,
"end_time": 30,
"lines": ["大橘: ...", "小饼: ..."]
}
],
"total_duration": 30
}
```
### 文件存储
```
./.animal-podcast/{project_name}/videos/
├── clip_01.mp4 # 015s,含内置音频
└── clip_02.mp4 # 1530s,含内置音频
./.animal-podcast/{project_name}/timeline.json
```
---
## 第 5 阶段:后期处理(字幕、花字、音效)
### 目标
拼接视频片段,嵌入音轨,添加字幕、花字和音效,输出最终视频。
### 流程
1. **基础合成**:用 `mv_final_assembly` 或 ffmpeg 拼接所有视频片段 + 嵌入旁白音频
- 如果 `mv_final_assembly` 因时长偏移拒绝,使用 ffmpeg concat 手动合成
2. **字幕生成**
- 对完整旁白音频调用 `audio_transcribe_lyrics` 获取词级时间戳
- 生成 SRT 字幕文件
- 使用 `mv_final_assembly` 的 `subtitle_segments` 或 ffmpeg `drawtext` 叠加字幕
- 字幕样式:白色粗体,黑色描边,底部居中
3. **花字生成**
- 从脚本中提取 **2-3 个关键金句/笑点**(如口头禅、爆笑台词、互怼高潮)
- 用 `openai_image_generation` 生成透明背景的花字图片
- 提示词:`Text "{金句}" in bold colorful comic style, transparent background, with fun decorative elements like stars/sparkles/emoji`
- 使用 `size="1024x1024"`
- 用 ffmpeg overlay 叠加到视频对应时间点
```
ffmpeg -i base.mp4 -i fancy_text.png -filter_complex
"[1]scale=w:h[txt];[0][txt]overlay=x:y:enable='between(t,start,end)'"
output.mp4
```
- 花字出现时机:对应台词开始后 0.5s,持续 2-3s
4. **音效混入**
- 根据脚本中的 `**音效:**` / `**SFX:**` 标记生成音效
- 用 `audios_generation` 生成:
- 大笑/Laughter:文本 "Hahahahahaha",语速 1.3
- 惊讶/Surprise:文本 "Whoa~",语速 1.0
- 鼓掌/Applause:文本 "Clap clap clap clap",语速 1.2
- 音效时长 1-2 秒
- 用 ffmpeg 混入到音轨对应时间点
```
ffmpeg -i mixed.mp3 -i sfx.mp3 -filter_complex
"[1]adelay={ms}|{ms},volume=0.6[sfx];[0][sfx]amix=inputs=2:duration=first"
output.mp3
```
- 音效音量 0.5-0.7,不应盖过旁白
5. **质量检查**:通过 `read_media` 验证最终输出
### 文件存储
```
./.animal-podcast/{project_name}/output/
├── base.mp4 # 基础合成(视频+旁白)
├── subtitles.srt # 字幕文件
├── fancy_text_*.png # 花字图片
└── final.mp4 # 最终输出(含字幕+花字+音效)
```
---
## 文件结构总览
```
./.animal-podcast/
└── {project_name}/
├── topic.md # 话题与角色设定
├── script.md # 喜剧对话脚本
├── timeline.json # 时间线(无 audio_path,音频内嵌视频)
├── characters/ # 角色立绘
│ ├── {char1}.jpg
│ └── {char2}.jpg
├── videos/ # Seedance 2.0 视频片段(含内置音频)
│ ├── opening_01.mp4
│ └── ...
└── output/
├── base.mp4 # 基础合成(视频+内置音频)
├── subtitles.srt # 字幕文件
├── fancy_text_*.png # 花字图片
└── final.mp4 # 最终输出(含字幕+花字+音效)
```
## 输出设置
- **默认语言:英文**,适用于所有输出(脚本、对话、TTS、角色名)
- 如果用户使用非英文语言沟通,询问一次是否使用该语言;否则默认英文
- 图片/视频生成提示词始终使用英文
- 默认竖版 9:16;用户可选横版 16:9
- 默认时长 30-39 秒
- 每个阶段完成后在对话中与用户确认