Architecture guide · source-reviewed

把内容视频工作流拆成可验证的 Codex Skills

这份报告梳理 codex-content-video-skills 的完整设计逻辑:它如何把“今天做一条视频”的自然语言请求,拆成九个可替换模块、若干版本化工件和一条可自检的本地交付链路。

https://github.com/Scitiger-AI/codex-content-video-skills
审阅版本:52018050c2b68624cb9a7bff3fbff8985f9a071a 范围:9 个 Skill、辅助脚本与契约文档 目标:让人和 AI 都能据此复刻同类系统

01 · Thesis

这不是一个单体 Skill,而是一组“窄职责 + 文件交接”的生产系统

这个仓库不试图让一个提示词包办选题、研究、写稿、配音、字幕和渲染。它把每一步限制在一个明确边界内,并把跨步骤的信息写进任务目录。下一步读取的是工件,不是上一轮聊天记忆。

系统的中心不是模型,而是交接契约。 上游输出需要被下游读取、验证和追溯;任何模块都不能借由“猜测上下文”填补关键事实、时间或布局信息。

01 / TASK-SCOPED

任务是唯一上下文

只使用当前对话和当前任务目录。没有账号画像、持久受众记忆、历史选题库、发布队列或隐式偏好。

02 / ARTIFACT-FIRST

先定义文件,再调用能力

请求、信号、选题、文稿、音频、字幕、清单和 QC 都有文件化落点,便于重跑、审计、替换与局部修复。

03 / LOCAL-DELIVERY

本地成片是终点

交付可编辑工程、MP4 和质检报告。工作流不上传、不发布、不入队,也不向第三方发通知。

02 · End-to-end pipeline

九个模块,围绕一个任务目录依次运行

完整视频请求由 content-video-workflow 编排,但它只拥有编排权,不吞并领域实现。它决定何时调用其他 Skill、何时验证工件、何时进入指定渲染器。

上方是主线工件流。两类信号源按需调用;在 video-manifest.json 处分叉到用户指定的渲染器。
编排content-video-workflow建任务目录
request.json
信号public-hot-signals公开热榜
hot-signals.json
信号ai-trend-reportAI 日报
ai-daily-report.json
选题content-topic-selectiontopic-brief.json
写稿self-media-scriptscript-package.json
script.md
旁白tts-generate-audio归一化 audio
metadata.json
字幕audio-generate-subtitlesubtitle.srt
segments.json
交接video-manifestmanifest +
caption-layout
渲染Renderer工程 + MP4 +
qc-report.json
HyperFrames
HTML 时间线
Remotion
React 时间线
用户明确选择时严格遵守;未选择时默认 HyperFrames
阶段 / Skill唯一职责主要输入主要输出不可越过的边界
信号
public-hot-signals
收集并标准化中文公网热榜信号。所需平台、超时、任务输出路径。hot-signals.json不推荐最终选题,不据热度断言事实。
信号
ai-trend-report
拉取并清洗 SciTiger AI 日报。公共日报端点。已脱敏报告 JSON 或概览。不写应用代码,不把报告建议当独立事实。
选题
content-topic-selection
选择信号源,产出可研究的选题简报。用户请求、可选的两类信号。topic-brief.json不写成片文稿,不渲染视频。
写稿
self-media-script
研究、设定事实边界、写可旁白的脚本及视觉节拍。主题或 topic-brief.json、权威资料。script-package.jsonscript.md不替未证实事实背书;不从热榜直接生成结论。
音频
tts-generate-audio
调用异步 TTS 并生成可交付旁白。旁白文本、参考音频、用户 API key。原始音频、48kHz 归一化音频、元数据。不生成字幕;密钥不进入仓库或任务工件。
字幕
audio-generate-subtitle
从真实音频生成时间轴字幕。归一化音频、可选原稿。subtitle.srt、时间段 JSON。不合成音频,不手工编造时间戳。
编排
content-video-workflow
建目录、串联交接、选择渲染器、守住质检门。当前请求与所有上游工件。video-manifest.jsoncaption-layout.json不拥有领域实现;不发布、不上传。
渲染
hyperframes-content-video
把清单落地为 HTML/HyperFrames 工程和 MP4。已验证 manifest、音频、SRT、视觉节拍。工程、MP4、QC。不选题、不写稿、不替换用户指定的渲染器。
渲染
remotion-content-video
把清单落地为 React/Remotion 工程和 MP4。已验证 manifest、音频、SRT、视觉节拍。工程、MP4、QC。同上;仅使用帧驱动动画。

