Install
openclaw skills install yq-story-video-generator从图片或文字描述自动生成完整视频故事。支持灵活输入(1-N张图片/纯文字/混合),可选时长和风格。关键词:故事视频、视频生成、图片转视频、文字转视频、story video、video generation
openclaw skills install yq-story-video-generator视频故事生成专家,从用户提供的图片或文字描述自动生成完整的视频故事。支持灵活输入(1-N张图片、纯文字、混合模式),可选时长和风格。完整流程包括:脚本生成 → 主体参考图 → 首帧图片 → 视频片段 → 背景音乐 → 最终合成。
核心原则:内容简洁,不啰嗦
视频/文件输出规则:
<deliver_assets>
<item>
<path>视频或文件路径</path>
</item>
</deliver_assets>
<item> 块,多个文件放在同一个 <deliver_assets> 内| 模式 | 输入 | 处理方式 |
|---|---|---|
| 图片模式 | 1-N 张图片 | AI 自动识别角色,执行图片分析与脚本生成 |
| 文字模式 | 纯文字描述 | 执行文字转脚本生成 |
| 混合模式 | 图片 + 文字补充 | 图片为主,文字作为补充说明 |
不再强制要求 3 张特定类型图片。
用 genui-form-wizard 展示:
用 genui-form-wizard 展示:
| 参数 | 值 |
|---|---|
| 每段时长 | 6秒(固定) |
| 视频分辨率 | 768P (统一) |
| 背景音乐 | 无歌词纯音乐,时长=视频总时长 |
| 参数 | 默认值 |
|---|---|
| segment_duration | 6 |
| default_duration | 48 |
| default_segments | 8 |
| video_resolution | "768P" |
| bgm_style | "instrumental, no vocals" |
本任务需要 FFmpeg。在执行前检查并安装:
# 检查 FFmpeg
if ! command -v ffmpeg &> /dev/null; then
# 根据系统安装
if [[ "$OSTYPE" == "darwin"* ]]; then
brew install ffmpeg
elif [[ -f /etc/debian_version ]]; then
sudo apt-get update && sudo apt-get install -y ffmpeg
elif [[ -f /etc/redhat-release ]]; then
sudo yum install -y ffmpeg
fi
fi
output/
├── story_script.json # 故事脚本
├── subject_reference.png # 主体参考图(一致性锚点)
├── frames/ # 首帧图片
├── videos/ # 视频片段
├── bgm.mp3 # 背景音乐
├── merged/ # 合成中间文件
└── final_video.mp4 # 最终视频
根据输入模式选择:
output/story_script.jsonanalysis.subject 生成主体参考图output/subject_reference.pngoutput/frames/frame_01.png - frame_N.pngoutput/videos/segment_01.mp4 - segment_N.mp4output/bgm.mp3output/final_video.mp4所有步骤完成后,向用户报告:
使用 <deliver_assets> 格式输出最终视频。
使用 images_understand 工具分析用户提供的图片,自动识别每张图的角色(主体/场景/风格/混合),生成故事脚本。
mkdir -p output/frames output/videos output/merged
使用 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张图,也要创作完整的故事弧线。
将生成的JSON保存到 output/story_script.json
| 图片数量 | 处理方式 |
|---|---|
| 1 张 | 从单图提取所有元素,AI 扩展场景变化 |
| 2 张 | AI 判断角色关系(如:主体+场景,或两个场景等) |
| 3 张 | 经典模式:尝试识别为主体/场景/风格 |
| 4+ 张 | 综合分析,可能作为故事的多个场景节点 |
{
"analysis": {
"subject": "...",
"scene": "...",
"style": "...",
"image_roles": ["..."]
},
"story_script": [
{
"segment_id": 1,
"visual_desc": "..."
}
],
"input_mode": "image",
"image_count": N
}
当用户只提供文字描述(无图片)时,使用 LLM 生成故事脚本,输出格式与图片模式完全一致。
mkdir -p output/frames output/videos output/merged
如果用户未指定风格,根据主题推荐:
| 主题类型 | 推荐风格 |
|---|---|
| 童话/奇幻 | 吉卜力、水彩 |
| 科幻/未来 | 赛博朋克、极简 |
| 日常/温馨 | 写实、动漫 |
| 冒险/动作 | 动漫、写实 |
| 自然/风景 | 油画、写实 |
| 复古/怀旧 | 像素、油画 |
使用 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. 确保最后一段有完美的结局感。
将生成的JSON保存到 output/story_script.json
{
"analysis": {
"subject": "...",
"scene": "...",
"style": "..."
},
"story_script": [
{
"segment_id": 1,
"visual_desc": "..."
}
],
"input_mode": "text",
"style_used": "吉卜力"
}
在首帧生成之前,先生成一张高质量的"主体参考图",作为整个视频中视觉一致性的锚点。所有后续帧都会以这张参考图作为主体参考。
支持的主体类型:
output/story_script.json 中的 analysis.subject(主体特征描述)从 output/story_script.json 读取 analysis.subject,提取角色的核心视觉特征。
根据 analysis.subject 判断主体类型:
| 类型 | 判断依据 | 参考图特点 |
|---|---|---|
| 人物/动物 | 描述中有生物特征 | 正面照,中性姿态 |
| 物体/产品 | 描述中有物品特征 | 3/4视角,展示细节 |
| 场景/地点 | 描述中以环境为主 | 全景或标准视角 |
参考图的目的是生成一张标准化的主体展示图,便于后续帧参考。
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
示例:
Character reference sheet, a brown tabby Maine Coon cat with yellow-green eyes,
black ear tips, fluffy fur, medium build,
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
使用 gen_images 工具。
有用户参考图模式:
{
"prompt": "[参考图 prompt]",
"output_file": "output/subject_reference.png",
"reference_files": ["用户提供的参考图片"],
"aspect_ratio": "1:1",
"resolution": "2K"
}
纯文字模式:
{
"prompt": "[参考图 prompt,含风格关键词]",
"output_file": "output/subject_reference.png",
"aspect_ratio": "1:1",
"resolution": "2K"
}
参考图保存到 output/subject_reference.png
| 要素 | 要求 |
|---|---|
| 视角 | 正面(front-facing) |
| 姿态 | 中性站姿/坐姿 |
| 背景 | 干净简洁 |
| 光照 | 均匀工作室光照 |
| 要素 | 要求 |
|---|---|
| 视角 | 3/4视角,展示细节 |
| 背景 | 干净简洁 |
| 光照 | 产品摄影光照 |
| 要素 | 要求 |
|---|---|
| 视角 | 全景或标准建立镜头 |
| 构图 | 展示环境特征 |
| 光照 | 符合场景氛围 |
根据主体类型选择合适的稳定性关键词:
人物/动物:
stable appearance, preserve features, consistent character design,
same character throughout, detailed features,
reference image for animation
物体/产品:
stable appearance, preserve details, consistent product design,
same object throughout, detailed features,
reference image for animation
场景/地点:
stable atmosphere, preserve environment style, consistent location design,
same environment throughout, detailed features,
reference image for animation
使用 gen_images 工具,基于故事脚本中的 visual_desc 串联生成首帧图片。
主体参考图 ──────────────────────────────────────────────────┐
│ │
▼ ▼
frame_01 ──→ frame_02 ──→ frame_03 ──→ ... ──→ frame_N
(上一帧) (上一帧) (上一帧)
双重参考机制:
output/story_script.json 读取 analysis 和 story_scriptoutput/subject_reference.png 存在必须按顺序逐帧生成,不能并行:
{
"prompt": "[visual_desc_1] + [一致性关键词]",
"output_file": "output/frames/frame_01.png",
"reference_files": ["output/subject_reference.png"],
"aspect_ratio": "16:9",
"resolution": "2K"
}
{
"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 必须包含:
[风格描述: 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" | 保证画质 |
1. 生成 frame_01(仅用主体参考图)
2. 等待 frame_01 完成
3. 生成 frame_02(用主体参考图 + frame_01)
4. 等待 frame_02 完成
5. 生成 frame_03(用主体参考图 + frame_02)
...
N. 生成 frame_N(用主体参考图 + frame_{N-1})
禁止并行生成,必须等上一帧完成后再生成下一帧。
| 风格 | 强化关键词 |
|---|---|
| 吉卜力 | Ghibli style, soft lighting, hand-drawn animation, whimsical |
| 赛博朋克 | Cyberpunk, neon lights, futuristic city, dark atmosphere |
| 写实 | Photorealistic, natural lighting, detailed textures |
| 水彩 | Watercolor painting, soft edges, artistic, pastel colors |
| 像素 | Pixel art, 8-bit style, retro gaming aesthetic |
| 动漫 | Anime style, vibrant colors, expressive |
| 油画 | Oil painting style, rich textures, classical art |
| 极简 | Minimalist, clean lines, simple shapes |
由于串联生成,总耗时 = 单帧耗时 × 帧数。 这是保证角色一致性的必要代价,不可用并行替代。
使用 gen_videos 工具,从首帧图片生成视频片段。片段数量由 story_script.json 中的 segment_count 决定。
从 output/story_script.json 读取 story_script 数据,获取 segment_count。
由于 gen_videos 每次最多 5 个请求,需根据 segment_count 分批生成。
分批策略:
请求格式:
{
"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 | 每段固定 6 秒 |
| resolution | "768P" | 统一分辨率 |
| reference_type | "first_frame" | 以首帧为起始 |
使用音乐生成工具生成一首无歌词的背景音乐(BGM),时长等于视频总时长。
从 story_script.json 的 visual_desc 中提取整体情绪基调:
[情绪基调] + [音乐类型] + 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
使用 gen_music 工具,参数:
保存到 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, choir (humming) |
| 自然风景 | ambient, nature sounds, peaceful |
使用 FFmpeg 将所有视频片段拼接成完整视频,再叠加背景音乐(BGM),输出最终视频。
output/videos/segment_01.mp4 - segment_N.mp4output/bgm.mp3output/story_script.json 获取从 output/story_script.json 读取 segment_count,或扫描 output/videos/ 目录获取实际片段数。
将每个视频片段强制缩放至统一分辨率 1280x720 (16:9):
# 动态获取片段数量
segment_count=$(ls output/videos/segment_*.mp4 | wc -l)
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
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
ffmpeg -y -f concat -safe 0 -i output/merged/filelist.txt \
-c copy output/merged/video_only.mp4
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
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 output/final_video.mp4
预期输出 = segment_count x 6 秒(允许微小误差)。
| 参数 | 说明 |
|---|---|
-vf "scale=1280:720" | 强制缩放至720p |
-c:v libx264 | 使用H.264编码 |
-an | 移除音频轨道(步骤2) |
-f concat | 使用concat模式拼接 |
-map 0:v:0 | 使用第一个输入的视频轨道 |
-map 1:a:0 | 使用第二个输入的音频轨道 |
-shortest | 以较短的流为准 |
| 工具 | 用途 | 使用步骤 |
|---|---|---|
images_understand | 分析用户图片 | Step 1(图片模式) |
gen_images | 生成主体参考图和首帧图片 | Step 1.5, Step 2 |
gen_videos | 从首帧生成视频片段 | Step 3 |
gen_music | 生成背景音乐 | Step 4 |
terminal | 执行 FFmpeg 命令 | Step 0, Step 5 |
mkdir -p output/frames output/videos output/merged