视频制作全链路:素材入库 → 剧本冻结 → 全局配音 → 对齐 → 渲染 → 审查 → 交付。 Use when: 做视频、做 showcase、做教程视频、录屏剪辑、video review、节奏审查。 Not for: 纯代码开发(用 worktree/tdd)、纯文档写作(直接写)、PPT(用 ppt-forge)。 Output: schema 驱动的视频成片 + 多猫审查通过 + 可发布。
76
96%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
关联 Feature: F138 Video Studio 技术收敛纪要: 2026-04-05 三猫收敛
视频不是一只猫的活,是多猫流水线 + operator素材。 角色按当前 roster 可用猫分配。
| 路径 B:先脚本后素材 | 路径 A:先素材后配音 | |
|---|---|---|
| 触发 | "做个 showcase/教程视频" | "这段录屏帮我配个音" |
| 人的输入 | 分镜脚本 + 素材 + 粗标 | 原始视频 + 风格关键词 |
| spec 来源 | 人写 | 模型生成(PySceneDetect + VLM) |
| Phase | Phase 1 主攻 | Phase 3 引入 |
两条路径共享同一套 segment contract + 渲染层。
| 参数 | 说明 | 示例 |
|---|---|---|
| 类型 | 视频类型 | showcase / 教程 / 攻防战 / 播客 |
| 时长目标 | 成片目标时长 | 60s / 3min / 6-8min |
| 调性 | 整体情绪基调 | 真实生活感 / 高燃极客 / 温馨猫咖 |
| 受众 | 谁看这个视频 | linux.do 社区 / B 站观众 / 内部 |
| 配音方案 | 猫猫配音 / 纯字幕 / 原声 | 单猫旁白 / 多猫声线 / 无配音 |
没有开局参数 = 审查没有标准。开工前必须和operator确认。
| 触发 | 场景 | 主导 | 说明 |
|---|---|---|---|
| operator说"做个视频" | A: Brief + 素材盘点 | 主执行猫 | 确认开局参数 + 分镜表 + 素材需求清单 |
| operator确认分镜 | B: 素材入库 | operator录 + 主执行猫压缩归档 | 素材放 docs/videos/{project}/assets/,粗标写 asset-markers.md |
| 素材到齐 | C: video-spec 冻结 | 主执行猫 | 写 video-spec JSON(4 层 segment contract),operator确认 |
| spec 确认 | D: 全局配音 + 对齐 | 主执行猫 | CosyVoice 全局配音 → Qwen3-ForcedAligner → word_timestamps |
| 对齐完成 | E: Remotion 渲染 | 主执行猫 | schema → inputProps → preview render |
| 预览版出来 | F: 审查 Gate | 全部参与猫 + operator | 见下方审查标准 |
| 审查通过 | G: Final Render + 交付 | 主执行猫 | 高质量渲染 + 封面导出 + 发布 |
| operator不满意 | R: Patch Loop | 主执行猫 + 视觉把关猫 | retiming / 重录 / 重写段落 |
| 级别 | 维度 | 判定 |
|---|---|---|
| P1 | 配音和画面脱节 | 说到 X 时画面不是 X |
| P1 | 时间戳偏移 | 字幕和声音对不上(>200ms) |
| P1 | 音频断裂 | 段间有不自然的静音或跳跃 |
| P2 | 音量不均 | 原声和配音音量差异大 |
| 级别 | 维度 | 判定 |
|---|---|---|
| P1 | 暴力慢放 | 画面被强行降速拉伸,卡顿拖沓 |
| P1 | 节奏断裂 | 高燃段突然变慢 / 温馨段突然快切 |
| P2 | vibe 不连贯 | 整体情绪没有起承转合 |
| P2 | 字幕风格不一致 | 不同段落字幕样式混乱 |
| 级别 | 维度 | 判定 |
|---|---|---|
| P1 | 事实错误 | 展示的功能/数据不对 |
| P1 | 敏感信息泄露 | 截图里有 token / API key / 私人信息 |
| P2 | 画面选取不佳 | "这段换个更好的片段" |
当素材来源是 AI 生成(而非人工录制)时,使用可用的视频生成工具(如 MCP 提供的 text2video / image2video 能力)。
AI 视频生成 API 通常有单次时长限制(如 4-6 秒)。不要试图用一次调用生成完整长视频。
目标时长超过单次限制时:
docs/videos/{project}/assets/ 目录# 简单拼接(同编码格式)
ffmpeg -f concat -safe 0 -i segments.txt -c copy output.mp4
# 需要重编码时(不同分辨率/编码)
ffmpeg -f concat -safe 0 -i segments.txt -c:v libx264 -crf 23 -c:a aac output.mp4多段生成是正常的。假连续性不是。
拼接前先分类目标输出:
| 类型 | 定义 | 拼接约束 |
|---|---|---|
| Montage | 显式多镜头序列 | 异源片段正常;转场可见且有意 |
| Pseudo-one-shot | 伪一镜到底 / 连续动作 | 必须通过连续性检查(见 refs/continuity.md) |
核心边界:concat、xfade、crop、grading 是收尾工具,不是连续性修复工具。源片段不兼容时,后处理可以打磨接缝,但不能把它当作连续性的证明。
成片后、final render 前,逐接缝回答 5 问:
任一项 "否" → 不能宣称 pseudo-one-shot → 走降级路径(见 refs/continuity.md)。
详细的事前预测清单、降级路径和 15s 典型失败案例见
refs/continuity.md。
docs/videos/{project-name}/
├── asset-markers.md ← 素材标注表(operator + 主执行猫共同编辑)
├── video-spec.json ← segment contract(主执行猫生成)
├── voice-script.md ← 配音剧本(主执行猫草稿 + operator确认)
└── assets/ ← 原始素材(gitignore, 仅本地)
├── 1-xxx.mov
├── 2-xxx.mov
└── ...ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4
# 目标:1080p, CRF 23, AAC 128k时间 | 画面内容
0:00 - 0:50 | operator在打字
0:50 - 1:20 | Ragdoll开始回复,1:20 Maine Coon跟上当配音长度和画面长度不匹配时,按以下优先级选择策略:
| 优先级 | 策略 | 说明 | 适用场景 |
|---|---|---|---|
| 1 | TRIM | 裁剪多余部分 | 画面比配音长 |
| 2 | FREEZE_STYLIZED | 定格末帧 + 毛玻璃/排版 | 配音比画面长,差距小 |
| 3 | B_ROLL | 插入空镜/截图/动效 | 配音比画面长,差距大 |
| 4 | SLOW_MO | 适度降速(≥0.7x) | 仅当画面本身适合慢放 |
| 5 | LOOP | 往复循环 | 最后手段 |
绝对不允许 <0.7x 的慢放。 如果需要填充超过 30% 的时间差,必须用 B_ROLL 或 FREEZE_STYLIZED。
| 错误 | 修正 |
|---|---|
| TTS 逐段切碎生成 | 完整剧本全局配音,forced alignment 分段 |
| 赌 TTS 原生 timestamps | 用 Qwen3-ForcedAligner / WhisperX |
| 画面不够就暴力慢放 | 按 retiming 优先级处理 |
| 没压缩就用原始素材 | 入库前统一压缩(CRF 23) |
| segment contract 扁平不分层 | 4 层:source/narration/render/control |
| 加速后沿用原始时间轴切段 | 加速会压缩时长,后续段的起始时间必须重新计算。 例:A 段原 130s 以 2x 输出 65s,B 段在 final timeline 从 65s 开始而非 130s。用 output duration 逐段累加,不要用 source timestamps 直接拼 |
| 只加速长等待段忽略短等待 | 分段不够细时,"Thinking"状态可能散落在多个区间里。逐段审素材,把所有等待态都标出来分别处理 |
生成的视频必须在 Console 中内联可看,不要只贴 URL 或本地路径。
/uploads/... URL → 优先用 kind:"file" rich block,mimeType:"video/mp4"。Web UI 会直接渲染内联 <video> 播放器,并进入 artifact 索引kind:"file";若你明确要 autoplay muted,再退回 html_widget + <video>/uploads/...,再发 rich block;不要直接贴源码路径cat_cafe_create_rich_block({
block: JSON.stringify({
id: "video-<唯一标识>",
kind: "file",
v: 1,
url: "/uploads/final-cut.mp4",
fileName: "final-cut.mp4",
mimeType: "video/mp4"
})
})cat_cafe_create_rich_block({
block: JSON.stringify({
id: "video-<唯一标识>",
kind: "html_widget",
v: 1,
title: "视频标题",
height: 420,
html: "<video controls autoplay muted playsinline style='width:100%;max-width:720px;border-radius:12px'><source src='<resultUrl>' type='video/mp4'></video>"
})
})file rich block 保证的是内联播放器;如果你要强制自动播放,再考虑 html_widget + 外部直链/uploads/...create_rich_block 返回 stale_ignored,说明回调凭据过期(见 #1092),可尝试在消息文本中嵌入 ```cc_rich 格式作为降级| 层 | 组件 | License |
|---|---|---|
| 渲染 | Remotion v4(Phase 1)/ FFmpeg(底层) | Remotion License / LGPL |
| TTS | CosyVoice(已有猫猫声线) | Apache-2.0 |
| 对齐 | Qwen3-ForcedAligner(首选)/ WhisperX(备选) | Apache-2.0 / BSD-2 |
| 队列 | BullMQ(Phase 2 引入) | MIT |
| 切分 | PySceneDetect(Phase 3 路径 A) | BSD-3 |
| VLM | Qwen2.5-VL-3B(Phase 3 路径 A) | Apache-2.0 |
路径 B 完整流程跑通后 → quality-gate(自检)→ request-review(QA/审查猫审音画,视觉把关猫审节奏)
80782c5
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.