03 · Topic routing

先决定“要不要找热点”,再决定“讲什么”

选题模块先把自然语言请求压缩为 topic_request:领域、受众、平台、时效性和来源偏好。随后以固定优先级得出 source_mode,并把理由写回工件。这让同一输入的来源选择可以被复查。

用户明确不用趋势,或给定精确主题且不要求时效
不获取任何热度源,直接以该主题形成一个候选。
none
用户明确要求公开热榜
调用通用跨平台热榜采集器。
public
用户明确要求 AI 日报
调用公开 SciTiger AI 日报读取器。
ai_daily
用户明确同时要求两者
汇合两类信号;仍保留各信号 ID 和来源。
both
当前 AI / 模型 / Agent / Prompt / AI 产品选题
AI 是实质主题,使用通用热榜和 AI 日报交叉观察。
both
当前非 AI 选题,或领域表达含糊
先用通用公开信号,避免因为一句“AI”就误拉日报。
public

候选生成与选择权

  1. source_mode=none 且主题精确,只生成一个候选。
  2. 其他情况把两类信号标准化后,生成三个“核心问题、角度、视频形式”均有差异的候选。
  3. 每个候选保留使用过的 source_signal_ids,并提出后续必须验证的 research_questions
  4. 未获“自主选择”授权时,展示三个候选并等待;“做一条完整视频”则授权其自行完成生产。

04 · Artifact contracts

文件是模块间 API:每一次交接都可存档、验证、重放

工件按任务目录保存。这样可以替换某个实现,例如更换 TTS 服务或渲染器,而不必重新发明选题和研究;也可以从任一中间产物重启。

request.json用户意图、格式、时长、偏好
topic-brief.json来源决策、候选、研究问题
script-package.json主张、来源、章节、视觉节拍
script.md仅旁白文本,供 TTS 与字幕参照
audio + SRT声音和真实时间轴
video-manifest.json渲染器中立的生产清单
MP4 + QC本地成片、报告、可编辑工程

request.json

工作流的入口快照,保存主题、受众、时长、画幅、风格、来源偏好、渲染器和交付表面。

解决
后续步骤不再从口头描述猜参数。
原则
保留未知的用户要求,不静默丢弃。

topic-brief.json (schema 1)

把“为什么用这些信号”和“准备研究什么”显式分开。包含 source_decision、信号、候选和选择状态。

关键字段
source_moderouting_reasonuser_override
安全字段
research_questions 不是事实,是待核查问题。

script-package.json (schema 1)

机器可读的编辑包;script.md 只保留按章节排序的口播,不混进内部选题元数据。

关键字段
来源、主张状态、叙事策略、章节、visual_beats、编辑复核。
硬约束
verified 主张至少有一个来源 URL;每章必须被视觉节拍覆盖。

audio / metadata.json

TTS 同时保留下载的原始音频和可交付的归一化版本,元数据记录无密钥的请求快照、轮询结果和参考音色来源。

交接
下游只用归一化 audio_path 生成字幕。
不保存
API key、签名 URL、用户环境文件。

subtitle.srt / segments.json

时间来自真实旁白音频;原稿只是 reference_text,用于提高转写对齐,不是时间轴的替代品。

交接
渲染器解析同一份 SRT,任一时刻只显示一个活跃段。
禁止
再写一份独立逐字稿或手填时间戳。

video-manifest.json (schema 2)

渲染器中立的最终交接:项目路径、媒体路径、画布、字幕策略、视觉节拍和输出路径。

必填
rendererproject_dir、音频、SRT、尺寸、FPS、画幅、非空节拍。
派生
它生成唯一的 caption-layout.json

渲染清单的最小骨架

{
  "schema_version": 2,
  "renderer": "remotion",
  "project_dir": "remotion-project",
  "source": {"topic_brief": "topic-brief.json", "script_package": "script-package.json", "script": "script.md"},
  "media": {"audio_path": "tts/tts_x.wav", "subtitle_srt_path": "subtitle/subtitle.srt", "subtitle_segments_path": "subtitle/subtitle_segments.json"},
  "format": {"width": 1920, "height": 1080, "fps": 30, "aspect_ratio": "16:9", "language": "zh-CN"},
  "caption_policy": {"enabled": true, "max_lines": 2, "delivery_surface": "clean-player", "platform_ui_bottom_ratio": 0.04, "caption_bottom_ratio": 0.10, "caption_max_height_ratio": 0.12, "visual_clearance_ratio": 0.02},
  "visual_beats": [/* 从 script-package 继承的可执行视觉说明 */],
  "output": {"video_path": "renders/final.mp4", "qc_report_path": "renders/qc-report.json"}
}

