diff --git a/.agent/skills/science-video-pipeline/SKILL.md b/.agent/skills/science-video-pipeline/SKILL.md new file mode 100644 index 000000000..f219ea896 --- /dev/null +++ b/.agent/skills/science-video-pipeline/SKILL.md @@ -0,0 +1,32 @@ +--- +name: science-video-pipeline +description: 把论文/综述做成动效图解科普视频的九阶段流水线(论文精读提取→策划→逐字稿 SSOT→双重校验→分镜→TTS 声音克隆→Remotion 场景实现→草渲抽帧 QA→终渲交付)。Use when producing or iterating a media/*-video/ episode: narration.md, storyboard.md, IndexTTS voice cloning, Remotion scenes, frame QA, or final render; or when scaffolding a new episode. +allowed-tools: Read, Write, Edit, Glob, Grep, Bash +--- + +# 科普视频制作流水线(导航壳) + +本 Skill 是路由层:内容 SSOT 在 `media/pipeline/skills/01–09.md`,工具 SSOT 在 +`media/pipeline/scripts/`,不在此复制任何正文(防第二事实源)。 + +## 九阶段速查 + +| Stage | 做什么 | 规格链接 | 工具/命令(编排入口 `pipeline.py`) | 通过门 | +|---|---|---|---|---| +| ① 论文精读提取 | 并行子代理逐章 + 官方站点信源补充 | [01](../../../media/pipeline/skills/01-paper-extraction.md) | `paper_extract.py`(map/text/captions/find/render) | 全部断言可回溯;RISKY=0 | +| ② 策划 | 受众/结构/视觉契约(色彩语义) | [02](../../../media/pipeline/skills/02-planning.md) | — | planning.md 六节齐 | +| ③ 逐字稿 | narration.md ★单一事实源 | [03](../../../media/pipeline/skills/03-narration.md) | `pipeline.py build` | `build_narration.py` 通过 | +| ④⑤ 双重校验 + 分镜 | 真实性回溯 + 易懂性;beat 覆盖性 | [04](../../../media/pipeline/skills/04-verification.md) / [05](../../../media/pipeline/skills/05-storyboard.md) | `pipeline.py check`(+`--check-scenes`) | RISKY=0;覆盖率无缺句 | +| ⑥ TTS 配音 | 本人音色克隆(IndexTTS-2.5) | [07](../../../media/pipeline/skills/07-tts-voice.md) | `pipeline.py tts --plan` | refs 指纹门 + 试听 + ETA | +| ⑦ Remotion 场景 | 代码动画实现 | [06](../../../media/pipeline/skills/06-remotion-implementation.md) | `tsc --noEmit` | 七条渲染红线 | +| ⑧ 草渲 + 抽帧 QA | 半分辨率快速迭代 | [08](../../../media/pipeline/skills/08-render-qa.md) | `pipeline.py render` + `qa` | 自动体检零 FAIL | +| ⑨ 终渲 + 交付 | 1080p30 + srt/vtt | [09](../../../media/pipeline/skills/09-final-render.md) | `render --final` + `captions` | 实测时长在预算窗 | + +## 关键不变量 + +- 逐字稿只改 `narration.md`;`narration.json`/`manifest.json` 是派生物。 +- **口播永不出现他集标题与集数序号**——顺序只在视觉层与 [media/series.json](../../../media/series.json)(校验:`check_series.py`)。 +- 每集 `pipeline.toml` 是可执行参数的唯一来源;README 不复制命令行参数。 +- 时序常数只在 `video/src/timing.json`(timing.ts 与 Python 共读)。 +- 声音样本是生物特征:不入库(`voices/refs.toml` 只存指纹),试听后即删。 +- 新集脚手架与复用边界(Python 集中 SSOT / Remotion 复制不共享)见 [media/pipeline/README.md](../../../media/pipeline/README.md)。 diff --git a/.gitignore b/.gitignore index 081e5beb9..f2fb968f7 100644 --- a/.gitignore +++ b/.gitignore @@ -311,9 +311,11 @@ media/experience-era-agents-video/**/*.mp3 media/experience-era-agents-video/**/*.wav # 声音克隆参考样本(media/pipeline/voices/):个人声音属生物特征信息,绝不入库。 -# 目录级忽略 + README 白名单,防漏网音频格式(ogg/opus/wma 等)。 +# 目录级忽略 + 白名单例外(README 与 refs.toml 指纹清单——后者只存哈希与生成参数, +# 不含音频字节),防漏网音频格式(ogg/opus/wma 等)。 media/pipeline/voices/* !media/pipeline/voices/README.md +!media/pipeline/voices/refs.toml # 科普视频工程(media/self-evolving-coding-agents-video)本地产物:同上集规则。 media/self-evolving-coding-agents-video/video/public/audio/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1ad52650e..858dc0412 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -46,6 +46,18 @@ repos: files: ^apps/negentropy/ types_or: [python, pyi] + # ── Python: media/pipeline(科普视频公共管线) ───────────────────────── + # 与 negentropy 同一 ruff 修订版;此前仅覆盖 apps/negentropy/,管线脚本无 lint 门 + - id: ruff + name: ruff lint (media-pipeline) + args: [--fix, --exit-non-zero-on-fix] + files: ^media/pipeline/ + types_or: [python, pyi] + - id: ruff-format + name: ruff format (media-pipeline) + files: ^media/pipeline/ + types_or: [python, pyi] + # ── Node.js: apps/negentropy-ui ────────────────────────────────────────── # ESLint v9 flat config(eslint.config.mjs),零警告策略(--max-warnings=0) - repo: local @@ -106,3 +118,15 @@ repos: entry: uv run scripts/sync_versions.py check files: ^(VERSION|scripts/sync_versions\.py|package\.json|apps/negentropy/(pyproject\.toml|uv\.lock)|apps/negentropy-ui/package\.json|apps/negentropy-wiki/package\.json|apps/negentropy-perceives/(pyproject\.toml|uv\.lock)|packages/agents-chat-core/package\.json)$ pass_filenames: false + + # ── 科普视频系列一致性(media/series.json 执法) ───────────────────────── + # 规则:口播反串线(自身标题排除)/多标题顺序/序号绑定/清单完整性/相对链接死链。 + # 注意:挂在内容修复之后落地;顺序调整类变更须先改 series.json 再动散文。 + - repo: local + hooks: + - id: series-consistency-check + name: Series consistency (media/series.json) + language: system + entry: uv run --no-project media/pipeline/scripts/check_series.py + files: ^(media/|docs/\.agents/knowledge-map\.md|CHANGELOG\.md) + pass_filenames: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bbe37ecd..0671a5353 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,16 +6,23 @@ ### Added +- **科普视频公共管线基建升级**:`pipeline.py` 单入口编排(status/doctor/build/check/tts/captions/render/qa/all/clean-samples,阶段契约与派生式新鲜度——零状态文件防第二事实源)+ 每集 `pipeline.toml` 声明式配置(可执行参数不再散落 README,治 ISSUE-161 类漂移)+ `timing.json` 时序常数 SSOT(timing.ts 同步 import、Python 侧 timeline.py 共读,双语言镜像漂移结构性消灭)+ 七件新工具:`check_script`(④⑤门:分镜覆盖性/时长预算双口径/淡入不变式/--check-scenes 分镜↔代码互比——当场抓出两集既存分镜漂移)、`check_series`(系列顺序五规则执法 [media/series.json](media/series.json),自身标题排除使纯 grep 不可能做到的反串线 lint 成为可能)、`captions`(srt/vtt,cue 终点不含停顿)、`qa_frames --check/--check-theme`(黑帧/字幕带侵入[连通亮段法]/冻帧/字幕缺失 + WCAG 对比度)、`paper_extract`(Stage ① 取证五子命令)、`refs.py` + `voices/refs.toml`(参考样本指纹清单,只存哈希不存音频)、`tts.py --expect-ref-sha1` 指纹硬校验与 `.engine` 音色签名护栏 + `--allow-voice-switch` 显式放行(ISSUE-163 的拦截层);`media/pipeline/tests/` 45 项(digest 黄金哈希守「缓存零失效」)全绿 2s;pre-commit ruff 扩至 `^media/pipeline/`;技能规格补齐 skills/07–09 并挂载路由型真 Skill [.agent/skills/science-video-pipeline](.agent/skills/science-video-pipeline/SKILL.md)(零正文复制)。 +- **系列发布顺序 SSOT 与 Remotion 最佳实践三集落地**:新增 `media/series.json`/`series.md`(三集顺序 + 「序号不进口播」系列纪律——发布顺序变更的 TTS 代价恒为零);`@remotion/media` `