Talking-Head Short — 竖版口播短视频编辑器
回复力求简洁。不要重复输出转录文本或长日志。使用编辑工具直接修改 spec.json,切勿重写。每个脚本都会输出简洁的报告;阅读、执行、继续。
S=<this skill dir>/scripts,WD=<work dir next to the raw file>/ths_<name>。
0. 环境设置(每台机器/sandbox 只需一次)
bash $S/setup.sh
→ 使用输出的 PY=。该脚本会自动从 PyPI 安装所有依赖,包括一个静态 ffmpeg(如果不存在的话)。
每个下载都有自动的备用方案。Sandbox(claude.ai 代码执行,免费或付费)通常屏蔽 HuggingFace、Mixkit 和 Google Fonts API,但允许 GitHub:
- 转录模型:HuggingFace → GitHub 镜像(whisper-base,然后是 whisper-tiny)
- 音乐/音效:Mixkit → GitHub 镜像 CC0 包(ID 像
pack:lofi_chill) - 字体:Google Fonts 仓库 → jsDelivr → GitHub 镜像 OFL 包(32 种字体家族)→ 系统字体
- B 卷素材:Mixkit → 无(使用卡片,或请用户上传片段)
如果设置输出“无网络”/pip 失败:说明 sandbox 的网络出站已关闭。请明确告知用户(一条消息):
“claude.ai → 设置 → 扩展功能 → 代码执行 → 网络访问:所有域名(或添加:pypi.org, files.pythonhosted.org, github.com, objects.githubusercontent.com, release-assets.githubusercontent.com, api.github.com, raw.githubusercontent.com, cdn.jsdelivr.net, huggingface.co, mixkit.co, assets.mixkit.co),然后开启一个新聊天并再次运行 /talking-head-short。” 在没有 numpy/ffmpeg 的情况下不要尝试编辑。
仅当所有来源都失败时:请求用户粘贴转录文本 →
$PY $S/align_text.py $WD transcript.txt。资源缓存到~/.ths_assets。
1. 分析视频
$PY $S/analyze.py RAW $WD
它会输出分辨率、视线点、净长度、自动移除的填充词/结巴/重复开头、CHECK(软填充词、低置信度词、长停顿)以及每 8 个词带时间戳的 TEXT。
- 自行判断不良镜头。 移除错误的开头、未完成的句子、“嗯 那个 就是”、“有点”。保留修辞性重复。使用
--remove '[[s,e],...]'(源秒数)重新运行。转录文本会被缓存。 - 仅当视线点或构图有疑问时才查看
$WD/frames.jpg。
2. 构思(在心里完成,然后向用户输出 4 行)
写出:主题 · 核心信息 · 情感弧(钩子 → … → 收尾)· 类型行(来自 NICHES)· 语调(平静/平衡/充满活力)· 原始构图(广角或近景)。 然后运行:
$PY $S/style.py RAW "<niche>" --out $WD/style.json
它会给出适配的调色板(附理由)、字体、动态图形/B 卷/音乐/音效方向以及重要注释。
阅读 references/craft.md(规则)和 references/spec.md(规范格式)。
3. 构建前先询问用户(切勿直接渲染)
如果可用则使用 AskUserQuestion;否则发送一条紧凑的编号消息。每次推荐选项 1。
- 风格: 检测到的类型 + 语调(例如“自我提升 · 平静内省”)vs 1-2 个备选。
- 字体: 该行的字体对 vs 2 个具有清晰风格对比的备选(无衬线主字体 + 有衬线/斜体关键字体,或粗体无衬线关键字体 + 斜体有衬线强调字体)。
- 调色板: 基于视频的该行调色板 vs 基于视频的调色板 vs 用户提供的品牌颜色。
- 视觉密度: 极简(字幕 + 2-3 张卡片)· 均衡(字幕 + 4-6 张卡片/B 卷)· 丰富(更多动态图形 + B 卷)。
- 音乐: 3 首授权候选,来自
$PY $S/assets.py music "<mood>"(ID · 标题 · 标签),或无。 - B 卷: 是(匹配特定台词的授权素材)/ 否。 跳过用户已经回答的问题。等待用户选择。
4. 收集资源
- 字体:
$PY $S/assets.py font "Family" ... - 音乐、音效、视频:运行
assets.py music|sfx|video "<query>"列出,然后assets.py get <kind> <id> $WD。- 音效按语调:平静 → "air woosh","chime";平衡 → "whoosh","pop";充满活力 → "swoosh","impact"(各使用一次)。
- 被屏蔽的来源会自动回退(包 ID)。
assets.py pack列出整个离线 CC0 包。
5. 编写 spec.json、计划、风格帧
- 编写
$WD/spec.json(参见 references/spec.md):按说话顺序排列字幕,在合适子句上放置卡片,配置音频。 $PY $S/engine.py $WD --plan→ 通过编辑 spec 修复每个 ISSUE(缩短或合并节拍,移动或删除卡片下方的字幕),然后重新计划直到报告无问题或仅剩可接受的问题。$PY $S/engine.py $WD --frames t1,...选择 10-15 个时间点:每个卡片的中间点和结束点减 0.3 秒,以及每个字幕的结束点减 0.1 秒。查看$WD/styleframes.jpg并修复任何画面被裁剪、拥挤、错位或偏离调色板的问题。- 向用户展示风格帧,附带一行说明(“可以渲染了吗?”)。仅根据用户指出的问题进行迭代。
6. 渲染、混音、质检
bash $S/render.sh $PY $WD并行渲染各片段并拼接(笔记本电脑上每分钟视频约需 5 分钟)。在命令有时间限制的 sandbox 中,分别运行$PY $S/engine.py $WD --render --part i/N每个部分,然后运行--concat N。$PY $S/mix.py $WD→final.mp4(人声清理、对齐收尾的音频闪避、音效、-14 LUFS)。$PY $S/qa.py $WD→ 查看qa_endframes.jpg。每个节拍和卡片结尾必须显示完整的文本和动画。不允许有闪烁帧。- 提供文件路径,以及 3 行关于你所选择的内容及其原因。提及任何无法下载的资源。
不可妥协的规则(原因:每一条都被认为是业余的表现)
- 字幕绝不能截断。主字体宽度 ≤ 关键字体宽度且位置靠近。两种对比字体样式采用黄金比例。绝不在孤独的填充词上添加字幕。
- 动态图形展示含义,在场景变化前完成动画,并保持统一的视觉系统。不使用简笔画或剪贴画。
- 平滑:镜头切换有缓动效果且锁定视线;无闪烁帧;多样化转场。
- 仅做色彩校正。仅使用授权资源(Mixkit / Google Fonts OFL),并在
$WD中保留LICENSES.txt。