05 · Evidence & editorial boundaries

把“注意力证据”和“事实证据”分成两条轨道

这是整套设计最重要的内容安全机制。公开热榜和 AI 日报都是发现入口,不能成为视频中实质性论断的唯一根据。脚本模块负责把它们转化为待查问题,再用权威资料决定能否说出口。

注意力信号

标题、榜单名次、互动指标、日报中的机会建议。

允许:说明“该平台收集到/该条目正在被讨论”、解释选题的时效理由。

不能:证明产品能力、技术因果、法律状态、医学或金融结论。

权威事实

一手公告、官方文档、论文原文、监管机构、可核验的机构材料。

要求:claims 写 URL、发布者、日期(若有)及它支持的具体主张。

输出:verifieduncertainopinion

禁止模糊权威:“学术界早就指出”“专家都认为”不是来源。写出具体受支持的主张和来源,或删掉。
禁止发现过程泄漏:除非视频本身分析热点,开头不能说“今天热榜里”“这个选题来自第几名”。观众承诺应独立成立。
禁止通用收尾:结尾必须落在本题的具体后果、反转或取舍,不能把“下次看到……”“别只问……”套到任意科技视频。
禁止文字幻灯片替代视觉:每个章节有主视觉与辅视觉;机制用流程、比较用图、数量用数据或计数器。

脚本包如何让叙事可审

除了文案,script-package.json 还存 narrative_strategyeditorial_review。前者记录本题为何采用“场景到原理”“对比到解决”“主张到反例”等路径;后者明确观众承诺,并检查钩子是否脱离发现元数据、归因是否具体、结尾是否只属于这个主题。

06 · Timing & layout authority

音频决定时间,清单决定安全区

单一时间权威

旁白先由 SciTiger 异步 TTS 生成,再经 FFmpeg 归一化为 48 kHz、-16 LUFS、-1 dBTP 峰值上限的交付音频。字幕服务从这个音频生成 SRT;原稿只作为对齐参考。渲染器以探测到的旁白时长设定总时长,SRT 决定当前字幕。

  • 默认 tts_rate=1.0。要达到指定时长,应增减有证据支撑的叙事节拍,而不是偷偷放慢语速。
  • TTS API 需参考音频;未提供时使用包内 assets/default-reference.mp3,不会扫描用户目录随机找声音。
  • TTS 和字幕均是“提交任务 → 轮询 → 下载”的异步 API 模式。元数据排除 key 与签名 URL。
  • 音频只在根节点挂载一次,字幕只解析一份 SRT,避免音画时间线彼此漂移。

单一布局权威:caption-layout.json

resolve_caption_layout.py 将清单中按画面高度表达的比率,转换为确定的像素边界。任何渲染器都不能硬编码字幕偏移:字幕必须在 caption_box 内,其他视觉元素必须止于 visual_content.bottom_y 之上。

可用视觉空间
caption_box
最多两行字幕
platform UI exclusion
visual_content.bottom_y
非字幕图表、人物、物体和文字的硬边界;留出额外间隙,避免与字幕碰撞。
caption_box
caption_bottom_ratio、最大高度和 max_lines 定义;不是 CSS 里的魔法数字。
platform_ui_exclusion
平台操作区;字幕和主视觉都不能侵入。

例:1080×1920、generic-short-video
底部 UI 346px;字幕盒底部距画面底 422px;字幕盒高 192px;视觉区下边界为 y=1268px

07 · Renderer contract

渲染器是明确的交付承诺,而不是失败后的静默替身

两条渲染实现共享 manifest、音频、SRT、视觉节拍和布局边界,但工程形态不同。用户指定 remotionhyperframes 后,工作流可以诊断和修复该渲染器,却不能悄悄改用另一个。

HTML / HyperFrames

hyperframes-content-video

  • 创建或复用独立 index.html 组合,使用固定尺寸、FPS 和由旁白探测出的时长。
  • 把音频、SRT 与输入清单复制到工程内的 content-media/content-inputs.json,不修改原始媒体与 manifest。
  • 根级 <audio> 持续承载旁白;时间线同步、可 seek、无渲染时网络请求、时钟、随机状态、CSS transition 或无限循环。
  • 支持 24 / 30 / 60 FPS;运行 CLI 检查与快照。若只有 skills bootstrap 卡住,官方恢复路径是 HYPERFRAMES_SKIP_SKILLS=1
  • QC 还检查 MP4、音频流、尺寸、FPS、旁白时长、尾部、SRT 与字幕几何。
