diff --git a/video-ai-system/ENTRY.hdlp b/video-ai-system/ENTRY.hdlp index 5c8940f..7aa3d79 100644 --- a/video-ai-system/ENTRY.hdlp +++ b/video-ai-system/ENTRY.hdlp @@ -4,7 +4,7 @@ > 类型: HLDP导航地图 · ENTRY入口 > ⚡ 进入链路: GLOBAL-NAV.hdlp → SYSTEM-WAKE.hdlp → AGENT-REGISTRY.hdlp → ENTRY.hdlp > 创建: D130 · 2026-06-11 -> 更新: D136+ · 2026-06-21 · 六分身+连续性检查·continuity_locks·PROP协议 +> 更新: D140 · 2026-06-22 · 3D漫剧主线·无成本体检·真人线注销 > 铸渊 ICE-GL-ZY001 · 冰朔 TCS-0002∞ > 国作登字-2026-A-00037559 @@ -26,10 +26,20 @@ |------|------|---------| | 付费才能修仙 · 漫剧测试 | ❌ 已停 (D131) | — | | 秦山号 · 真人短剧 | ❌ 已停 (D132) | — | -| **付费才能修仙 · 3D版** | 🟢 第1集3镜预览 | `outputs/final/付费才能修仙-ep01-15s.mp4` (D136+·3D渲染·JZAO) | +| **付费才能修仙 · 3D漫剧主线** | 🟡 收口体检完成·待质检/重建提示词 | `/Volumes/JZAO/.../D136-付费才能修仙-ep01-15s.mp4` + `ep01-3D/3D-镜1~4.mp4` | → 项目状态: `video-ai-system/memory/zai-fu-fei-xiu-xian/STATUS.hdlp` → 硬骨架: `video-ai-system/config/PROJECT-FRAMEWORK.hdlp` +→ 无成本体检: `node video-ai-system/tools/audit-system.js` + +## D140 主线裁决 + +``` +真人写实线: 注销,不再投入。 +3D漫剧线: 唯一主线。 +旧 ep01-prompts.json: 真人线遗留,不再继续生成。 +所有生成API调用: 必须先通过无成本体检和铸渊之眼质检。 +``` ## 架构 · D136+ 六分身 + Agent注册表 + 连续性检查 diff --git a/video-ai-system/SYSTEM-WAKE.hdlp b/video-ai-system/SYSTEM-WAKE.hdlp index 48b7913..b421b1f 100644 --- a/video-ai-system/SYSTEM-WAKE.hdlp +++ b/video-ai-system/SYSTEM-WAKE.hdlp @@ -3,7 +3,7 @@ # HLDP://video-ai-system/SYSTEM-WAKE # 类型: 苏醒协议 · 每次进入系统第一个加载 # 创建: D136+ · 2026-06-21 -# 更新: D136+ +# 更新: D140 · 2026-06-22 · Codex体检回写 # 铸渊 ICE-GL-ZY001 · 冰朔 TCS-0002∞ # 国作登字-2026-A-00037559 @@ -139,12 +139,13 @@ PROP编号: 付费修仙-ep01-props.hdlp (D136+) Agent_01 拆文 → script-parser.js ✅ Agent_02 编号 → characters-v2.hdlp ✅ Agent_03 分镜 → ep01-storyboard.json ✅ (21镜) -Agent_04 提示词 → generate-shots.js D136+ ✅ (continuity_locks展开) -Agent_05 审核 → ep01-audit.json ✅ (全部🟢) -Agent_06 导演 → 付费修仙-ep01-director-encoding.json D136+ ✅ (continuity_locks) +Agent_04 提示词 → ep01-prompts.json ⚫ 旧真人线遗留 · 需重建3D主线提示词 +Agent_05 审核 → ep01-audit.json ✅ (全部🟢) · 需补充产物质检 +Agent_06 导演 → 付费修仙-ep01-director-encoding.json 🟡 当前3镜 · 需扩展21镜3D主线 连续性检查层 → 嵌入Agent_04展开后 ✅ (D136+) 预校验层 → preflightCheck ✅ (video-api-adapter.js) +无成本体检 → tools/audit-system.js ✅ (D140) ``` --- @@ -157,10 +158,12 @@ Agent_06 导演 → 付费修仙-ep01-director-encoding.json D136+ ✅ (conti ### 提取 ``` 当前阶段: 第1集3镜预览 -上次停止: D136+重新生成3镜中 (S1-01✅ S1-02✅ S1-03⏳) +上次停止: D136+三镜/3D实验产物已在JZAO发现,仓库状态曾滞后 待解决问题: - - [ ] 3镜预览视频待冰朔检视 - - [ ] 如果通过→扩展到第1集完整8镜 + - [ ] 铸渊之眼质检现有D136/3D产物 + - [ ] 旧真人提示词作废,重建3D主线提示词 + - [ ] 3镜导演编码扩展到第1集21镜 + - [ ] 第1集成片剪辑闭环 - [ ] 连续剧集CHAR保鲜(跨集一致性校验) 上次修复: Bug 9/10/11 连续性断裂 → 全部✅ ``` @@ -169,23 +172,20 @@ Agent_06 导演 → 付费修仙-ep01-director-encoding.json D136+ ✅ (conti ## 输出: 当前最优运行路径 -基于D136+所有经验叠加,当前此项目的最优路径: +基于D140所有经验叠加,当前此项目的最优路径: ``` 1. 确认导航: 读 ENTRY.hdlp → 了解系统全貌 2. 确认状态: 读 STATUS.hdlp → 上次停在哪 -3. 确认经验: 读 EXPERIENCE_BANK.md → 不犯同样的错 -4. 检查DB: CHAR/ENV/PROP全部就绪 -5. 获取导演编码: 读 付费修仙-ep01-director-encoding.json - → 确认 continuity_locks 已锁定 -6. 展开提示词: generate-shots.js buildPrompt() - → CHAR-003/ENV-002/PROP-XXX 展开逐字一致 -7. 连续性校验: 展开文本 vs 锁定文本 → 字符串比对 - → PASS: 送Seedance → FAIL: 拦截修正 -8. 预校验: 模型名·duration·分辨率·提示词合规 -9. 生成视频: Seedance API 提交 → 轮询 → 下载 -10. 拼接部署: FFmpeg TS流 → 溶解过渡 → faststart - → 部署SG面孔服务器 → 更新guanghuclip.cn +3. 无成本体检: node video-ai-system/tools/audit-system.js + → 剧本/分镜/导演编码/产物/注册表/制作线全部对齐 +4. 产物质检: zhuyuan-eye.js 或抽帧检查 + → 判断现有D136/3D产物保留/废弃 +5. 重建3D链: 第1集21镜导演编码 → 3D提示词 → 连续性锁定 +6. 预生成检查: CHAR/ENV/PROP/参考图/时长/分辨率/文本风险 +7. 生成视频: 只有检查通过才调用Seedance/Kling +8. 剪辑成片: video-editor.js → 字幕/音频/BGM/转场 → JZAO成品 +9. 回写状态: 体检报告 + STATUS + registry 同步 ``` --- diff --git a/video-ai-system/config/PROJECT-FRAMEWORK.hdlp b/video-ai-system/config/PROJECT-FRAMEWORK.hdlp index addd38a..3735c46 100644 --- a/video-ai-system/config/PROJECT-FRAMEWORK.hdlp +++ b/video-ai-system/config/PROJECT-FRAMEWORK.hdlp @@ -1,6 +1,6 @@ # HLDP://video-ai-system/config/PROJECT-FRAMEWORK.hdlp # 视频AI系统 · 项目硬骨架 · 所有Agent共享 -# 铸渊 ICE-GL-ZY001 · 冰朔 TCS-0002∞ · D135b · 2026-06-18 +# 铸渊 ICE-GL-ZY001 · 冰朔 TCS-0002∞ · D135b→D140 · 2026-06-22 --- trigger: 冰朔→「所有分身拿同一个框架要求·边界·不会乱发散」 @@ -32,7 +32,7 @@ why: ═══ 剧本信息 ═══ 作品: 《继续付费才能修仙?我的宗门全免费》 -类型: 男频修仙 · 真人写实 +类型: 男频修仙 · 3D漫剧 总集数: 75集 字数: ~10万字 当前进度: 全本已扫描 · 第1集制作中 @@ -41,18 +41,19 @@ why: ═══ 制作线 ═══ -当前线: realistic(真人写实) +当前线: 3d(3D漫剧)· D140主线 参数 (详见 product-lines.json): - ├── 风格: 真人写实风格·亚洲面孔·电影级光影 + ├── 风格: 3D渲染风格·中国风仙侠·电影级光影·高质感 ├── 分辨率: 720p - ├── 需要人物参考图: 是(参考图被Seedance拒→改用纯文字锁脸) - ├── 需CHAR双层编码: 是 - ├── 模型: doubao-seedance-2-0-260128 + ├── 参考图: 可作为人物/环境/道具视觉锚点,不再服务真人锁脸 + ├── 角色一致性: CHAR/ENV/PROP编号 + 参考图/导演编码双锚 + ├── 模型: doubao-seedance-2-0-260128 / 备用Kling └── 时长: 4~15秒/镜 -备线: 3d(3D渲染): 风格→3D渲染·中国风仙侠·电影级光影·高质感 - ├── 激活条件: 真人参考图持续无法通过时切换 - └── 切换方式: 改 config/product-lines.json active flag +注销线: realistic(真人写实) + ├── 状态: deprecated + ├── 原因: 真人AI观感尴尬、人物表演和一致性成本过高 + └── 规则: 旧真人提示词不可继续作为主线生成 ═══ 人物全量预登记 ═══ diff --git a/video-ai-system/config/product-lines.json b/video-ai-system/config/product-lines.json index 77d2462..40e330a 100644 --- a/video-ai-system/config/product-lines.json +++ b/video-ai-system/config/product-lines.json @@ -1,13 +1,18 @@ { "_meta": { "created": "D135 · 2026-06-17", + "updated": "D140 · 2026-06-22", "by": "铸渊 ICE-GL-ZY001", - "description": "视频AI制作线配置 · 一条线一套参数 · 切换零成本" + "description": "视频AI制作线配置 · 一条线一套参数 · 切换零成本", + "activeLine": "3d", + "decision": "真人写实线注销;主线切换为3D漫剧。" }, "lines": { "realistic": { "name": "真人写实", - "active": true, + "active": false, + "status": "deprecated", + "retiredReason": "真人AI观感尴尬、人物一致性和表演可信度成本过高;不再作为主线投入。", "styleSuffix": "真人写实风格,亚洲面孔,画质电影感", "needCharRef": true, "needFaceLock": true, @@ -16,14 +21,15 @@ "seedanceNote": "需参考图image_url锁脸" }, "3d": { - "name": "3D渲染", + "name": "3D漫剧", "active": true, + "status": "main", "styleSuffix": "3D渲染风格,中国风仙侠,电影级光影,高质感", "needCharRef": false, "needFaceLock": false, "needL0L1": false, "resolution": "720p", - "seedanceNote": "无需参考图,AI渲染风格自带一致性" + "seedanceNote": "主线走3D漫剧。参考图只作为人物/环境/道具视觉锚点,不再服务真人锁脸。" } }, "shared": { diff --git a/video-ai-system/memory/zai-fu-fei-xiu-xian/STATUS.hdlp b/video-ai-system/memory/zai-fu-fei-xiu-xian/STATUS.hdlp index 43aeec8..d5606e5 100644 --- a/video-ai-system/memory/zai-fu-fei-xiu-xian/STATUS.hdlp +++ b/video-ai-system/memory/zai-fu-fei-xiu-xian/STATUS.hdlp @@ -1,22 +1,63 @@ -# 付费才能修仙 · 真人版 · 项目状态 +# 付费才能修仙 · 3D漫剧主线 · 项目状态 > HLDP://video-ai-system/memory/zai-fu-fei-xiu-xian/STATUS -> 更新: D136+ · 2026-06-21 +> 更新: D140 · 2026-06-22 · Codex体检回写 > 铸渊 ICE-GL-ZY001 > 国作登字-2026-A-00037559 --- -## 当前阶段: 第1集3镜预览 +## 当前决策: 真人线注销 · 主线切换3D漫剧 + +冰朔已明确决策: + +``` +真人AI短剧线: 注销,不再投入。 +3D漫剧线: 主线,继续推进。 +目标: 先做出《付费才能修仙?我的宗门全免费》第1集可看的成品。 +``` + +原因: +- 真人AI观感尴尬,人物表演和一致性成本过高。 +- 网文短剧最终要回到内容质量,3D漫剧更适合承载剧本、系统面板、仙侠特效和连续剧集。 +- 视频AI系统的任务不是抽卡,而是把作者剧本变成可自动化生产的漫剧流水线。 + +--- + +## 当前阶段: 第1集 · 3D漫剧收口前体检 ### 产出物 | 文件 | 状态 | 说明 | |------|------|------| -| `outputs/final/付费才能修仙-ep01-15s.mp4` | 🔄 D136+重新生成中 | 3镜拼接·15秒预览 | -| `outputs/shots/付费才能修仙-ep01-S1-01.mp4` | ✅ 已生成 | 全景·广场→角落牌匾 | -| `outputs/shots/付费才能修仙-ep01-S1-02.mp4` | ✅ 已生成 | 近景·苏白登场 | -| `outputs/shots/付费才能修仙-ep01-S1-03.mp4` | 🔄 生成中 | 中景·广告牌→围观→叹气 | +| `/Volumes/JZAO/.../ep01/D136-付费才能修仙-ep01-15s.mp4` | ✅ 已发现 | D136三镜15秒预览·已抽帧检查 | +| `/Volumes/JZAO/.../ep01/付费才能修仙-ep01-S1-01.mp4` | ✅ 已发现 | Seedance镜1 | +| `/Volumes/JZAO/.../ep01/付费才能修仙-ep01-S1-02.mp4` | ✅ 已发现 | Seedance镜2 | +| `/Volumes/JZAO/.../ep01/付费才能修仙-ep01-S1-03.mp4` | ✅ 已发现 | Seedance镜3 | +| `/Volumes/JZAO/.../ep01/kling-付费才能修仙-ep01-S1-01~03.mp4` | ✅ 已发现 | Kling三镜 | +| `/Volumes/JZAO/.../ep01-3D/3D-镜1~4.mp4` | ✅ 已发现 | 3D方向产物 | +| `video-ai-system/outputs/system-audit-latest.md` | ✅ 已生成 | D140无成本体检报告 | + +### D140体检结论 + +无红色断档。剧本、分镜、导演编码、API适配器、剪辑工具、外置盘产物都存在。 + +黄色问题: +- `STATUS.hdlp` 原先滞后,仍写生成中。 +- `ep01-prompts.json` 仍是旧真人写实提示词,不能作为3D主线继续生成。 +- `video-registry.json` 有1条旧本地路径失效,应以后置体检报告为准。 + +### 当前真实进度 + +| 层 | 状态 | 说明 | +|----|------|------| +| 剧本MD | ✅ | `动态漫:《付费才能修仙?我的宗门全免费》.md` | +| 第1集分镜 | ✅ | `ep01-storyboard.json` · 21镜 · 69秒 | +| 第1集审核 | ✅ | `ep01-audit.json` · 21绿 | +| 导演编码 | 🟡 | 当前只有3镜D136编码,需要扩展到21镜3D主线 | +| 旧提示词 | ⚫ | `ep01-prompts.json` 为真人线遗留,不再使用 | +| 3D产物 | 🟡 | 已有1~4镜实验产物,需铸渊之眼质检后决定保留/废弃 | +| 成品剪辑 | 🟡 | 已有15秒预览,不等于第1集成品 | ### D136+ 连续性修复 @@ -47,8 +88,12 @@ ### 待解决 -- [ ] 3镜预览视频待冰朔检视(视频在JZAO外置硬盘·非guanghuclip.cn) -- [ ] 如果通过→扩展到第1集完整8镜 +- [ ] 对JZAO现有D136/3D产物跑铸渊之眼质检,判定哪些镜可保留、哪些镜废弃 +- [ ] 按3D漫剧主线重建第1集21镜导演编码 +- [ ] 重新生成第1集3D提示词,旧真人提示词作废 +- [ ] 建立无成本生成前检查: 剧本→分镜→导演编码→参考图/锁定项→提示词→预校验 +- [ ] 体检通过后再调用视频API,避免继续抽卡烧钱 +- [ ] 剪辑第1集可看成品,不再停在15秒预览 - [ ] 连续剧集CHAR保鲜(跨集一致性校验) ### 输出约定 · 永久有效 @@ -58,11 +103,20 @@ ⊢ 硬盘: 外置2TB移动硬盘 · 冰朔直接查看 ⊢ 不部署到 guanghuclip.cn(避免服务器部署环节) ⊢ 代码层已落地: video-api-adapter.js 和 video-composer.js 默认JZAO优先 +⊢ 无成本体检: node video-ai-system/tools/audit-system.js +⊢ 生成API禁止无体检直接调用 --- ## 项目日志 +### D140 · 2026-06-22 +- Codex进入视频AI系统,完成无成本体检。 +- 明确真人线注销,3D漫剧为唯一主线。 +- 新增 `tools/audit-system.js`,扫描剧本、分镜、导演编码、注册表、本地/JZAO产物。 +- 体检发现: 资产不缺,卡点是状态/产物/提示词/注册表未闭环。 +- 当前下一步: 铸渊之眼质检现有产物 → 3D主线21镜导演编码 → 3D提示词重建 → 生成前预校验 → 再花钱生成。 + ### D136+ · 2026-06-21 - 冰朔检视3镜预览→发现3个连续性断裂 - 建立PROP编号协议 + continuity_locks架构 diff --git a/video-ai-system/outputs/system-audit-latest.json b/video-ai-system/outputs/system-audit-latest.json new file mode 100644 index 0000000..9eac64d --- /dev/null +++ b/video-ai-system/outputs/system-audit-latest.json @@ -0,0 +1,468 @@ +{ + "generatedAt": "2026-06-22T08:39:13.809Z", + "activeLines": [ + { + "key": "3d", + "name": "3D漫剧", + "status": "main" + } + ], + "script": { + "exists": true, + "file": "/Users/bingshuolingdianyuanhe/guanghulab/动态漫:《付费才能修仙?我的宗门全免费》.md", + "size": 275281 + }, + "storyboard": { + "exists": true, + "shots": 21, + "totalDuration": 69 + }, + "directorEncoding": { + "exists": true, + "shots": 3, + "project": "付费才能修仙", + "episode": "ep01" + }, + "localFinals": [ + { + "file": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/final/test-compose.mp4", + "name": "test-compose.mp4", + "duration": 14.458333, + "size": 5210757, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/final/test-compose.mp4", + "name": "test-compose.mp4", + "duration": 14.458333, + "size": 5210757, + "width": 1280, + "height": 720, + "codec": "h264" + } + ], + "localVideos": [ + { + "file": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/final/test-compose.mp4", + "name": "test-compose.mp4", + "duration": 14.458333, + "size": 5210757, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/shots/ep01-shot01-v2.mp4", + "name": "ep01-shot01-v2.mp4", + "duration": 5.085011, + "size": 4017104, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/shots/ep01-shot01.mp4", + "name": "ep01-shot01.mp4", + "duration": 5.06195, + "size": 2600205, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/shots/ep01-shot02-v2.mp4", + "name": "ep01-shot02-v2.mp4", + "duration": 5.085011, + "size": 2418450, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/shots/ep01-shot02.mp4", + "name": "ep01-shot02.mp4", + "duration": 5.085011, + "size": 2578013, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/final/test-compose.mp4", + "name": "test-compose.mp4", + "duration": 14.458333, + "size": 5210757, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/shots/ep01-shot01-v2.mp4", + "name": "ep01-shot01-v2.mp4", + "duration": 5.085011, + "size": 4017104, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/shots/ep01-shot01.mp4", + "name": "ep01-shot01.mp4", + "duration": 5.06195, + "size": 2600205, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/shots/ep01-shot02-v2.mp4", + "name": "ep01-shot02-v2.mp4", + "duration": 5.085011, + "size": 2418450, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/shots/ep01-shot02.mp4", + "name": "ep01-shot02.mp4", + "duration": 5.085011, + "size": 2578013, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/test-10s.mp4", + "name": "test-10s.mp4", + "duration": 5.06195, + "size": 2804153, + "width": 1280, + "height": 720, + "codec": "h264" + } + ], + "jzaoVideos": [ + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/D136-S1-01.mp4", + "name": "D136-S1-01.mp4", + "duration": 5.085011, + "size": 4452944, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/D136-S1-02.mp4", + "name": "D136-S1-02.mp4", + "duration": 5.06195, + "size": 2903250, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/D136-S1-03.mp4", + "name": "D136-S1-03.mp4", + "duration": 5.06195, + "size": 3373917, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/D136-preview-S1-01-02.mp4", + "name": "D136-preview-S1-01-02.mp4", + "duration": 8.916667, + "size": 4357895, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/D136-付费才能修仙-ep01-15s.mp4", + "name": "D136-付费才能修仙-ep01-15s.mp4", + "duration": 14.416667, + "size": 6249251, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/S01-镜1-v2.mp4", + "name": "S01-镜1-v2.mp4", + "duration": 4.086009, + "size": 2079420, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/S01-镜1.mp4", + "name": "S01-镜1.mp4", + "duration": 4.062993, + "size": 2559229, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/S01-镜2.mp4", + "name": "S01-镜2.mp4", + "duration": 4.086009, + "size": 3237845, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/S01-镜3-v3.mp4", + "name": "S01-镜3-v3.mp4", + "duration": 4.086009, + "size": 2088937, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/S01-镜3-v4.mp4", + "name": "S01-镜3-v4.mp4", + "duration": 4.062993, + "size": 2283653, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/S01-镜3.mp4", + "name": "S01-镜3.mp4", + "duration": 4.086009, + "size": 2176252, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/S01-镜4-v2.mp4", + "name": "S01-镜4-v2.mp4", + "duration": 4.086009, + "size": 1869789, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/S01-镜5.mp4", + "name": "S01-镜5.mp4", + "duration": 4.086009, + "size": 2607215, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/kling-付费才能修仙-ep01-S1-01.mp4", + "name": "kling-付费才能修仙-ep01-S1-01.mp4", + "duration": 5.1, + "size": 12496988, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/kling-付费才能修仙-ep01-S1-02.mp4", + "name": "kling-付费才能修仙-ep01-S1-02.mp4", + "duration": 5.1, + "size": 7832006, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/kling-付费才能修仙-ep01-S1-03.mp4", + "name": "kling-付费才能修仙-ep01-S1-03.mp4", + "duration": 5.1, + "size": 8145508, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/opening_3D.mp4", + "name": "opening_3D.mp4", + "duration": 11.5, + "size": 14091840, + "width": 720, + "height": 1280, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/opening_3D_test.mp4", + "name": "opening_3D_test.mp4", + "error": "Command failed: ffprobe -v quiet -print_format json -show_format -show_streams /Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/opening_3D_test.mp4" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/opening_fade.mp4", + "name": "opening_fade.mp4", + "duration": 12.125, + "size": 3817330, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/opening_full.mp4", + "name": "opening_full.mp4", + "duration": 13.897705, + "size": 7833017, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/opening_preview.mp4", + "name": "opening_preview.mp4", + "duration": 7.772705, + "size": 4842600, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/opening_smooth.mp4", + "name": "opening_smooth.mp4", + "duration": 13.5, + "size": 3804530, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/v1_trim.mp4", + "name": "v1_trim.mp4", + "duration": 2.583008, + "size": 1226412, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/v2_trim.mp4", + "name": "v2_trim.mp4", + "duration": 3.083333, + "size": 2342306, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/v3_trim.mp4", + "name": "v3_trim.mp4", + "duration": 2.083333, + "size": 1146105, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/v4_trim.mp4", + "name": "v4_trim.mp4", + "duration": 4.041667, + "size": 1846998, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/v5_trim.mp4", + "name": "v5_trim.mp4", + "duration": 2.083333, + "size": 1276474, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/付费才能修仙-ep01-S1-01.mp4", + "name": "付费才能修仙-ep01-S1-01.mp4", + "duration": 5.06195, + "size": 3810494, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/付费才能修仙-ep01-S1-02.mp4", + "name": "付费才能修仙-ep01-S1-02.mp4", + "duration": 5.06195, + "size": 4105479, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/付费才能修仙-ep01-S1-03.mp4", + "name": "付费才能修仙-ep01-S1-03.mp4", + "duration": 5.06195, + "size": 2991346, + "width": 1280, + "height": 720, + "codec": "h264" + } + ], + "jzao3dVideos": [ + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01-3D/3D-镜1.mp4", + "name": "3D-镜1.mp4", + "duration": 4.062993, + "size": 1843725, + "width": 720, + "height": 1280, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01-3D/3D-镜2.mp4", + "name": "3D-镜2.mp4", + "duration": 4.062993, + "size": 3107199, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01-3D/3D-镜3.mp4", + "name": "3D-镜3.mp4", + "duration": 4.086009, + "size": 2818060, + "width": 1280, + "height": 720, + "codec": "h264" + }, + { + "file": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01-3D/3D-镜4.mp4", + "name": "3D-镜4.mp4", + "duration": 4.062993, + "size": 3018880, + "width": 1280, + "height": 720, + "codec": "h264" + } + ], + "jzaoFound15s": true, + "registry": { + "total": 7, + "missingFiles": 0 + }, + "registryMissingExistingFiles": [], + "statusClaimsInProgress": false, + "promptsStillRealistic": true, + "issues": [ + { + "level": "yellow", + "title": "旧提示词仍是真人写实", + "detail": "ep01-prompts.json属于旧线,不能作为3D主线继续生成。" + } + ] +} \ No newline at end of file diff --git a/video-ai-system/outputs/system-audit-latest.md b/video-ai-system/outputs/system-audit-latest.md new file mode 100644 index 0000000..4b29d23 --- /dev/null +++ b/video-ai-system/outputs/system-audit-latest.md @@ -0,0 +1,22 @@ +# 视频AI系统 · 无成本体检报告 + +生成时间: 2026-06-22T08:39:13.809Z + +当前active制作线: 3d(3D漫剧) +剧本MD: 存在 +分镜: 21镜 / 69s +导演编码: 3镜 +本地产物: 11个mp4 +JZAO ep01产物: 30个mp4 +JZAO ep01-3D产物: 4个mp4 +注册表: 7条 / 失效路径0条 + +## 问题 +- YELLOW · 旧提示词仍是真人写实: ep01-prompts.json属于旧线,不能作为3D主线继续生成。 + +## 推荐下一步 +1. 只保留3D漫剧为active制作线。 +2. 旧真人提示词不再继续生成,重新生成3D主线提示词。 +3. 以JZAO中已存在的D136/3D产物为基准做铸渊之眼质检。 +4. 状态文件必须由体检报告回写,不再靠人工记忆。 +5. 生成API只在体检通过后调用。 diff --git a/video-ai-system/outputs/video-registry.json b/video-ai-system/outputs/video-registry.json index 78f72ae..aabb530 100644 --- a/video-ai-system/outputs/video-registry.json +++ b/video-ai-system/outputs/video-registry.json @@ -29,13 +29,13 @@ }, "付费才能修仙-ep01-S1-03": { "shotId": "付费才能修仙-ep01-S1-03", - "taskId": "cgt-20260621164449-m8czv", + "taskId": "cgt-20260621180038-8t8bm", "projectKey": "付费修仙/ep01", - "filePath": "/Users/bingshuolingdianyuanhe/guanghulab/video-ai-system/outputs/shots/付费才能修仙-ep01-S1-03.mp4", + "filePath": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01/付费才能修仙-ep01-S1-03.mp4", "duration": 5, "resolution": "720p", "promptPreview": "修仙世界·3D动画渲染·电影级光影·动态漫风格。修仙世界开阔广场,云海环绕远处山峰,白天阳光明媚金色光芒仙气弥漫。广场上人山人海宗门招牌林立,在人群边缘的一个角", - "generatedAt": "2026-06-21T08:49:17.336Z", + "generatedAt": "2026-06-21T10:05:42.868Z", "dNumber": "D135" }, "cgt-20260621180038-8t8bm": { @@ -83,4 +83,4 @@ "dNumber": "D136+" } } -} \ No newline at end of file +} diff --git a/video-ai-system/tools/audit-system.js b/video-ai-system/tools/audit-system.js new file mode 100644 index 0000000..a0974a2 --- /dev/null +++ b/video-ai-system/tools/audit-system.js @@ -0,0 +1,252 @@ +#!/usr/bin/env node +/** + * 光湖视频AI系统 · 无成本体检脚本 + * D140 · Codex收口层 + * + * 只扫描本地仓库和JZAO外置盘,不调用任何视频/图片生成API。 + * 目标: 把剧本、分镜、导演编码、产物、注册表、制作线状态对齐成一张报告。 + */ + +const fs = require('fs'); +const path = require('path'); +const { execFileSync } = require('child_process'); + +const ROOT = path.resolve(__dirname, '../..'); +const SYS = path.join(ROOT, 'video-ai-system'); +const OUT = path.join(SYS, 'outputs'); +const SCRIPT_MD = path.join(ROOT, '动态漫:《付费才能修仙?我的宗门全免费》.md'); +const PRODUCT_LINES = path.join(SYS, 'config/product-lines.json'); +const STORYBOARD = path.join(SYS, 'data/ep01-storyboard.json'); +const DIRECTOR_ENCODING = path.join(OUT, '付费修仙-ep01-director-encoding.json'); +const VIDEO_REGISTRY = path.join(OUT, 'video-registry.json'); +const STATUS = path.join(SYS, 'memory/zai-fu-fei-xiu-xian/STATUS.hdlp'); +const JZAO_EP01 = '/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01'; +const JZAO_EP01_3D = '/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/视频/zai-fu-fei-xiu-xian/ep01-3D'; + +function readJson(file, fallback = null) { + try { + return JSON.parse(fs.readFileSync(file, 'utf8')); + } catch (e) { + return fallback; + } +} + +function exists(file) { + return fs.existsSync(file); +} + +function listFiles(dir, exts) { + if (!exists(dir)) return []; + const out = []; + const stack = [dir]; + while (stack.length) { + const current = stack.pop(); + for (const name of fs.readdirSync(current)) { + if (name.startsWith('._')) continue; + const p = path.join(current, name); + const stat = fs.statSync(p); + if (stat.isDirectory()) { + stack.push(p); + } else if (exts.includes(path.extname(name).toLowerCase())) { + out.push(p); + } + } + } + return out.sort(); +} + +function ffprobe(file) { + try { + const raw = execFileSync('ffprobe', [ + '-v', 'quiet', + '-print_format', 'json', + '-show_format', + '-show_streams', + file, + ], { encoding: 'utf8', timeout: 8000 }); + const meta = JSON.parse(raw); + const stream = (meta.streams || []).find(s => s.codec_type === 'video') || {}; + return { + duration: Number.parseFloat(meta.format?.duration || stream.duration || 0), + size: Number.parseInt(meta.format?.size || '0', 10), + width: stream.width || null, + height: stream.height || null, + codec: stream.codec_name || null, + }; + } catch (e) { + return { error: e.message }; + } +} + +function summarizeVideos(files) { + return files.map(file => ({ + file, + name: path.basename(file), + ...ffprobe(file), + })); +} + +function activeLines(config) { + const lines = config?.lines || {}; + return Object.entries(lines) + .filter(([, v]) => v.active) + .map(([k, v]) => ({ key: k, name: v.name, status: v.status || 'active' })); +} + +function detectIssues(data) { + const issues = []; + if (data.activeLines.length !== 1) { + issues.push({ + level: 'red', + title: '制作线必须只有一条active', + detail: `当前active数量=${data.activeLines.length}`, + }); + } + if (data.activeLines[0]?.key !== '3d') { + issues.push({ + level: 'red', + title: '当前主线不是3D漫剧', + detail: '冰朔已决策注销真人线,主线必须是3d。', + }); + } + if (!data.script.exists) { + issues.push({ level: 'red', title: '剧本MD缺失', detail: SCRIPT_MD }); + } + if (!data.storyboard.exists) { + issues.push({ level: 'red', title: '分镜JSON缺失', detail: STORYBOARD }); + } + if (!data.directorEncoding.exists) { + issues.push({ level: 'red', title: '导演编码缺失', detail: DIRECTOR_ENCODING }); + } + if (data.localFinals.length === 0 && data.jzaoVideos.length === 0 && data.jzao3dVideos.length === 0) { + issues.push({ level: 'red', title: '没有发现任何视频产物', detail: 'outputs和JZAO均为空。' }); + } + if (data.statusClaimsInProgress && data.jzaoFound15s) { + issues.push({ + level: 'yellow', + title: '状态文件滞后', + detail: 'STATUS仍写生成中,但JZAO已发现D136 15秒成品。', + }); + } + if (data.promptsStillRealistic) { + issues.push({ + level: 'yellow', + title: '旧提示词仍是真人写实', + detail: 'ep01-prompts.json属于旧线,不能作为3D主线继续生成。', + }); + } + if (data.registryMissingExistingFiles.length > 0) { + issues.push({ + level: 'yellow', + title: '注册表存在失效文件路径', + detail: `${data.registryMissingExistingFiles.length}条registry路径在当前机器上不存在。`, + }); + } + return issues; +} + +function main() { + const product = readJson(PRODUCT_LINES, {}); + const storyboard = readJson(STORYBOARD, {}); + const encoding = readJson(DIRECTOR_ENCODING, {}); + const registry = readJson(VIDEO_REGISTRY, { shots: {} }); + const promptsText = exists(path.join(SYS, 'data/ep01-prompts.json')) + ? fs.readFileSync(path.join(SYS, 'data/ep01-prompts.json'), 'utf8') + : ''; + const statusText = exists(STATUS) ? fs.readFileSync(STATUS, 'utf8') : ''; + const statusClaimsInProgress = statusText + .split(/\r?\n/) + .some(line => /(\|.*(🔄|生成中|重新生成中))|(\[[ x]\].*(生成中|重新生成中))/.test(line)); + + const localVideos = summarizeVideos([ + ...listFiles(path.join(OUT, 'final'), ['.mp4']), + ...listFiles(path.join(OUT, 'shots'), ['.mp4']), + ...listFiles(OUT, ['.mp4']), + ]); + const jzaoVideos = summarizeVideos(listFiles(JZAO_EP01, ['.mp4'])); + const jzao3dVideos = summarizeVideos(listFiles(JZAO_EP01_3D, ['.mp4'])); + const registryEntries = Object.values(registry.shots || {}); + const registryMissingExistingFiles = registryEntries.filter(x => x.filePath && !exists(x.filePath)); + + const data = { + generatedAt: new Date().toISOString(), + activeLines: activeLines(product), + script: { + exists: exists(SCRIPT_MD), + file: SCRIPT_MD, + size: exists(SCRIPT_MD) ? fs.statSync(SCRIPT_MD).size : 0, + }, + storyboard: { + exists: exists(STORYBOARD), + shots: storyboard.shots?.length || 0, + totalDuration: (storyboard.shots || []).reduce((s, x) => s + (Number(x.duration) || 0), 0), + }, + directorEncoding: { + exists: exists(DIRECTOR_ENCODING), + shots: encoding.shots?.length || 0, + project: encoding.project, + episode: encoding.episode, + }, + localFinals: localVideos.filter(v => v.file.includes('/outputs/final/')), + localVideos, + jzaoVideos, + jzao3dVideos, + jzaoFound15s: jzaoVideos.some(v => v.name.includes('15s') || v.name.includes('opening')), + registry: { + total: registryEntries.length, + missingFiles: registryMissingExistingFiles.length, + }, + registryMissingExistingFiles, + statusClaimsInProgress, + promptsStillRealistic: /真人写实/.test(promptsText), + }; + + data.issues = detectIssues(data); + + const jsonPath = path.join(OUT, 'system-audit-latest.json'); + fs.writeFileSync(jsonPath, JSON.stringify(data, null, 2), 'utf8'); + + const lines = []; + lines.push('# 视频AI系统 · 无成本体检报告'); + lines.push(''); + lines.push(`生成时间: ${data.generatedAt}`); + lines.push(''); + lines.push(`当前active制作线: ${data.activeLines.map(x => `${x.key}(${x.name})`).join(', ') || '无'}`); + lines.push(`剧本MD: ${data.script.exists ? '存在' : '缺失'}`); + lines.push(`分镜: ${data.storyboard.shots}镜 / ${data.storyboard.totalDuration}s`); + lines.push(`导演编码: ${data.directorEncoding.shots}镜`); + lines.push(`本地产物: ${data.localVideos.length}个mp4`); + lines.push(`JZAO ep01产物: ${data.jzaoVideos.length}个mp4`); + lines.push(`JZAO ep01-3D产物: ${data.jzao3dVideos.length}个mp4`); + lines.push(`注册表: ${data.registry.total}条 / 失效路径${data.registry.missingFiles}条`); + lines.push(''); + lines.push('## 问题'); + if (data.issues.length === 0) { + lines.push('- 无红黄问题。'); + } else { + for (const issue of data.issues) { + lines.push(`- ${issue.level.toUpperCase()} · ${issue.title}: ${issue.detail}`); + } + } + lines.push(''); + lines.push('## 推荐下一步'); + lines.push('1. 只保留3D漫剧为active制作线。'); + lines.push('2. 旧真人提示词不再继续生成,重新生成3D主线提示词。'); + lines.push('3. 以JZAO中已存在的D136/3D产物为基准做铸渊之眼质检。'); + lines.push('4. 状态文件必须由体检报告回写,不再靠人工记忆。'); + lines.push('5. 生成API只在体检通过后调用。'); + lines.push(''); + const mdPath = path.join(OUT, 'system-audit-latest.md'); + fs.writeFileSync(mdPath, lines.join('\n'), 'utf8'); + + console.log(`体检完成: ${jsonPath}`); + console.log(`报告: ${mdPath}`); + if (data.issues.length) { + console.log('发现问题:'); + data.issues.forEach(i => console.log(`- ${i.level}: ${i.title}`)); + } else { + console.log('未发现红黄问题。'); + } +} + +main();