一键导入
video-creator
视频创作技能。图片+音频合成视频,支持TTS配音、淡入淡出转场、字幕、片尾、BGM。当用户提到「生成视频」「做视频」「教学视频」「图文转视频」「做视频号」「配音视频」「图文结合视频」「古诗视频」「故事视频」时触发。内含生图→配音→合成全流程,无需单独调用image-service。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
视频创作技能。图片+音频合成视频,支持TTS配音、淡入淡出转场、字幕、片尾、BGM。当用户提到「生成视频」「做视频」「教学视频」「图文转视频」「做视频号」「配音视频」「图文结合视频」「古诗视频」「故事视频」时触发。内含生图→配音→合成全流程,无需单独调用image-service。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use when a request asks for a Chinese-first AI video script with shot plans, image prompts, narration, subtitles, or handoff contracts for scene generation, image generation, video assembly, or WeChat draft preparation.
Use when a Codex task needs native image generation or editing, especially a set, series, material kit, long image, multi-screen design, storyboard, carousel, or other deliverable requiring multiple consistent images.
Skill 开发指南。当用户需要创建新 Skill 或更新已有 Skill 时触发,提供标准化模板、目录规范和最佳实践。
Use when reviewing an agent Skill before sharing, installing, or executing it and when checking a Skill bundle for credentials, dangerous commands, suspicious network behavior, or obfuscated code.
This skill should be used when preparing Markdown articles for a WeChat Official Account draft box, selecting wenyan-cli themes, processing article images, or troubleshooting authentication and whitelist failures.
Fetch and summarize Feishu group chat history. Use when the user asks to read, review, or summarize messages from a Feishu group chat. Triggers: "看群聊记录", "群里聊了啥", "帮我看看这个群", "群消息历史", "chat history", "what did the group discuss". NOT for: sending messages (use message tool), reading documents (use feishu-doc skill), or wiki operations (use feishu-wiki skill).
| name | video-creator |
| description | 视频创作技能。图片+音频合成视频,支持TTS配音、淡入淡出转场、字幕、片尾、BGM。当用户提到「生成视频」「做视频」「教学视频」「图文转视频」「做视频号」「配音视频」「图文结合视频」「古诗视频」「故事视频」时触发。内含生图→配音→合成全流程,无需单独调用image-service。 |
图片+音频合成视频工具。
每次生成视频,duration 必须从 narration.json 时间戳精确计算,绝对禁止凭感觉手动填!
1. TTS 生成配音 → 得到 narration.mp3 + narration.json(时间戳)
2. 读取 narration.json,逐句分析内容语义
3. 确定每张图对应哪些句子(按内容语义匹配,不是平均分!)
4. 每张图的 duration = 对应最后一句的 end - 对应第一句的 start
5. 校验:所有 duration 之和 ≈ 音频总时长(误差 < 1s)
6. ⛔ 运行 verify_alignment.py 校验(必须通过才能合成!)
7. 校验通过才能写 video_config.yaml,否则停止!
narration.json 时间戳:
句0 [0.1-2.6] "静夜思,唐,李白。"
句1 [2.6-5.7] "床前明月光,疑是地上霜。"
句2 [5.7-8.6] "举头望明月,低头思故乡。"
句3 [8.6-16.4] "这首诗是唐代大诗人李白..."
句4 [16.4-20.9] "短短二十个字..."
句5 [20.9-22.6] "床前明月光。"
...
图片分配:
01_title.png → 句0-2(全诗朗诵)→ duration = 8.6 - 0.1 = 8.5s
02_poet.png → 句3-4(诗人介绍)→ duration = 20.9 - 8.6 = 12.3s
03_moonlight.png → 句5-8(第一句解读)→ duration = 38.6 - 20.9 = 17.7s
...
校验:8.5 + 12.3 + 17.7 + ... = 114.4s ≈ 音频 114.5s ✅
默认比例:16:9(1920×1080 横版)
除非以下情况,否则一律用 16:9:
# ✅ 默认:不指定 -r 参数,或明确写 -r 16:9
python text_to_image.py "提示词" -o output.png
python text_to_image.py "提示词" -r 16:9 -o output.png
# ❌ 禁止:随意切换比例,一会儿竖版一会儿横版
# 同一个视频项目,所有图片必须是同一比例!
| 视频时长 | 最少图片数 | 每张图时长 |
|---|---|---|
| 30秒 | 8张 | 3-4秒 |
| 60秒 | 15张 | 3-5秒 |
| 90秒 | 22张 | 3-5秒 |
| 120秒 | 30张 | 3-5秒 |
铁律:每张图最长 7 秒,超过必须拆分!
计算公式:图片数量 = ceil(音频时长 / 4)
所有生图 prompt 必须用中文写!禁止英文 prompt!
# ❌ 错误:用英文写 prompt
python text_to_image.py "modern tech illustration, AI robot, blue gradient background"
# ❌ 错误:英文 prompt 里夹中文
python text_to_image.py "tech style, Chinese text '对决', blue theme"
# ✅ 正确:纯中文 prompt
python text_to_image.py "现代科技插画风格,可爱AI机器人坐在电脑前,蓝紫色渐变背景,霓虹灯光效,多个悬浮的全息UI面板,信息密度高,专业信息图风格"
铁律:
信息密度 = 文字要点多 + 视觉元素丰富
文字内容要丰富:
# ❌ 错误:文字太少
图片里只写 "AI对比"
# ✅ 正确:文字要点多
图片里包含:
- 标题:QoderWork vs OpenClaw
- 副标题:桌面AI助手对比
- 要点1:开箱即用 vs 自由定制
- 要点2:$19/月 vs 免费开源
- 要点3:普通用户 vs 技术极客
视觉元素要丰富:
# ❌ 错误:太空洞
只有文字,没有图标、图表、装饰
# ✅ 正确:可视化丰富
- 配合图标(对勾、叉、箭头、星星)
- 配合图表(柱状图、饼图、对比条)
- 配合插画(机器人、电脑、用户形象)
- 配合装饰(光效、渐变、边框)
信息密度原则:
每张图必须有丰富、具体的视觉元素,禁止笼统空洞!
# ❌ 错误:太笼统
"一个机器人"
"科技风格的图"
"对比图"
# ✅ 正确:细致具体
"可爱的蓝色AI机器人吉祥物,圆润金属质感,坐在现代简约办公桌前,
桌上有27寸曲面显示器显示代码,旁边放着咖啡杯和多肉植物,
机器人头顶悬浮三个全息面板分别显示折线图、饼图、进度条,
深蓝色科技感背景,地面有蓝色光带,整体赛博朋克风格,柔和的体积光"
prompt 必备 6 要素(缺一不可):
| 要素 | 说明 | 示例 |
|---|---|---|
| 主体 | 谁/什么东西,要具体 | "蓝色圆润金属质感的AI机器人" 而非 "机器人" |
| 动作 | 在做什么,姿态如何 | "双手放在键盘上打字,微微侧头" |
| 环境 | 在哪里,背景是什么 | "现代简约办公室,落地窗外是城市夜景" |
| 细节 | 周围有什么物品/元素 | "桌上有咖啡杯、多肉植物、便签纸" |
| 风格 | 什么画风/光效 | "赛博朋克风格,霓虹灯光,体积光效果" |
| 色彩 | 主色调是什么 | "蓝紫渐变主色调,橙色点缀" |
同一个视频的所有图片必须保持风格统一:
# 定义统一风格前缀(中文!)
STYLE="现代科技插画风格,干净矢量设计,蓝紫渐变配色,专业信息图美感,高信息密度,霓虹发光效果,深色背景"
# 所有图片都用这个前缀 + 相同比例
python text_to_image.py "$STYLE,[具体场景内容]" -r 16:9 -o scene01.png
python text_to_image.py "$STYLE,[具体场景内容]" -r 16:9 -o scene02.png
| 场景 | 比例 | 说明 |
|---|---|---|
| 默认/通用 | 16:9 | B站、YouTube、公众号视频、PPT配图 |
| 抖音/视频号/快手 | 9:16 | 竖屏短视频平台,需用户指定或流程要求 |
| 小红书 | 3:4 | 小红书笔记配图,需用户指定或流程要求 |
| 朋友圈 | 1:1 | 正方形,需用户指定 |
铁律:不确定用什么比例时,一律用 16:9
当用户提供故事/剧情/剧本时,必须严格按以下套娃流程执行:
┌─────────────────────────────────────────────────────────────┐
│ 第一层:故事 → 拆分场景 → 并发生成场景主图(文生图) │
│ │
│ 大闹天宫 → 场景1:弼马温受辱 │
│ 场景2:筋斗云回花果山 │
│ 场景3:玉帝派兵 │
│ ... │
│ → 并发调用 text_to_image.py 生成每个场景主图 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 第二层:每个场景主图 → 图生图拆出细镜头(保持角色一致) │
│ │
│ 场景1主图 → 细镜头1:悟空看官印疑惑 │
│ 细镜头2:悟空踢翻马槽 │
│ 场景2主图 → 细镜头1:踏筋斗云腾空 │
│ 细镜头2:花果山自封大圣 │
│ → 并发调用 image_to_image.py,以主图为参考 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 第三层:生成配音 + 字幕 + 校验 + 合成视频 │
│ │
│ 1. tts_generator.py 生成配音 + 时间戳 │
│ 2. 【铁律】根据时间戳精确计算每张图的duration │
│ 3. 生成 SRT 字幕 │
│ 4. 生成 video_config.yaml │
│ 5. ⛔ verify_alignment.py 校验(必须通过!) │
│ 6. video_maker.py 合成: │
│ → 图片合成(带转场) │
│ → 合并音频 │
│ → 烧录字幕(ASS格式,底部居中固定) │
│ → 自动拼接片尾(二维码+"点关注不迷路") │
│ → 添加BGM │
└─────────────────────────────────────────────────────────────┘
**铁律:所有视频必须自动拼接片尾!**
assets/generated/{project_name}/
├── scene1/
│ ├── main.png # 场景1主图(文生图)
│ ├── shot_01.png # 细镜头1(图生图)
│ └── shot_02.png # 细镜头2(图生图)
├── scene2/
│ ├── main.png
│ ├── shot_01.png
│ └── shot_02.png
├── ...
├── narration.mp3 # 配音
├── narration.json # 时间戳
├── subtitles.srt # 字幕
├── video_config.yaml # 视频配置
└── {project_name}.mp4 # 最终视频
# 第一层:并发生成场景主图(默认 16:9)
python .opencode/skills/image-service/scripts/text_to_image.py "风格描述,场景1内容" -r 16:9 -o scene1/main.png &
python .opencode/skills/image-service/scripts/text_to_image.py "风格描述,场景2内容" -r 16:9 -o scene2/main.png &
wait
# 第二层:并发图生图生成细镜头(保持相同比例)
python .opencode/skills/image-service/scripts/image_to_image.py scene1/main.png "保持角色风格,细镜头描述" -r 16:9 -o scene1/shot_01.png &
python .opencode/skills/image-service/scripts/image_to_image.py scene1/main.png "保持角色风格,细镜头描述" -r 16:9 -o scene1/shot_02.png &
wait
# 第三层:生成配音+校验+合成视频
python .opencode/skills/video-creator/scripts/tts_generator.py --text "完整旁白" --output narration.mp3 --timestamps
# ⛔ 强制校验(必须通过才能合成!)
python .opencode/skills/video-creator/scripts/verify_alignment.py video_config.yaml
# 校验通过后才能合成
python .opencode/skills/video-creator/scripts/video_maker.py video_config.yaml --srt subtitles.srt --bgm epic
# video_config.yaml
ratio: "16:9" # 默认横版!必须加引号避免YAML解析错误
bgm_volume: 0.12
outro: true
scenes:
- audio: narration.mp3
images:
# 按场景顺序排列所有细镜头
- file: scene1/shot_01.png
duration: 4.34
- file: scene1/shot_02.png
duration: 4.88
- file: scene2/shot_01.png
duration: 2.15
# ...
注意:ratio 必须用引号包裹,如 "16:9",否则 YAML 会解析成时间格式。
生成 video_config.yaml 前,必须严格按以下流程计算 duration:
import json
with open("narration.json", "r") as f:
timestamps = json.load(f)
audio_duration = timestamps[-1]["end"]
print(f"音频总时长: {audio_duration:.1f}s")
根据解说词内容,确定每张图对应的时间段:
# 示例:根据解说词内容划分
# 找到每个主题切换点的时间戳
scenes = [
("cover.png", 0, 12.5), # 开场到第一个主题切换
("scene01.png", 12.5, 26), # 第二段内容
# ...根据 narration.json 中的句子边界精确划分
]
for file, start, end in scenes:
duration = end - start
print(f"{file}: {duration:.1f}s")
total_duration = sum(duration for _, _, duration in scenes)
assert abs(total_duration - audio_duration) < 1.0, \
f"时长不匹配!图片总时长{total_duration}s vs 音频{audio_duration}s"
# ⛔ 合成视频前必须先运行校验脚本,不通过禁止合成!
python .opencode/skills/video-creator/scripts/verify_alignment.py video_config.yaml
# 校验内容:
# 1. 所有图片文件是否存在
# 2. duration 是否为精确数值(非数字直接拒绝!)
# 3. 图片总时长 vs 音频总时长(误差 < 1s)
# 4. 每张图时长是否在合理范围(1-7s)
# 5. 图片文件名关键词 vs 语音内容关键词 语义交叉比对
# 6. 输出完整对照表(图片 + 时长 + 语义✅/❌ + 对应语音文字)
# 退出码 0 = 通过,1 = 失败
# 失败时禁止合成,必须修复后重新校验!
注意:video_maker.py 也内置了硬校验——duration 必须是精确正数浮点数,缺失或非数字直接拒绝执行并 exit(1)!duration: auto 已被彻底删除!
生成配置前,先输出分配表确认:
| 场景图 | 对应内容 | 开始 | 结束 | 时长 |
|--------|----------|------|------|------|
| cover.png | 开场引入 | 0s | 12.5s | 12.5s |
| scene01.png | AI Agent时代 | 12.5s | 26s | 13.5s |
| ... | ... | ... | ... | ... |
| **合计** | | | | **{total}s** |
音频总时长:{audio_duration}s
差值:{diff}s ✅/❌
字幕使用 ASS 格式,强制底部居中固定位置:
禁止:字幕乱跑、大小不一、位置不固定
python video_maker.py config.yaml [options]
| 参数 | 说明 | 默认值 |
|---|---|---|
--no-outro | 不添加片尾 | 添加 |
--no-bgm | 不添加BGM | 添加 |
--fade | 转场时长(秒) | 0.5 |
--bgm-volume | BGM音量 | 0.08 |
--bgm | 自定义BGM(可选: epic) | 默认科技风 |
--ratio | 视频比例 | 16:9(会被配置文件覆盖) |
--srt | 字幕文件路径 | 无 |
python verify_alignment.py video_config.yaml
| 校验项 | 说明 |
|---|---|
| 图片存在性 | 所有图片文件必须存在 |
| duration 精确性 | 必须是正数浮点数,禁止 auto/空值/非数字 |
| 总时长匹配 | 图片总时长 vs 音频总时长,误差 < 1s |
| 单图时长范围 | 每张图 1-7 秒,超出警告 |
| 语义交叉比对 | 总结段图片文件名关键词 vs 语音内容关键词匹配 |
python tts_generator.py --text "文本" --output audio.mp3 [options]
| 参数 | 说明 | 默认值 |
|---|---|---|
--voice | 音色 | zh-CN-YunxiNeural |
--rate | 语速 | +0% |
--timestamps | 输出时间戳JSON | 否 |
与 image-service 生图服务保持一致,支持 10 种比例:
| 比例 | 分辨率 | 适用场景 |
|---|---|---|
| 1:1 | 1024×1024 | 正方形,朋友圈 |
| 2:3 | 832×1248 | 竖版海报 |
| 3:2 | 1248×832 | 横版海报 |
| 3:4 | 1080×1440 | 小红书、朋友圈 |
| 4:3 | 1440×1080 | 传统显示器 |
| 4:5 | 864×1080 | |
| 5:4 | 1080×864 | 横版照片 |
| 9:16 | 1080×1920 | 抖音、视频号、竖屏 |
| 16:9 | 1920×1080 | B站、YouTube、横屏 |
| 21:9 | 1536×672 | 超宽屏电影 |
铁律:所有视频必须自动拼接对应尺寸的片尾!
片尾匹配顺序:
outro_{ratio}.mp4outro_9x16.mp4,横版→outro_16x9.mp4outro.mp4| 风格 | 文件 | 快捷参数 | 适用场景 |
|---|---|---|---|
| 古风/中国风 | bgm_ancient_tale.mp3 | ancient | 水浒、三国、历史故事 |
bgm_asian_drums.mp3 | asian | 武侠、动作、战斗 | |
bgm_meditation.mp3 | meditation | 禅意、冥想、国学 | |
bgm_garden.mp3 | garden | 田园、悠闲、风景 | |
| 治愈/轻松 | bgm_carefree.mp3 | carefree | Vlog、日常、生活 |
bgm_dreamy.mp3 | dreamy | 梦幻、回忆、温馨 | |
bgm_happybee.mp3 | happybee | 欢快、明亮、阳光 | |
| 热血/史诗 | bgm_epic.mp3 | epic | 励志、战斗、高燃 |
bgm_heroic.mp3 | heroic | 英雄、胜利、荣耀 | |
bgm_crusade.mp3 | crusade | 战争、史诗、宏大 | |
bgm_allthis.mp3 | allthis | 电影感、叙事、情感 | |
| 科技/未来 | bgm_technology.mp3 | tech | AI、产品、教程 |
bgm_digital.mp3 | digital | 数码、网络、互联网 | |
bgm_chasm.mp3 | chasm | 科幻、太空、神秘 | |
| 悬疑/紧张 | bgm_anxiety.mp3 | anxiety | 推理、紧张、危机 |
bgm_darkfog.mp3 | darkfog | 恐怖、黑暗、悬疑 | |
| 欢快/活泼 | bgm_funky.mp3 | funky | 搞笑、轻松、节奏感 |
bgm_happyboy.mp3 | happyboy | 可爱、儿童、动画 | |
bgm_doh.mp3 | doh | 俏皮、有趣、短视频 | |
| 电子/节奏 | bgm_edm.mp3 | edm | 动感、剪辑、卡点 |
bgm_electro.mp3 | electro | 电子、现代、潮流 | |
bgm_bitshift.mp3 | bitshift | 游戏、8-bit、复古电子 | |
bgm_hiphop.mp3 | hiphop | 说唱、街头、潮酷 |
# 方式1:快捷参数(推荐)
python video_maker.py config.yaml --bgm epic
python video_maker.py config.yaml --bgm ancient
python video_maker.py config.yaml --bgm edm
# 方式2:完整文件名
python video_maker.py config.yaml --bgm bgm_ancient_tale.mp3
# 方式3:自定义路径
python video_maker.py config.yaml --bgm /path/to/custom.mp3
| 音色 ID | 风格 |
|---|---|
| zh-CN-YunyangNeural | 男声,新闻播报 |
| zh-CN-YunxiNeural | 男声,阳光活泼 |
| zh-CN-XiaoxiaoNeural | 女声,温暖自然 |
| zh-CN-XiaoyiNeural | 女声,活泼可爱 |
video-creator/
├── SKILL.md
├── scripts/
│ ├── video_maker.py # 主脚本:图片+音频→视频(内置duration硬卡)
│ ├── verify_alignment.py # 合成前强制校验(时长+语义交叉比对)
│ ├── tts_generator.py # TTS 语音生成
│ └── scene_splitter.py # 场景拆分器(可选)
├── assets/
│ ├── outro.mp4 # 通用片尾(16:9)
│ ├── outro_9x16.mp4 # 竖版片尾
│ ├── outro_3x4.mp4 # 3:4片尾
│ └── bgm_*.mp3 # 22首BGM(详见BGM资源表)
└── references/
└── edge_tts_voices.md
# 系统依赖
brew install ffmpeg # Mac
# Python 依赖
pip install edge-tts pyyaml