React / Remotion

remotion-content-video

  • 创建或复用命名 Composition;把媒体放入 public/,但保留 manifest 原路径不变。
  • 用 Remotion 字幕工具解析所给 SRT;音频只挂载一次;总帧数来自音频,最多只加极短尾部。
  • 所有动画由帧驱动。禁止 CSS transition、keyframes、连续旋转可读文字、第二份转录文本和硬编码字幕底边。
  • 渲染前扫描裸 JSX 文本中的字面 \n\t\r,规避错误转义被显示出来。
  • 每个视觉节拍与最长字幕段都要输出静帧并人工检查安全区。
两者共同的视觉合同:每个 visual_beat 都必须成为随旁白推进的解释性画面。机制用流程或对象关系,比较用结构图,数量用图表或计数器。长时间将口播原文贴成卡片,不构成合格的视频视觉。

08 · Validation & recovery

质量控制不是“报错后等用户”,而是一条自动修复环

本仓库把可预见的错误前移为脚本检查。正常的文字、布局、音频或渲染缺陷应自动修复并重渲染;只有不可恢复的环境或源媒体问题,才需要报告给用户并请求改变条件。

生成工件每步写入任务目录
结构验证schema、必填字段、路径、格式
叙事审计来源泄漏、模糊归因、通用结尾、节拍覆盖
布局与源码检查字幕边界、泄漏参考线、JSX 转义
渲染与媒体 QCMP4、尺寸、FPS、时长、SRT、静帧
本地交付工程 + MP4 + QC 报告

任一正常检查失败 → 修复对应源工件 / 布局 / 场景 → 从相关检查重新开始,而非索要预览批准。

质量门检查对象失败后的系统行为可复刻价值
信号采集各来源独立成功与错误记录。单个源失败不阻断;只有所有源都无信号才失败。把外部网络不稳定隔离成局部故障。
AI 日报根对象有 report_metasummary;删除签名或凭据 URL 字段。端点或 schema 不符即明确报错。对公开数据也设结构与脱敏边界。
脚本包主张状态与 URL、章节引用、视觉节拍字段。validator 失败即回到写稿;严格审计拒绝热榜泄漏、空泛归因、模板结尾。让编辑要求可机器预检。
Manifest版本、renderer、项目目录、音频/SRT 路径、画布、非空节拍、真实文件。不进入渲染。渲染器只收到完整且可执行的合同。
字幕几何schema 2 的完整 caption_policy;比例与空间关系。解析失败,不允许硬编码替代。将跨平台安全区做成确定函数。
交付参考线源树中贴着左边、延伸到视觉边界的可见 guide bar。检出即移除或改入 debug/preview 树,重渲染。防止调试辅助线漏入成片。
Remotion 源码裸 JSX 文本中直接出现的转义控制符。改为 JSX 字符串表达式或拆分文本元素。把一种常见、难发现的中文文本渲染错误前置。
成片 QC视频流、尺寸、FPS、时长、SRT、字幕几何、关键静帧。正常问题自动修复并重渲染。最终判断来自可播放文件,不只看源码。

可借鉴的增强点:HyperFrames 的 QC 会独立检查音频流和旁白覆盖;Remotion 附带的 QC 重点是视频、SRT 和字幕几何。若你复刻这套包,建议两条分支都强制验证音频流存在、音频时长与视频时长的覆盖关系,并把静帧人工检查记录进 QC 报告。

09 · Build your own

复刻同类 Skill 包的实施蓝图

要复刻的不是这九个名字,而是“将不确定性留在上游、将确定性交给合同和验证器”的工作方式。下面的顺序适用于任何多阶段内容、报告、课程或媒体生成系统。

先划职责边界

一个 Skill 只做一类领域决策。采集只采集、研究只研究、转写只转写、渲染只渲染。模块描述里也要写清“不要做什么”。

先写交接 Schema

在实现提示与脚本之前,定义版本号、必填字段、路径相对性、未知字段保留策略、主张状态和输出位置。用 JSON Schema 或小型 validator 固化。

把选择理由写出来

任何路由、模型选择、来源选择、策略选择都输出 reasonoverride 和输入引用。这样人能审,AI 也能稳定续跑。

拆分“发现”和“证明”

