Skill: zeng-austin/story-video-generator (version 1.0.0)

--- name: story-video-generator version: "1.0.0" description: 从图片或文字描述自动生成完整视频故事。支持灵活输入（1-N张图片/纯文字/混合），可选时长和风格。当用户要求生成视频故事、视频短片、图片转视频、文字转视频时使用。 --- # 故事视频生成助手 从用户提供的图片或文字描述自动生成完整的视频故事。完整流程：脚本生成 → 主体参考图 → 首帧图片 → 视频片段 → 背景音乐 → 最终合成。 ## 快速开始 ### 输入要求 - **图片模式**：1-N 张图片（不强制分类，AI 自动识别） - **文字模式**：纯文字描述故事 - **混合模式**：图片 + 文字补充 ### 可选参数 - **时长**：24秒（4段）/ 48秒（默认，8段）/ 72秒（12段） - **风格**（纯文字时）：吉卜力 / 赛博朋克 / 写实 / 水彩 / 像素 / 动漫 / 油画 / 极简 / AI推荐 ### 输出格式 生成视频后用以下格式输出： ``` <deliver_assets> <item> <path>视频路径</path> </item> </deliver_assets> ``` ## 执行流程 ### Step 0: 环境检查 1. 检查 FFmpeg 是否可用，不可用则安装 2. 接收用户输入（图片/文字） 3. 确定时长（未指定默认 48 秒） 4. 纯文字时确定风格（未指定则 AI 推荐） ### Step 1: 生成故事脚本 - **有图片** → 用 `images_understand` 分析图片，生成脚本 - **纯文字** → 用 LLM 生成脚本 - 输出：`output/story_script.json` ### Step 1.5: 主体参考图生成 - 基于 `analysis.subject` 生成主体参考图 - 作为整个视频视觉一致性的锚点 - 输出：`output/subject_reference.png` ### Step 2: 首帧图片生成（串联） - **必须逐帧生成**，每帧用主体参考图 + 上一帧作为双重参考 - 禁止并行生成 - 输出：`output/frames/frame_01.png` - `frame_N.png` ### Step 3: 视频片段生成 - 从首帧图片生成视频片段 - 参数：duration=6秒，resolution=768P - 输出：`output/videos/segment_01.mp4` - `segment_N.mp4` ### Step 4: 背景音乐生成（可与 Step 3 并行） - 生成无歌词 BGM，时长等于视频总时长 - 输出：`output/bgm.mp3` ### Step 5: 视频拼接与音乐合成 - 使用 FFmpeg 拼接视频片段并叠加 BGM - 输出：`output/final_video.mp4` ## 关键约束 | 参数 | 值 | |------|-----| | 每段时长 | 6秒（固定） | | 视频分辨率 | 768P | | 背景音乐 | 无歌词纯音乐 | ## 常用工具 | 工具 | 用途 | |------|------| | images_understand | 分析图片生成脚本 | | gen_images | 生成首帧图片 | | gen_videos | 生成视频片段 | | gen_music | 生成背景音乐 | | exec + FFmpeg | 拼接视频与合成音频 | ## 常见错误 1. 首帧并行生成 → 角色一致性无法保证 2. 每段未重复主体特征 → 角色长相漂移 3. BGM 带歌词 → 必须强调 instrumental, no vocals 4. 跳过主体参考图 → 视觉一致性无法保证

path: references/bgm-generation.md
content: # 背景音乐生成（Step 4）

生成无歌词的背景音乐(BGM)，时长等于视频总时长。

## 执行步骤

### 1. 分析故事情绪
从 `visual_desc` 中提取情绪基调：
- 温馨/治愈 → 轻柔钢琴、acoustic
- 冒险/动作 → 激昂管弦、epic orchestral
- 神秘/奇幻 → 空灵电子、ambient
- 欢快/童趣 → 活泼旋律、playful
- 史诗/宏大 → 交响乐、cinematic

### 2. 构建 prompt

```
[情绪基调] + [音乐类型] + instrumental, no vocals, no lyrics + [时长要求]
```

