mcpField
S
shorts

shorts

github.com/agricidaniel创意与媒体245195 次安装29 周前更新
代码仓库

关于 shorts

shorts 是一项交互式技能,可将源视频制作成带动画字幕的竖屏短片。它涵盖转录分析、片段审核、渲染和针对平台的导出。

主要功能

  1. 0110 步视频短片制作流程
  2. 02逐词转录与文本清理
  3. 03评分筛选片段并审核
  4. 04按音频调整剪辑边界
  5. 05动画字幕与竖屏重构
  6. 06平台专属导出与验证

适用场景

  1. 01从长视频中挑选精彩片段
  2. 02为社交平台制作竖屏短片
  3. 03渲染前审核并调整片段边界

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/agricidaniel/claude-shorts --skill shorts

安装后在 Claude Code 中输入/shorts确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.gitignore
CLAUDE.md
LICENSE
CHANGELOG.md
CODE_OF_CONDUCT.md
README.md
CONTRIBUTING.md
SECURITY.md
install.sh
.claude-plugin/
plugin.json
.github/
PULL_REQUEST_TEMPLATE.md
dependabot.yml
release.yml
.github/ISSUE_TEMPLATE/
bug_report.yml
config.yml
feature_request.yml
references/
caption-styles.md
platform-specs.md
scoring-rubric.md
remotion-patterns.md
remotion/
package.json
package-lock.json
render.mjs
remotion.config.ts
remotion/public/fonts/
OFL.txt
remotion/src/
ShortVideo.tsx
Root.tsx
remotion/src/components/
BoldCaptions.tsx
HookOverlay.tsx
CleanCaptions.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[] 数组,然后:

  1. 删除填充词(嗯、呃、你知道、像、有点、我的意思是、对吧、基本上、实际上)
  2. 根据上下文修正明显的转录错误
  3. 适当合并不完整的句子片段
  4. 保持所有时间戳不变——仅修改 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 询问用户:

  1. 选择哪些片段? — “全部”、指定编号,或“都不选,重新分析”
  2. 字幕样式? — bold(全大写,弹入效果)、bounce(活泼多彩)、clean(极简淡入)
  3. 平台? — 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

脚本会:

  1. 从转录文本中加载单词级时间戳
  2. 将开始时间对齐到最近的单词边界(优先选择句子开头)
  3. 如果 3 秒内能到达下一个句子边界(. ? !),则将结束时间延长至该边界
  4. 在最后一个单词后增加 300ms 的缓冲
  5. 使用 FFmpeg silencedetect 查找切点附近的自然停顿
  6. 强制时长不短于 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/

渲染脚本会:

  1. 打包一次 Remotion 项目(约 5-10s)
  2. 打开一个共享的 Chrome 实例
  3. 按顺序渲染每个片段(每个约 15-30s)
  4. 输出 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 秒。 如果任何文件未通过检查,向用户报告问题。交付前应重新渲染或重新导出未通过的文件。

重要规则

  1. 始终先运行预检,再进行任何处理
  2. 始终将片段提交用户审批——未经用户确认,绝不自动渲染
  3. 始终报告费用——Remotion 渲染是免费的(本地渲染),唯一可能产生的费用是 GPU 电力消耗
  4. 妥善处理错误——如果任何步骤失败,报告错误并建议修复方法
  5. 成功后清理——导出后询问是否删除 $SHORTS_TMP/
  6. 尊重用户的选择——如果用户说“重新分析”,返回第 4 步
  7. 提取时使用流复制——切分片段时绝不重新编码(使用 -c copy)
  8. 渲染期间一次处理一个片段,以便报告进度
  9. 按需加载参考资料——第 4 步加载 scoring-rubric.md,讨论样式时加载 caption-styles.md

字幕样式参考

样式字体效果适用场景
boldMontserrat Bold全大写、弹入效果、高亮当前单词商业、教育、励志
bounceBangers弹跳缩放、明亮颜色轮换娱乐、反应类、活力内容
cleanInter Bold极简淡入、白字加阴影专业、平和、访谈

加载 references/caption-styles.md,查看详细的视觉规格和弹簧配置。

可配置参数

对于大多数内容,这些默认值都适用。如果用户有特定需求,请提供替代方案。

参数默认值标志/变量何时更改
Whisper 模型large-v3--model smallVRAM 较小(< 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 检查

评论

支持 Markdown