D140: switch video AI to 3D audit path
This commit is contained in:
parent
b54a0625d7
commit
a1a20aea2a
@ -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注册表 + 连续性检查
|
||||
|
||||
|
||||
@ -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 同步
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@ -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观感尴尬、人物表演和一致性成本过高
|
||||
└── 规则: 旧真人提示词不可继续作为主线生成
|
||||
|
||||
═══ 人物全量预登记 ═══
|
||||
|
||||
|
||||
@ -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": {
|
||||
|
||||
@ -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架构
|
||||
|
||||
468
video-ai-system/outputs/system-audit-latest.json
Normal file
468
video-ai-system/outputs/system-audit-latest.json
Normal file
@ -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主线继续生成。"
|
||||
}
|
||||
]
|
||||
}
|
||||
22
video-ai-system/outputs/system-audit-latest.md
Normal file
22
video-ai-system/outputs/system-audit-latest.md
Normal file
@ -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只在体检通过后调用。
|
||||
@ -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+"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
252
video-ai-system/tools/audit-system.js
Normal file
252
video-ai-system/tools/audit-system.js
Normal file
@ -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();
|
||||
Loading…
x
Reference in New Issue
Block a user