示例：
```
Warm and heartfelt acoustic guitar melody, gentle piano accompaniment,
cinematic film score style, emotional and touching,
instrumental only, no vocals, no lyrics,
suitable for storytelling video, 48 seconds duration
```

### 3. 调用 gen_music
- duration: 视频总时长（如 48 秒）
- style: instrumental / no vocals
- prompt: 基于情绪分析构建

### 4. 保存输出
`output/bgm.mp3`

## 音乐风格映射
| 视频类型 | 推荐风格 |
|---------|---------|
| 温馨故事 | soft piano, acoustic guitar, warm strings |
| 冒险动作 | epic orchestral, drums, brass |
| 童话奇幻 | magical bells, harp, ethereal synth |
| 日常治愈 | lo-fi, jazz piano, ambient |
| 史诗叙事 | cinematic orchestra |
| 自然风景 | ambient, nature sounds |

## 注意事项
1. **无歌词**: prompt 必须强调 instrumental, no vocals
2. **时长精确**: BGM 时长必须等于视频总时长
3. **情绪统一**: 音乐风格需与视频整体情绪匹配


path: references/frame-generation.md
content: # 首帧图片生成（Step 2）

基于故事脚本中的 visual_desc **串联生成**首帧图片。

## 角色一致性策略

```
主体参考图 ──────────────────────────────────────────────────┐
 │ │
 ▼ ▼
 frame_01 ──→ frame_02 ──→ frame_03 ──→ ... ──→ frame_N
 (上一帧) (上一帧) (上一帧)
```

## 执行步骤

### 1. 读取输入
- 从 `output/story_script.json` 读取 analysis 和 story_script
- 确认 `output/subject_reference.png` 存在

### 2. 串联生成（逐帧）

**必须按顺序逐帧生成，禁止并行！**

#### Frame 1（第一帧）
```json
{
 "prompt": "[visual_desc_1] + [一致性关键词]",
 "output_file": "output/frames/frame_01.png",
 "reference_files": ["output/subject_reference.png"],
 "aspect_ratio": "16:9",
 "resolution": "2K"
}
```

#### Frame 2-N（后续帧）
```json
{
 "prompt": "[visual_desc_N] + [一致性关键词]",
 "output_file": "output/frames/frame_0N.png",
 "reference_files": [
 "output/subject_reference.png",
 "output/frames/frame_0{N-1}.png"
 ],
 "aspect_ratio": "16:9",
 "resolution": "2K"
}
```

## Prompt 构建规则

每个 prompt 必须包含：
```
[风格描述: analysis.style].
[场景描述: analysis.scene].
[主体描述: analysis.subject].
[该段 visual_desc].
same subject as reference image, stable appearance, preserve features,
consistent design, consistent lighting style,
high quality, cinematic shot, detailed texture, 8k resolution.
```

## 一致性关键词

**人物/动物：**
```
same character as reference image,
stable appearance, preserve features,
consistent character design, same outfit as reference,
consistent lighting style
```

**物体/产品：**
```
same object as reference image,
stable appearance, preserve details,
consistent product design, consistent lighting style
```

**场景/地点：**
```
same environment as reference image,
stable atmosphere, preserve style,
consistent location design, consistent lighting style
```

## 参数要求
| 参数 | 值 |
|------|-----|
| reference_files[0] | subject_reference.png（必须） |
| reference_files[1] | 上一帧（frame 2+ 时） |
| aspect_ratio | "16:9" |
| resolution | "2K" |

## 风格强化关键词

| 风格 | 关键词 |
|------|--------|
| 吉卜力 | Ghibli style, soft lighting, hand-drawn animation |
| 赛博朋克 | Cyberpunk, neon lights, futuristic city |
| 写实 | Photorealistic, natural lighting |
| 水彩 | Watercolor painting, soft edges, pastel colors |
| 像素 | Pixel art, 8-bit style, retro gaming |
| 动漫 | Anime style, vibrant colors |
| 油画 | Oil painting style, rich textures |
| 极简 | Minimalist, clean lines |

