用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/Leoyishou/personal-ai-company --skill stickman-video命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | stickman-video |
| description | 生成火柴人风格短视频。自动生成解说词、TTS语音、背景音乐、火柴人插图,使用Remotion合成视频。 |
| allowed-tools | Bash(python:*), Bash(npm:*), Bash(npx:*), Bash(ffmpeg:*), Bash(playwright-cli:*), Read, Write, Edit |
自动生成火柴人风格的短视频,整合实时数据获取、解说词生成、TTS语音、背景音乐搜索、AI绘图和Remotion视频合成。
| 参数 | 规格 |
|---|---|
| 分辨率 | 960×720 (横屏 4:3) |
| 编码 | H.264/AVC(兼容性好,所有播放器都能播放) |
| 帧率 | 30fps |
| 音频 | AAC, 44100Hz, 单声道 |
┌────────────────────────────────────────────────┐
│ 内容总结(黑色) 个人观点,无不良引导(红色) │ ← 顶部栏 36px 浅灰背景
├────────────────────────────────────────────────┤
│ │
│ │
│ 【火柴人插图区域】 │ ← 中间区域 白色/浅灰背景
│ 居中显示 │
│ │
│ │
├────────────────────────────────────────────────┤
│ 字幕文字(黑色大号) │ ← 底部渐变背景(透明→浅灰)
└────────────────────────────────────────────────┘
linear-gradient(to bottom, rgba(200,200,200,0) 0%, rgba(200,200,200,0.8) 30%, rgba(180,180,180,0.95) 100%)#222(不是白色!)如果视频主题涉及实时信息(股价、新闻、体育、热点等),使用 WebSearch 获取最新数据。
推荐使用 WebSearch(更准确):
# 股票数据
WebSearch: "HOOD stock price today"
WebSearch: "Robinhood HOOD 股票 最新消息 2026"
# 新闻热点
WebSearch: "今日热点新闻"
# 体育赛事
WebSearch: "NBA 今日比赛结果"
备选使用 playwright-cli(需要截图或复杂交互时):
playwright-cli open "https://finance.yahoo.com/quote/HOOD"
playwright-cli snapshot
playwright-cli screenshot --filename=stock_data.png
基于 Step 0 获取的实时数据,生成分段解说词。按语义分组,不是每句一张图。
⚠️ 视觉节奏要求 (Visual Pacing):
{
"meta": {
"title": "这就是所谓的实在人",
"bgm_mood": "sad", // 可选: happy, sad, tense, relaxing, upbeat
"bgm_tag": "piano", // 搜索关键词
"character_anchor": "simple stick figure with a red tie" // 角色一致性特征
},
"scenes": [
{
"id": 1,
"description": "引入-工作态度",
"image_prompt": "火柴人坐在办公桌前埋头工作,桌上左边一小叠钱标注LOW PAY...",
"image_file": "scene_01.png"
}
],
"segments": [
{
"id": 1,
"scene_id":
字幕数据结构说明:
subtitles: 每个segment可包含多条短字幕text: 字幕文字(不超过15字)ratio: 该字幕在segment音频时长中的占比(所有ratio之和应为1.0)⚠️ 重要:生成脚本后必须暂停,让用户确认后再继续!
使用 AskUserQuestion 工具询问用户:
示例提问:
脚本已生成,请确认以下内容:
**标题**: xxx
**实时数据**(通过 playwright-cli 获取):
- 数据来源: https://finance.yahoo.com/quote/HOOD
- 获取时间: 2026-02-05 21:30
- 当前股价: $76.25
- 今日涨跌: -3.2%
**解说词**:
1. xxx
2. xxx
...
⚠️ 股价等实时数据可能已发生变化,请确认是否需要更新。
请确认脚本内容是否准确,确认后将开始生成语音和图片。
只有用户确认后,才能继续执行后续步骤!
关键:生成连贯音频而非分段播放
# 1. 生成各段音频
for i in {1..N}; do
uv run python .claude/skills/volcengine-tts/scripts/tts.py "第i段文字" \
--voice BV002_streaming --output audio/segment_0${i}.mp3
done
# 2. 合并成一个连贯音频(重要!)
ffmpeg -i "concat:segment_01.mp3|segment_02.mp3|..." -acodec copy audio/full_audio.mp3
# 或使用文件列表方式合并
echo "file 'segment_01.mp3'" > list.txt
echo "file 'segment_02.mp3'" >> list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy audio/full_audio.mp3
根据 Step 1 脚本中的 mood 和 tag 搜索 (不要硬编码 "relaxing")。
# 示例:使用脚本中的变量
uv run python .claude/skills/bgm-search/scripts/search.py \
--mood "{script.meta.bgm_mood}" \
--tag "{script.meta.bgm_tag}" \
--duration "30-180" --limit 1 --download --output bgm/
使用 nanobanana-draw skill。
Prompt 构造规则:
Hand-drawn infographic illustration, sketchnote doodle style, black ink marker outlines...character_anchor (例如 simple stick figure with a red tie),确保主角形象统一。Prompt 构造模板: 将以下模板中的变量替换为 Step 1 脚本中的具体内容:
Hand-drawn infographic illustration, sketchnote doodle style, black ink marker outlines with spot pastel color highlights, white background,
featuring {script.meta.character_anchor}, {scene.description},
loose hand-drawn look, minimalist line art texture, expressive cute cartoon style, visual metaphors, [optional: with thought bubble containing simple icon related to the topic], [optional: with hand-written text label related to the topic connected by an arrow]
使用项目根目录的 Remotion 配置。
cd /项目根目录
npx remotion render StickmanXXX output/video.mp4 --codec=h264
Remotion 防闪烁规范 (参考 remotion-best-practices):
scene_id 变化时才应用淡入动画 (<SceneImage>),同场景内使用静态组件 (<StaticImage>)。// 分辨率必须是 960x720
<Composition
id="StickmanVideo"
width={960}
height={720}
fps={30}
...
/>
// 布局结构
<AbsoluteFill style={{ backgroundColor: '#f5f5f5' }}>
{/* 顶部标题栏 - 36px 高 */}
<div style={{ height: 36, backgroundColor: 'rgba(200,200,200,0.9)' }}>
<span style={{ color: '#333' }}>{title}</span>
<span style={{ color: '#d64541' }}>个人观点,无不良引导</span>
</div>
{/* 中间图片区域 */}
<div style={{ top: 36, bottom: 80 }}>
<Img src={currentImage} />
</div>
{/* 底部字幕条 - 80px 高 */}
<div style= , '(,,,)' }}>
{subtitle}
{/* 一个连贯的音频文件 */}
output/stickman-video/<topic>/
├── script.json # 解说词脚本
├── audio/
│ ├── segment_01.mp3 # 分段语音
│ ├── segment_02.mp3
│ ├── ...
│ └── full_audio.mp3 # 合并后的完整语音(关键!)
├── bgm/
│ └── background.mp3 # 背景音乐
├── images/
│ ├── scene_01.png # 场景图片
│ ├── scene_02.png
│ └── ...
└── 最终视频.mp4 # 960x720 H.264 编码
ffprobe -show_entries format=duration audio.mp3// 场景图片组件 - 带平滑过渡动画
const SceneImage: React.FC<{ imagePath: string; isNewScene: boolean }> = ({ imagePath, isNewScene }) => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
// 只有新场景才有动画
const opacity = isNewScene
? interpolate(frame, [0, fps * 0.3], [0, 1], { extrapolateRight: 'clamp' })
: 1;
// 轻微的缩放动画,让过渡更自然
const scale = isNewScene
? interpolate(frame, [0, fps * 0.4], [1.05, 1], { extrapolateRight: 'clamp' })
: 1;
return (
<div style={{ opacity, transform: `scale(${scale})` }}>
<Img src={staticFile(imagePath)} />
</div>
);
};
// 字幕:不要任何动画,直接显示
const Subtitle = () => (
);
isNewScene = segment. !== prevSegment?.;
--codec=h264(兼容性好,所有播放器都能直接播放)