从图片或文字描述自动生成完整视频故事。支持灵活输入(1-N张图片/纯文字/混合),可选时长和风格。关键词:故事视频、视频生成、图片转视频、文字转视频、story video、video generation
视频故事生成专家,从用户提供的图片或文字描述自动生成完整的视频故事。支持灵活输入(1-N张图片、纯文字、混合模式),可选时长和风格。完整流程包括:脚本生成 → 主体参考图 → 首帧图片 → 视频片段 → 背景音乐 → 最终合成。
核心原则:内容简洁,不啰嗦
视频/文件输出规则:
生成的视频/文件必须用以下格式输出才能在对话中显示: text
<deliver_assets>
<item>
<path>视频或文件路径</path>
</item>
</deliver_assets>
每个文件一个 <item> 块,多个文件放在同一个 <deliver_assets> 内
模式输入处理方式图片模式1-N 张图片AI 自动识别角色,执行图片分析与脚本生成文字模式纯文字描述执行文字转脚本生成混合模式图片 + 文字补充图片为主,文字作为补充说明
不再强制要求 3 张特定类型图片。
用 genui-form-wizard 展示:
用 genui-form-wizard 展示:
参数值每段时长6秒(固定)视频分辨率768P (统一)背景音乐无歌词纯音乐,时长=视频总时长
参数默认值segment_duration6default_duration48default_segments8video_resolution"768P"bgm_style"instrumental, no vocals"
本任务需要 FFmpeg。在执行前检查并安装:
bash
# 检查 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
text
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 工具分析用户提供的图片,自动识别每张图的角色(主体/场景/风格/混合),生成故事脚本。
bash
mkdir -p output/frames output/videos output/merged
使用 images_understand 工具,传入以下 prompt:
text
你是一位资深分镜导演。请基于提供的图片创作一个由 {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+ 张综合分析,可能作为故事的多个场景节点
json
{
"analysis": {
"subject": "...",
"scene": "...",
"style": "...",
"image_roles": ["..."]
},
"story_script": [
{
"segment_id": 1,
"visual_desc": "..."
}
],
"input_mode": "image",
"image_count": N
}
当用户只提供文字描述(无图片)时,使用 LLM 生成故事脚本,输出格式与图片模式完全一致。
bash
mkdir -p output/frames output/videos output/merged
如果用户未指定风格,根据主题推荐:
主题类型推荐风格童话/奇幻吉卜力、水彩科幻/未来赛博朋克、极简日常/温馨写实、动漫冒险/动作动漫、写实自然/风景油画、写实复古/怀旧像素、油画
使用 LLM 生成脚本,prompt:
text
你是一位资深分镜导演。请基于用户描述创作一个由 {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
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 结构:
text
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
示例:
text
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 工具。
有用户参考图模式:
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"
}
参考图保存到 output/subject_reference.png
要素要求视角正面(front-facing)姿态中性站姿/坐姿背景干净简洁光照均匀工作室光照
要素要求视角3/4视角,展示细节背景干净简洁光照产品摄影光照
要素要求视角全景或标准建立镜头构图展示环境特征光照符合场景氛围
根据主体类型选择合适的稳定性关键词:
人物/动物:
text
stable appearance, preserve features, consistent character design,
same character throughout, detailed features,
reference image for animation
物体/产品:
text
stable appearance, preserve details, consistent product design,
same object throughout, detailed features,
reference image for animation
场景/地点:
text
stable atmosphere, preserve environment style, consistent location design,
same environment throughout, detailed features,
reference image for animation
使用 gen_images 工具,基于故事脚本中的 visual_desc 串联生成 首帧图片。
text
主体参考图 ──────────────────────────────────────────────────┐
│ │
▼ ▼
frame_01 ──→ frame_02 ──→ frame_03 ──→ ... ──→ frame_N
(上一帧) (上一帧) (上一帧)
双重参考机制:
output/story_script.json 读取 analysis 和 story_scriptoutput/subject_reference.png 存在必须按顺序逐帧生成,不能并行:
json
{
"prompt": "[visual_desc_1] + [一致性关键词]",
"output_file": "output/frames/frame_01.png",
"reference_files": ["output/subject_reference.png"],
"aspect_ratio": "16:9",
"resolution": "2K"
}
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 必须包含:
text
[风格描述: 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.
一致性关键词(根据主体类型选择):
人物/动物:
text
same character as reference image,
stable appearance, preserve features,
consistent character design,
same outfit as reference,
consistent lighting style
物体/产品:
text
same object as reference image,
stable appearance, preserve details,
consistent product design,
consistent lighting style
场景/地点:
text
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"保证画质
text
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 分批生成。
分批策略:
请求格式:
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"
}
]
}
参数值说明duration6每段固定 6 秒resolution"768P"统一分辨率reference_type"first_frame"以首帧为起始
使用音乐生成工具生成一首无歌词的背景音乐(BGM),时长等于视频总时长。
从 story_script.json 的 visual_desc 中提取整体情绪基调:
text
[情绪基调] + [音乐类型] + instrumental, no vocals, no lyrics + [时长要求]
示例:
text
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):
bash
# 动态获取片段数量
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
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
bash
ffmpeg -y -f concat -safe 0 -i output/merged/filelist.txt \
-c copy output/merged/video_only.mp4
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
bash
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 2gen_videos从首帧生成视频片段Step 3gen_music生成背景音乐Step 4terminal执行 FFmpeg 命令Step 0, Step 5
mkdir -p output/frames output/videos output/merged