## 注意事项
1. **串联生成**：必须逐帧生成，等上一帧完成后再生成下一帧
2. **双重参考**：每帧都用主体参考图 + 上一帧
3. **比例锁定**：必须使用 16:9 比例


path: references/image-script-generation.md
content: # 图片分析与脚本生成（Step 1 - 图片模式）

使用 `images_understand` 工具分析用户提供的图片，自动识别每张图的角色（主体/场景/风格/混合），生成故事脚本。

## 输入要求
- 1-N 张图片（不限数量）
- 可选：用户的补充说明

## 执行步骤

### 1. 创建输出目录
```bash
mkdir -p output/frames output/videos output/merged
```

### 2. 分析图片并生成脚本

使用 `images_understand` 工具，传入以下 prompt：

```
你是一位资深分镜导演。请基于提供的图片创作一个由 {segment_count} 个镜头组成的连贯视频脚本。

【关键任务 0：图片角色识别】
首先分析每张图片，判断其角色：
- 主体图：包含明确的角色/物体/人物
- 场景图：以环境/背景为主
- 风格图：体现特定艺术风格/色调
- 混合图：同时包含多种元素

如果只有1张图，从中提取所有元素（主体+场景+风格）。
如果有多张图，综合分析它们的关系。

【关键任务 1：主体特征锁定】
从图片中提取主角的不少于3个核心视觉特征（如：毛色纹理、眼睛颜色、配饰、体型特征）。
**约束**：在生成的每一段 `visual_desc` 中，必须强制重复描述这些特征，防止角色长相漂移。

【关键任务 2：视觉连续性设计】
- 动作衔接: Segment N 的结尾动作必须为 Segment N+1 开头动作做铺垫。
- 环境渐变: 场景切换时必须保留上一场景的元素作为锚点。
- 动作量化: 必须明确动作的速度（慢/快）、方向（向左/向右/逼近镜头）和幅度。

【输出要求】生成严格的JSON格式：
{
 "analysis": {
 "subject": "主体详细特征（必须非常具体，用于后续锁定）",
 "scene": "环境特征锚点",
 "style": "光影与画风定义",
 "image_roles": ["图1: 主体+场景", "图2: 风格", ...]
 },
 "story_script": [
 {
 "segment_id": 1,
 "visual_desc": "[镜头类型+风格定义] + [主体完整特征复述] + [具体的环境位置] + [量化的动作描述]。[光影描述]。"
 },
 ... (共 {segment_count} 段)
 ]
}

**特别指令**:
1. `visual_desc` 是给AI绘画模型看的，必须包含英文单词提示 (如: Cinematic shot, Ghibli style)。
2. 确保最后一段有完美的结局感。
3. 即使只有1张图，也要创作完整的故事弧线。
```

### 3. 保存脚本
将生成的JSON保存到 `output/story_script.json`

## 输出格式
```json
{
 "analysis": {
 "subject": "...",
 "scene": "...",
 "style": "...",
 "image_roles": ["..."]
 },
 "story_script": [
 {
 "segment_id": 1,
 "visual_desc": "..."
 }
 ],
 "input_mode": "image",
 "image_count": N
}
```

## 注意事项
1. **主体特征锁定**: visual_desc 中必须重复主体的核心特征
2. **动作连贯性**: 每段结尾要为下一段开头做铺垫
3. **英文提示词**: visual_desc 需包含英文风格提示词
4. **JSON格式**: 输出必须是有效的JSON格式


path: references/subject-reference.md
content: # 主体参考图生成（Step 1.5）

在首帧生成之前，先生成一张高质量的"主体参考图"，作为整个视频中视觉一致性的锚点。

## 输入要求
- `output/story_script.json` 中的 `analysis.subject`
- 可选：用户提供的主体参考图片

## 执行步骤

### 1. 读取角色特征
从 `output/story_script.json` 读取 `analysis.subject`

### 2. 判断主体类型

| 类型 | 判断依据 | 参考图特点 |
|------|---------|-----------|
| 人物/动物 | 描述中有生物特征 | 正面照，中性姿态 |
| 物体/产品 | 描述中有物品特征 | 3/4视角，展示细节 |
| 场景/地点 | 描述中以环境为主 | 全景或标准视角 |

