关于 shorts
shorts 是一项交互式技能,可将源视频制作成带动画字幕的竖屏短片。它涵盖转录分析、片段审核、渲染和针对平台的导出。
主要功能
- 0110 步视频短片制作流程
- 02逐词转录与文本清理
- 03评分筛选片段并审核
- 04按音频调整剪辑边界
- 05动画字幕与竖屏重构
- 06平台专属导出与验证
适用场景
- 01从长视频中挑选精彩片段
- 02为社交平台制作竖屏短片
- 03渲染前审核并调整片段边界
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ agricidaniel/ claude-shorts --skill shorts安装后在 Claude Code 中输入/shorts确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.gitignoreCLAUDE.mdLICENSECHANGELOG.mdCODE_OF_CONDUCT.mdREADME.mdCONTRIBUTING.mdSECURITY.mdinstall.sh.claude-plugin/plugin.json.github/PULL_REQUEST_TEMPLATE.mddependabot.ymlrelease.yml.github/ISSUE_TEMPLATE/bug_report.ymlconfig.ymlfeature_request.ymlreferences/caption-styles.mdplatform-specs.mdscoring-rubric.mdremotion-patterns.mdremotion/package.jsonpackage-lock.jsonrender.mjsremotion.config.tsremotion/public/fonts/OFL.txtremotion/src/ShortVideo.tsxRoot.tsxremotion/src/components/BoldCaptions.tsxHookOverlay.tsxCleanCaptions.tsx详细介绍
shorts — 交互式短视频创作工具
你是一名交互式短视频制作人。你将引导用户完成一个 10 步流程,由你(Claude)分析转录文本、找出最佳片段、提交审核、将边界调整到自然的音频切点,并渲染带有动态字幕的高品质竖屏视频。
准备工作
开始前,定位项目根目录:
# Try common locations in priority order
SHORTS_ROOT=""
for dir in "$HOME/.claude/skills/shorts" "$HOME/.claude/skills/claude-shorts" "$HOME/claude-shorts" "$(pwd)"; do
if [ -f "$dir/SKILL.md" ]; then
SHORTS_ROOT="$dir"
break
fi
done
if [ -z "$SHORTS_ROOT" ]; then
echo "ERROR: shorts skill project root not found. Please run from the project directory or install with install.sh"
fi
设置临时目录(可通过 SHORTS_TMP 环境变量进行配置):
SHORTS_TMP="${SHORTS_TMP:-/tmp/claude-shorts}"
mkdir -p "$SHORTS_TMP/clips"
10 步交互式流程
第 1 步:预检
对输入视频运行安全检查:
bash "$SHORTS_ROOT/scripts/preflight.sh" INPUT_FILE [OUTPUT_DIR]
如果预检失败,报告错误并停止。如果有警告,报告警告并询问用户是否继续。
同时检测 GPU 能力:
bash "$SHORTS_ROOT/scripts/detect_gpu.sh"
向用户报告:输入视频时长、分辨率、GPU 状态、预计处理时间。
第 2 步:转录
使用 faster-whisper 进行转录(GPU 加速,提供词级时间戳)。 音频提取由 transcribe.py 在内部处理:
VENV="$HOME/.video-skill"
[ -d "$VENV" ] || VENV="$HOME/.shorts-skill"
source "$VENV/bin/activate"
python3 "$SHORTS_ROOT/scripts/transcribe.py" INPUT_FILE \
--output $SHORTS_TMP/transcript.json
输出为双格式 JSON:
segments[]— WhisperX 风格,带有词级时间戳(供 Claude 阅读)captions[]— Remotion 原生{text, startMs, endMs}数组(用于渲染)
向用户报告:转录耗时、词数、检测到的语言。
第 3 步:检测内容类型
自动检测视频是对镜头讲话、屏幕录制还是播客:
python3 "$SHORTS_ROOT/scripts/detect_content.py" INPUT_FILE \
--output $SHORTS_TMP/content_type.json
向用户报告检测到的类型,并询问是否要覆盖该类型。
- 对镜头讲话:跟踪人脸,将画面居中裁切为 9:16
- 屏幕录制:带黑边的布局(内容居中,周围为深色留白)
- 播客:并排跟踪讲话者,或将画面居中裁切
第 4 步:分析 — Claude 阅读转录文本
直接阅读完整转录文本:
Read $SHORTS_TMP/transcript.json
同时加载评分标准:
Read $SHORTS_ROOT/references/scoring-rubric.md
按 5 个维度为 8-12 个候选片段评分(每段 15-55 秒):
| 维度 | 权重 | 评估要点 |
|---|---|---|
| 开场吸引力 | 0.30 | 大胆断言、悬念、价值承诺、打破常规 |
| 独立完整性 | 0.25 | 不依赖视频其他部分的上下文,也能完整表达意思 |
| 情绪强度 | 0.20 | 鲜明观点、意外揭示、幽默、热情 |
| 价值密度 | 0.15 | 每秒包含的可操作见解、数据点、框架 |
| 收尾质量 | 0.10 | 令人满意的结尾——妙语、揭示、行动号召 |
加权分数 = 各维度分数乘以对应权重后求和,范围为 0-100。
对每个候选片段,确定:
- 开始/结束时间戳(精确到秒)
- 建议的开场文案(叠加在画面上的前 3 秒文字)
- 简短理由(用 1 句话说明此片段为何有效)
**清理转录文本:**分析时,同时生成用于渲染的清理后字幕。
从 transcript.json 中读取 captions[] 数组,然后:
- 删除填充词(嗯、呃、你知道、像、有点、我的意思是、对吧、基本上、实际上)
- 根据上下文修正明显的转录错误
- 适当合并不完整的句子片段
- 保持所有时间戳不变——仅修改
text字段
使用与 transcript.json 相同的 JSON 结构(包含 segments 和 captions 数组),将清理后的转录文本写入 $SHORTS_TMP/transcript_cleaned.json。captions 数组应包含清理后的文本;segments 保持原样复制。
第 5 步:展示 — 交互式呈现候选片段
以格式化表格呈现候选片段:
| # | Time | Dur | Score | Hook | Why |
|---|---------------|------|-------|-----------------------------------|----------------------------------------|
| 1 | 04:22 → 05:01 | 39s | 87 | "Nobody talks about this..." | Contrarian take with data backing |
| 2 | 12:45 → 13:28 | 43s | 82 | "Here's the exact framework..." | Complete actionable method, clean arc |
| 3 | 08:11 → 08:52 | 41s | 79 | "I tested this for 6 months..." | Personal story + surprising result |
然后使用 AskUserQuestion 询问用户:
- 选择哪些片段? — “全部”、指定编号,或“都不选,重新分析”
- 字幕样式? — bold(全大写,弹入效果)、bounce(活泼多彩)、clean(极简淡入)
- 平台? — youtube、tiktok、instagram 或全部
第 6 步:批准 — 交互式调整循环
用户选择片段后:
- 显示选中的片段及其精确时间戳
- 允许调整时间码(例如:“将片段 2 的开始时间提前 3 秒”)
- 确认最终选择
- 预估渲染时间(使用 Remotion 时,每个片段约需 15-30 秒)
将已批准的片段写入:
cat > $SHORTS_TMP/approved_segments.json << 'EOF'
{
"segments": [
{
"id": 1,
"start": 262.0,
"end": 301.0,
"hook_line1": "Nobody talks about this...",
"hook_line2": "The hidden cost of scaling",
"score": 87
}
],
"style": "bold",
"platform": "all",
"content_type": "talking-head"
}
EOF
第 7 步:对齐边界 — 音频感知切点
将片段边界对齐到自然的音频切点,避免在单词或句子中间截断:
python3 "$SHORTS_ROOT/scripts/snap_boundaries.py" \
--segments $SHORTS_TMP/approved_segments.json \
--transcript $SHORTS_TMP/transcript.json \
--input-video INPUT_FILE \
--output $SHORTS_TMP/snapped_segments.json
脚本会:
- 从转录文本中加载单词级时间戳
- 将开始时间对齐到最近的单词边界(优先选择句子开头)
- 如果 3 秒内能到达下一个句子边界(. ? !),则将结束时间延长至该边界
- 在最后一个单词后增加 300ms 的缓冲
- 使用 FFmpeg silencedetect 查找切点附近的自然停顿
- 强制时长不短于 5s、不长于 60s,并限制在视频范围内
使用 --no-silence 跳过静音检测(速度更快,仅对齐单词边界)。
向用户报告:每个片段的调整幅度(例如,“开始时间 +150ms,结束时间 +362ms”)。
从此步骤起,使用 snapped_segments.json 替代 approved_segments.json。
第 8 步:准备 — 提取片段并计算重新构图
通过 FFmpeg 流复制提取每个已对齐的片段(近乎即时、无损)。
使用 $SHORTS_TMP/snapped_segments.json 中已对齐的开始和结束时间:
ffmpeg -y -ss START -to END -i INPUT_FILE -c copy \
$SHORTS_TMP/clips/clip_01.mp4
为每个片段计算重新构图坐标:
python3 "$SHORTS_ROOT/scripts/compute_reframe.py" \
--clips-dir $SHORTS_TMP/clips/ \
--content-type CONTENT_TYPE \
--output $SHORTS_TMP/reframe.json
向用户报告:已提取的片段、每个片段的内容类型和重新构图策略。
第 9 步:通过 Remotion 渲染
使用选定的字幕样式渲染所有已对齐的片段:
node "$SHORTS_ROOT/remotion/render.mjs" \
--segments $SHORTS_TMP/snapped_segments.json \
--reframe $SHORTS_TMP/reframe.json \
--captions $SHORTS_TMP/transcript_cleaned.json \
--style STYLE \
--clips-dir $SHORTS_TMP/clips/ \
--output-dir $SHORTS_TMP/render/
渲染脚本会:
- 打包一次 Remotion 项目(约 5-10s)
- 打开一个共享的 Chrome 实例
- 按顺序渲染每个片段(每个约 15-30s)
- 输出 1080x1920 MP4 文件
每渲染完一个片段,就向用户报告进度。
第 10 步:导出 — 针对平台优化编码
使用针对平台优化的编码设置导出渲染完成的短视频:
bash "$SHORTS_ROOT/scripts/export.sh" \
--input-dir $SHORTS_TMP/render/ \
--platform PLATFORM \
--output-dir ./shorts/
平台编码规格:
- YouTube Shorts:H.264 High 4.2,12 Mbps,AAC 192k
- TikTok:H.264,CRF 18,-preset slow,AAC 128k
- Instagram Reels:H.264 High 4.2,最高码率 4.5 Mbps,maxrate 5000k,AAC 128k
- 全部:为每个片段导出全部三个版本
使用 NVENC GPU 时:采用 h264_nvenc -preset p5 -tune hq,编码速度可提升 5-10 倍。
展示最终汇总表:
| # | File | Platform | Duration | Size |
|---|---------------------------|-----------|----------|--------|
| 1 | shorts/short_01_yt.mp4 | YouTube | 39s | 12.3MB |
| 1 | shorts/short_01_tt.mp4 | TikTok | 39s | 8.7MB |
| 1 | shorts/short_01_ig.mp4 | Instagram | 39s | 7.1MB |
**导出后验证:**验证所有导出的文件:
bash "$SHORTS_ROOT/scripts/validate.sh" --output-dir ./shorts/
检查项:文件可播放、分辨率为 1080x1920、存在音轨且音轨并非静音、文件大小符合平台限制、视频编码为 H.264、时长为 3-90 秒。 如果任何文件未通过检查,向用户报告问题。交付前应重新渲染或重新导出未通过的文件。
重要规则
- 始终先运行预检,再进行任何处理
- 始终将片段提交用户审批——未经用户确认,绝不自动渲染
- 始终报告费用——Remotion 渲染是免费的(本地渲染),唯一可能产生的费用是 GPU 电力消耗
- 妥善处理错误——如果任何步骤失败,报告错误并建议修复方法
- 成功后清理——导出后询问是否删除 $SHORTS_TMP/
- 尊重用户的选择——如果用户说“重新分析”,返回第 4 步
- 提取时使用流复制——切分片段时绝不重新编码(使用 -c copy)
- 渲染期间一次处理一个片段,以便报告进度
- 按需加载参考资料——第 4 步加载 scoring-rubric.md,讨论样式时加载 caption-styles.md
字幕样式参考
| 样式 | 字体 | 效果 | 适用场景 |
|---|---|---|---|
| bold | Montserrat Bold | 全大写、弹入效果、高亮当前单词 | 商业、教育、励志 |
| bounce | Bangers | 弹跳缩放、明亮颜色轮换 | 娱乐、反应类、活力内容 |
| clean | Inter Bold | 极简淡入、白字加阴影 | 专业、平和、访谈 |
加载 references/caption-styles.md,查看详细的视觉规格和弹簧配置。
可配置参数
对于大多数内容,这些默认值都适用。如果用户有特定需求,请提供替代方案。
| 参数 | 默认值 | 标志/变量 | 何时更改 |
|---|---|---|---|
| Whisper 模型 | large-v3 | --model small | VRAM 较小(< 6 GB) |
| 屏幕缩放 | 0.55 | --zoom 0.4 | 让屏幕录制中显示更多内容 |
| 光标跟踪 | 已启用 | --no-cursor-track | 静态屏幕内容(幻灯片、文档) |
| 静音检测 | 已启用 | --no-silence | 加快处理速度,仅按词边界吸附 |
| 分数阈值 | 60 | (SKILL.md 指令) | 对于时长较长、精彩片段较少的视频,可调低阈值 |
| 片段时长 | 15-55s | (SKILL.md 指令) | 根据平台调整(TikTok 更适合 21-34s) |
| 临时目录 | /tmp/claude-shorts/ | SHORTS_TMP 环境变量 | /tmp 空间有限的系统 |
| 导出平台 | all | --platform youtube | 仅针对单个平台 |
错误恢复
- 转录失败:检查 venv 是否已激活;如果 VRAM 较小,请尝试
--model small - Remotion 渲染失败:检查是否已运行
cd remotion && npm install,并确认 node_modules 存在 - 导出失败:检查 FFmpeg 版本(
ffmpeg -version);如果 NVENC 失败,请尝试 CPU 编码 - 磁盘空间不足:清理 $SHORTS_TMP/,使用
df -h /tmp检查