mcpField
M
make-short

make-short

github.com/hassancs91创意与媒体35458 次安装12 周前更新
代码仓库

关于 make-short

make-short 是基于代码制作竖屏短视频的工作流,使用 Remotion。它引导创作者完成脚本、动画、逐帧质检、配音、音效及可选配乐,并为各阶段定义产物。

主要功能

  1. 01生成脚本和定时节拍数据
  2. 02用 TSX 构建竖屏 Remotion 合成
  3. 03最终输出前逐帧检查
  4. 04生成带逐词时间戳的配音
  5. 05规划并混合音效及可选配乐

适用场景

  1. 01无需实拍素材制作动画短视频
  2. 02将主题转化为定时视觉脚本
  3. 03添加同步配音与字幕
  4. 04为短视频试听音效和配乐

安装

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

$npx skills add https://github.com/hassancs91/claude-faceless-shorts-creator --skill make-short

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

详细介绍

make-short — 全 TSX 竖屏短视频,一站式制作

一切皆由代码生成:没有实拍素材,也没有图库素材。一条短视频 = 一个 Remotion 合成,由节拍契约驱动,渲染后再叠加配音和音效。已在 shorts/ 中的 12 条示例短视频里验证。创意库和细分领域排名见 IDEAS.md——选题时请先阅读,构思时也要持续扩充。

所有操作都从仓库根目录运行。工具仅使用 Python 3.10+ 标准库;ffmpeg/node 必须位于 PATH 中;API 密钥存放在 .env(参见 .env.example)。

成品规范

shorts/short-N-<niche>/
  script.md        — hook, beat sheet table (time | on screen | VO), production notes
  beats.json       — machine contract: format, vo[] (text+start/end+words), beats[], niche timeline
  voice/           — per-line TTS clips + voice.wav        (gen_voice.py)   [gitignored]
  sfx-plan.json    — cue sheet on the global timeline       (mix_sfx.py)
  output/          — short-N-sfx.mp4 (+ music auditions)                    [gitignored]
remotion/src/shots/short-N/
  ShortN<Name>.tsx — THE composition (registered by npm run gen)
  vo.gen.ts        — AUTO-GENERATED VO with exact word times (never hand-edit)

共享工具包:remotion/src/lib/shorts.tsx(Captions、Kicker、BigTitle、Stamp、PauseCard、StatChip、ProgressBar、ShortsBackdrop、安全区域、prog 辅助函数)。目前已有的细分领域库:lib/chess.tsx、lib/math.tsx、lib/algo.tsx、lib/sheet.tsx、lib/piano.tsx、lib/prob.tsx、lib/map.tsx、lib/orbit.tsx、lib/chart.tsx、lib/story.tsx……每条短视频最多新增一个细分领域库,并且要足够通用,能用于系列内容。

阶段 1 —— 脚本 + 节拍

节拍结构(约 38–42 秒):HOOK(0–3.4 秒,第 0 帧必须已完整构图——结论已经可见,不得从黑场淡入)→ SETUP → 可选的 QUIZ(PauseCard,约 2.5 秒——促进评论)→ REVEAL,分 2–4 步,每一步都与一个配音词同步 → TWIST → LOOP(最后一帧 = 第 0 帧,让结论溶解回开场,实现无缝循环播放)。

结尾——不要废话。 绝不要以老套的互动 CTA 收尾——不要问“接下来该做什么?”,不要说“在下方评论”,也不要问“想让我拆解哪一个”。这些听起来已经过时。以揭晓结论的台词结束,并让画面循环衔接回开场——循环回开场本身就是结尾。优先采用干净的画面溶解/重置,让最后一帧与第 0 帧完全一致。如果主题确实无法实现无缝循环,就直接以结论收尾,不要填充内容。不要拖长尾部:让合成在结论之后不久结束,不要留出几秒空白。

配音规则:总计约 100 个词;按约每秒 2.7 个词,并留出余量衔接下一行的起始时间来估算每行的时间窗口(时间安排过紧会导致听得出来的 atempo 压缩——每秒 3.3 个词需要压缩 1.3×;每秒 2.7 个词时峰值为 1.11×)。编写脚本前必须核实事实。撰写 script.md + beats.json(包含预计起止时间的配音行;细分领域时间轴使用全局秒数)。