### 3. 构建参考图 Prompt

```
Character reference sheet, [角色详细特征描述],
front-facing view, neutral pose, centered composition,
clean background, studio lighting, high detail,
consistent character design, reference image for animation,
same character as will appear throughout the video,
stable face, preserve features, detailed facial features,
high quality, 8k resolution
```

### 4. 生成参考图

**有用户参考图：**
```json
{
 "prompt": "[参考图 prompt]",
 "output_file": "output/subject_reference.png",
 "reference_files": ["用户提供的参考图片"],
 "aspect_ratio": "1:1",
 "resolution": "2K"
}
```

**纯文字模式：**
```json
{
 "prompt": "[参考图 prompt，含风格关键词]",
 "output_file": "output/subject_reference.png",
 "aspect_ratio": "1:1",
 "resolution": "2K"
}
```

### 5. 保存路径
`output/subject_reference.png`

## 一致性关键词

**人物/动物：**
```
stable appearance, preserve features, consistent character design,
same character throughout, detailed features
```

**物体/产品：**
```
stable appearance, preserve details, consistent product design,
same object throughout, detailed features
```

**场景/地点：**
```
stable atmosphere, preserve environment style, consistent location design,
same environment throughout, detailed features
```

## 注意事项
1. 简洁背景：避免干扰主体特征提取
2. 合适视角：根据主体类型选择最佳展示视角
3. 高细节：主体细节要清晰，便于后续复现
4. 单主体：一张参考图只包含一个主要主体


path: references/text-script-generation.md
content: # 文字转脚本生成（Step 1 - 文字模式）

当用户只提供文字描述（无图片）时，使用 LLM 生成故事脚本，输出格式与图片模式完全一致。

## 输入要求
- 用户的故事描述/主题（必须）
- 风格选择（可选）：吉卜力 / 赛博朋克 / 写实 / 水彩 / 像素 / 动漫 / 油画 / 极简 / AI推荐

## 执行步骤

### 1. 确定风格
如果用户未指定风格，根据主题推荐：

| 主题类型 | 推荐风格 |
|---------|----------|
| 童话/奇幻 | 吉卜力、水彩 |
| 科幻/未来 | 赛博朋克、极简 |
| 日常/温馨 | 写实、动漫 |
| 冒险/动作 | 动漫、写实 |
| 自然/风景 | 油画、写实 |
| 复古/怀旧 | 像素、油画 |

### 2. 生成脚本

使用 LLM 生成脚本，prompt：

```
你是一位资深分镜导演。请基于用户描述创作一个由 {segment_count} 个镜头组成的连贯视频脚本。

【用户描述】
{user_description}

【视觉风格】
{style_description}

【关键任务 1：主体设计与锁定】
首先，根据用户描述设计主角/主体的具体视觉形象，提取不少于3个核心视觉特征。
**约束**：在生成的每一段 `visual_desc` 中，必须强制重复描述这些特征，防止角色长相漂移。

【关键任务 2：视觉连续性设计】
- 动作衔接: Segment N 的结尾动作必须为 Segment N+1 开头动作做铺垫。
- 环境渐变: 场景切换时必须保留上一场景的元素作为锚点。
- 动作量化: 必须明确动作的速度（慢/快）、方向（向左/向右/逼近镜头）和幅度。

【输出要求】生成严格的JSON格式：
{
 "analysis": {
 "subject": "主体详细特征（必须非常具体，用于后续锁定）",
 "scene": "主要环境特征",
 "style": "{style_name} 风格：光影与画风定义"
 },
 "story_script": [
 {
 "segment_id": 1,
 "visual_desc": "[镜头类型+风格定义] + [主体完整特征复述] + [具体的环境位置] + [量化的动作描述]。[光影描述]。"
 },
 ... (共 {segment_count} 段)
 ]
}

**特别指令**:
1. `visual_desc` 是给AI绘画模型看的，必须包含英文单词提示。
2. 风格关键词必须出现在每段 visual_desc 中。
3. 确保最后一段有完美的结局感。
```