趋势、检索、社交讨论、模型建议只生成研究问题。面向用户的事实性主张必须对应独立、可核验的高质量来源。

给时间和空间各设一个权威

音频/SRT 是唯一时间线;布局 resolver 是唯一几何来源。禁止各下游自行估算时长、再造字幕或写入魔法像素。

把创意转成生产指令

不要只交付长文。为每段声明目标、主视觉、辅视觉、数据/图示、文案和安全区约束,让渲染器能据此工作。

把用户选择当作合同

用户选的渲染器、画幅、FPS、平台和音色不应被静默替换。允许诊断与修复;不能完成时请求明确的选择变更。

针对已知失败写小检查器

每个反复出现的失误都值得一段确定脚本:缺字段、路径失效、字幕越界、调试线泄漏、转义文本、无音频流,而不是反复靠提示词提醒。

定义自动修复阈值

拼写、换行、safe-zone、正常 QC 失败应自动重做;缺凭据、不可访问的源媒体、渲染器启动失败等外部阻塞才向用户升级。

默认本地、显式外发

将输出保存在任务目录,交付源文件、产物和 QC。上传、发布、通知、排队是独立的、有明确授权的后续动作。

最小编排器伪代码

function makeVideo(request) {
  task = createTaskDirectory(request)                 // request.json
  brief = request.needsTopic ? selectTopic(task) : briefFromExactTopic(task)
  package = researchAndWrite(brief)                   // claims + visual_beats
  assert(validateScriptPackage(package))
  assert(auditNarration(package, {strict: true}))

  audio = synthesizeTTS(package.script, {rate: 1.0})  // normalized delivery audio
  subtitles = transcribe(audio, {referenceText: package.script})
  manifest = makeRendererNeutralManifest(package, audio, subtitles, request)
  assert(validateManifest(manifest, {checkPaths: true}))
  layout = resolveCaptionLayout(manifest)

  renderer = request.renderer ?? "hyperframes"
  project = renderer === "remotion"
    ? buildRemotion(manifest, layout)
    : buildHyperFrames(manifest, layout)
  assert(noDeliveryGuides(project.deliverySource, layout))

  video = render(project)
  qc = inspectVideo(video, subtitles, layout)
  while (!qc.passed && qc.isRepairable) { repair(project, qc); video = render(project); qc = inspectVideo(video, subtitles, layout) }
  return {project, video, qc}
}

实现与测试清单

接口层

  • 每种工件有版本号与示例。
  • 路径可相对任务目录解析。
  • 敏感值永不写进工件。
  • 输出记录支持追溯来源。

编排层

  • 精确主题可跳过热点。
  • 非自主选择会暂停在候选阶段。
  • 用户指定的渲染器不会替换。
  • 每个阶段可从现有工件重跑。

质量层

  • 为每个 schema 写正反例测试。
  • 模拟部分来源网络失败。
  • 检查字幕、音频、视频三条时间线。
  • 抽样渲染关键画面做视觉复核。

10 · Usage & source map

如何把它安装为项目内 Skill,并从请求启动

仓库 README 提供的项目内安装命令如下。它将整个技能包放入当前项目的 .agents/skills/,不会安装为全局 Skill。安装后在新的 Codex 对话或下一轮会话中使用。

npx skills add Scitiger-AI/codex-content-video-skills

完整生产请求可以直接描述时长、话题来源、画幅和渲染器,例如:

结合今天公开热榜,做一个 90 秒中文科技知识视频,
横屏 16:9,使用 Remotion。

审阅时应优先阅读的源文件

  • README.md:安装、运行环境与包级边界。
  • content-video-workflow/SKILL.md:全链路编排与交付合同。
  • content-topic-selection/SKILL.md:来源路由及选择权。
  • content-topic-selection/references/topic-brief.md:选题工件。
  • self-media-script/SKILL.md:事实、叙事、视觉节拍与编辑复核。
  • self-media-script/references/script-package.md:文稿交接契约。
  • public-hot-signals/scripts/collect_public_hot_signals.mjs:来源独立失败与信号标准化。
  • ai-trend-report/scripts/fetch_report.py:日报根 schema 校验与敏感 URL 清除。
  • tts-generate-audio/SKILL.mdaudio-generate-subtitle/SKILL.md:两段异步媒体服务。
  • content-video-workflow/references/video-manifest.md:渲染器中立清单。
  • resolve_caption_layout.pyvalidate_video_manifest.py:确定性几何与入口验证。
  • hyperframes-content-video/remotion-content-video/:两条渲染合同与 QC 实现。