阶段 2 —— 合成

  • 在 remotion/src/shots/short-N/ 下创建一个 .tsx 文件,设置 compositionConfig 为 1080×1920 @30,时长约 42 秒。遵循 vidtsx-2d-generator 的硬性规则(仅基于帧、范围单调递增、使用 Easing.bezier)。
  • 节拍 = 一个持续画布上的 <Sequence> 场景(棋盘/方程/数组负责保持连贯性——倒带和演变都发生在同一个组件的时间轴中,而不是通过剪切切换)。
  • 将 Captions lines={VO} + ProgressBar 挂载在 ROOT(全局时间),场景放在其下方。
  • 常见 bug:<Sequence> 内的帧是局部帧。 将全局节拍秒数转换为场景提示帧的公式是 local_f = global_s*fps − sequence_from。每个提示点都要检查两遍。
  • 第 0 帧规则:开场场景使用 warm props(BigTitle/EqRow),并使用负数 at,确保高亮/印章在 f0 时已显示。循环场景要反转开场的强调缩放(settle 1.06→1,而非 grow 1→1.06),以确保视频无缝循环。
  • 安全区域:字幕块居中于 y1500 附近;底部 340px / 右侧 160px 区域内不得放置关键内容。

阶段 3 —— QA(不要跳过,每次都能发现实际问题)

cd remotion && npm run gen        # frames.mjs does NOT run gen-registry itself
node scripts/frames.mjs ShortNName 0,<beat-boundaries+hero-frames>,<last> --scale=0.5

逐张检查所有 PNG(按手机屏幕大小查看)。检查清单:第 0 帧构图完整且适合做缩略图 · 每次揭晓都与对应节拍同步 · 没有内容遮挡结论元素 · Kicker 随旁白切换 · 字幕避开 UI 区域 · 循环帧 ≈ 第 0 帧。修复并重新渲染帧,然后才执行:

node scripts/render-all.mjs ShortNName --scale=1     # -> remotion/out/ShortNName.mp4

阶段 4 — 配音(ElevenLabs,逐词精确字幕)

python tools/gen_voice.py --beats shorts/short-N-<niche>/beats.json \
    --voice TX3LPaxmHKxFdv7VOQHJ --emit-ts remotion/src/shots/short-N/vo.gen.ts
  • 逐行使用 /with-timestamps 进行 TTS → 写入 beats.json 和 vo.gen.ts 的是真实逐词时间戳(经过速度缩放,且为全局时间戳)。镜头导入 { VO } from './vo.gen',字幕随后会在准确的读词时刻高亮。只要存在配音轨,就绝不估算。
  • 片段按文本哈希缓存:只重写一行,只会对该行重新计费。
  • 配音:示例使用 ElevenLabs 预设音色 “Liam” (TX3LPaxmHKxFdv7VOQHJ);使用 --voice 标志指定任意音色(包括你自己的克隆音色),然后重新生成。
  • 然后重新渲染合成内容(字幕时序会重新调整),并进行混流: ffmpeg -i remotion/out/<Id>.mp4 -i shorts/.../voice/voice.wav -map 0:v -map 1:a -c:v copy -c:a aac -b:a 192k -t 42 remotion/out/<Id>-voiced.mp4

阶段 5 — 音效(suggest-sfx 机制,短视频版本)

阅读 brand.md §7 和 media/library/sfx/catalog.json。优先使用素材库;只有确实找不到合适音效时,才将通用方案添加到 palette.json,并运行 python tools/gen_sfx.py。编写 shorts/short-N-<niche>/sfx-plan.json(preview = -voiced.mp4,out = output/short-N-sfx.mp4)。

短视频风格调整:场景内动作音效就是内容本身(棋子落下的闷响、数字弹出的声音),密度可以高于长视频;装饰性提示音保持 optional: true;为 2–3 个主要时刻叠加音效(抓取+盖章、移动飞行+落地+提示音)。提示音时间取自精确的落地帧: at_s = (move.at + move.dur + sequence_from) / fps。

PYTHONIOENCODING=utf-8 python tools/mix_sfx.py shorts/short-N-<niche>/sfx-plan.json --print
PYTHONIOENCODING=utf-8 python tools/mix_sfx.py shorts/short-N-<niche>/sfx-plan.json

混音只是试听版——在将任何内容称为最终版之前,用户的听觉体验是审核关卡。 之后更新 catalog 中的 used_in。

阶段 6 — 音乐(可选,每条视频单独处理)

media/library/music/ 中的素材库配乐(使用 gen_music.py 扩充)。在音效混音上试听: python tools/mix_music.py --all --base shorts/short-N-<niche>/output/short-N-sfx.mp4 (或使用 --bed <id>)。配音下方会进行强力降音。

完成标准 =

已编写 script.md + beats.json(事实已核实)· 已逐帧完成合成内容 QA · 已按 1 倍比例渲染 · 已生成配音并配上逐词精确字幕,且已混流 · 已编写音效计划并完成试听混音(约 −15.5 LUFS,等待用户试听)· 已更新素材库中的 used_in · 已更新 IDEAS.md 队列。

评论

支持 Markdown