### 3. 保存脚本
将生成的JSON保存到 `output/story_script.json`

## 输出格式
```json
{
 "analysis": {
 "subject": "...",
 "scene": "...",
 "style": "..."
 },
 "story_script": [
 {
 "segment_id": 1,
 "visual_desc": "..."
 }
 ],
 "input_mode": "text",
 "style_used": "吉卜力"
}
```

## 注意事项
1. **主体一致性**: 即使没有图片，也要在首段设计具体的主体形象，后续段落严格复述
2. **风格锚定**: 每段 visual_desc 必须包含风格关键词
3. **JSON格式**: 输出必须是有效的JSON格式


path: references/video-generation.md
content: # 视频片段生成（Step 3）

从首帧图片生成视频片段。

## 执行步骤

### 1. 读取故事脚本
从 `output/story_script.json` 读取 segment_count

### 2. 调用 gen_videos

**注意：每次最多 5 个请求，需分批生成**

分批策略：
- 4 段 → 1 批
- 8 段 → 2 批（5 + 3）
- 12 段 → 3 批（5 + 5 + 2）

### 3. 请求格式

```json
{
 "video_requests": [
 {
 "prompt": "[该段的 visual_desc，添加动态描述]",
 "output_file": "output/videos/segment_01.mp4",
 "image_file": "output/frames/frame_01.png",
 "reference_type": "first_frame",
 "duration": 6,
 "resolution": "768P"
 }
 ]
}
```

## 参数要求
| 参数 | 值 |
|------|-----|
| duration | 6 |
| resolution | "768P" |
| reference_type | "first_frame" |

## 注意事项
1. 时长统一：所有视频必须是 6 秒
2. 分辨率统一：所有视频必须是 768P
3. 分批生成：gen_videos 每次最多 5 个
4. 动态描述：prompt 中添加动作相关描述增强动态效果


path: references/video-merge.md
content: # 视频拼接与音乐合成（Step 5）

使用 FFmpeg 将视频片段拼接并叠加背景音乐。

## 执行步骤

### 步骤1: 获取片段数量
```bash
segment_count=$(ls output/videos/segment_*.mp4 | wc -l)
```

### 步骤2: 统一视频分辨率
```bash
for i in $(seq -w 1 $segment_count); do
 ffmpeg -y -i output/videos/segment_${i}.mp4 \
 -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" \
 -c:v libx264 -preset fast -crf 23 \
 -an \
 output/merged/scaled_${i}.mp4
done
```

### 步骤3: 创建拼接列表
```bash
rm -f output/merged/filelist.txt
for i in $(seq -w 1 $segment_count); do
 echo "file 'scaled_${i}.mp4'" >> output/merged/filelist.txt
done
```

### 步骤4: 拼接视频
```bash
ffmpeg -y -f concat -safe 0 -i output/merged/filelist.txt \
 -c copy output/merged/video_only.mp4
```

### 步骤5: 叠加背景音乐
```bash
ffmpeg -y -i output/merged/video_only.mp4 \
 -i output/bgm.mp3 \
 -c:v copy -c:a aac \
 -map 0:v:0 -map 1:a:0 \
 -shortest \
 output/final_video.mp4
```

### 步骤6: 验证输出
```bash
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 output/final_video.mp4
```
预期 = segment_count × 6 秒

## 参数说明
| 参数 | 说明 |
|------|------|
| -vf scale=1280:720 | 强制缩放至720p |
| -c:v libx264 | 使用H.264编码 |
| -an | 移除音频轨道 |
| -f concat | 使用concat模式拼接 |
| -map 0:v:0 | 使用第一个输入的视频 |
| -map 1:a:0 | 使用第二个输入的音频 |
| -shortest | 以较短的流为准 |

## 注意事项
1. 分辨率统一：确保所有片段为1280x720
2. 先拼后叠：先拼接视频，再叠加 BGM
3. BGM 时长：应等于视频总时长


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)