diff --git a/video-ai-system/engines/generate-shots.js b/video-ai-system/engines/generate-shots.js index 2ebfa44..0d8e4e2 100644 --- a/video-ai-system/engines/generate-shots.js +++ b/video-ai-system/engines/generate-shots.js @@ -66,61 +66,56 @@ function buildPrompt(shot, encoding) { const locks = encoding.continuity_locks; // ═══ 编码+自然语言 双层协议 ═══ - // 冰朔: 编码锁死不可变的(人物/道具)→ 只锁关键属性,精简。 - // 自然语言解释为什么(场景/动机)→ 让AI理解原因→自己推理。 - // 如果全锁死,AI没有了"灵光一闪"的可能性。 // - // 三层结构: - // ⊢ 编码层 (锁死·不可变) ← 精简CHAR/PROP关键属性 - // ⊢ 场景层 (自然语言·理解) ← AI理解为什么→自己推理 - // → 动作层 (自然语言·发挥) ← 具体做什么·给AI空间 + // ⊢ 编码层: 锁死不可变的 + // CHAR(人物) + PROP(道具) + ENV(环境·空间·背景) + // 这些在任何镜头里都不能变。精简,只锁关键属性。 + // + // ⊢ 场景层: 自然语言 → AI自己推理 + // 情节内容 + 为什么(动机·情感·因果关系) + // 让AI理解原因→自己推理→生成有灵魂的画面 let prompt = ''; - // ─── 编码层: 只锁关键属性 ─── + // ─── 编码层: CHAR+PROP+ENV全部锁定 ─── if (shot.char_ref && locks?.characters?.[shot.char_ref]) { - prompt += `⊢ CHAR-003 · 苏白 · 编码锁定\n`; + prompt += `⊢ CHAR-003 · 苏白 · 锁定\n`; prompt += ` 18岁男性·白色长衫·黑色长发半束·175cm挺拔\n`; } if (shot.prop_ref && locks?.props?.[shot.prop_ref]) { - const propLock = locks.props[shot.prop_ref]; - prompt += `⊢ ${shot.prop_ref} · 编码锁定\n`; + prompt += `⊢ PROP · 锁定\n`; prompt += ` 竖式悬挂·破旧木质·【天道宗】\n`; } if (shot.prop_ref_2 && locks?.props?.[shot.prop_ref_2]) { const propLock2 = locks.props[shot.prop_ref_2]; - prompt += `⊢ ${shot.prop_ref_2} · 编码锁定\n`; - prompt += ` 横式立地·破旧木板·招生广告: ${propLock2.text}\n`; + prompt += `⊢ PROP · 锁定\n`; + prompt += ` 横式立地·破旧木板·招生广告\n`; } - // ─── 场景层: 自然语言 → AI理解为什么 ─── + // 环境锁定 + if (shot.env && locks?.environments?.[shot.env]) { + prompt += `⊢ ENV-002 · 锁定\n`; + prompt += ` 修仙世界·百宗会广场·人群边缘角落·白天金色阳光\n`; + } + + // ─── 场景层: 情节+原因 → AI推理 ─── if (encoding.scene) { - prompt += `\n⊢ 场景 · 自然语言理解\n`; + prompt += `\n⊢ 场景\n`; prompt += ` ${encoding.scene}\n`; } - // ─── 空间 ─── - if (shot.env && locks?.environments?.[shot.env]) { - const hasChar = !!(shot.char_ref && locks?.characters?.[shot.char_ref]); - if (!hasChar) { - // 纯环境镜 - prompt += `\n⊢ 空间\n`; - prompt += ` 修仙广场·人群边缘角落·金色阳光·3D动画渲染\n`; - } - } - - // ─── 动作层: 自然语言 → AI发挥 ─── + // ─── 动作: 自然语言 → AI发挥 ─── prompt += `\n→ 景别: ${shot.framing}`; - if (shot.emotion?.type) prompt += ` | 氛围: ${shot.emotion.type}`; + if (shot.emotion?.type) prompt += ` | ${shot.emotion.type}`; prompt += `\n`; if (shot.action) { prompt += `→ ${shot.action}\n`; } - // ─── 风格约束 ─── - prompt += `⊢ 风格: 3D动画渲染·中国风仙侠·电影级光影·高质感\n`; + // ─── 风格 ─── + prompt += `⊢ 风格: 3D动画渲染·中国风仙侠·电影级光影\n`; prompt += `⊢ 禁止: 真人写实·卡通·现代元素·水印`; return prompt; diff --git a/video-ai-system/outputs/付费修仙-ep01-director-encoding.json b/video-ai-system/outputs/付费修仙-ep01-director-encoding.json index 56d6872..e0c8d02 100644 --- a/video-ai-system/outputs/付费修仙-ep01-director-encoding.json +++ b/video-ai-system/outputs/付费修仙-ep01-director-encoding.json @@ -3,7 +3,7 @@ "episode": "ep01", "tempo": "slow_build", "emotion_main": "悬", - "scene": "修仙界百宗会广场,今天是宗门收徒的日子。灵霄宗门庭若市,队伍排到望不到头。而天道宗——穷得只剩一块破牌匾,无人问津。但苏白有系统,他知道自己早晚是世界第一宗。所以他不绝望,他站在破牌匾下大声吆喝,不是因为绝望,是因为笃定。他的喊话不是乞求,是宣言。围观的人嘲笑他,讽刺完散去,风吹起落叶——但苏白的叹气不是认命,是系统进度条走太慢的烦躁。", + "scene": "今天是宗门收徒的日子。灵霄宗门庭若市,队伍排到望不到头。而天道宗穷得只剩一块破牌匾,无人问津。但苏白有系统,他知道自己早晚是世界第一宗。所以他站在破牌匾下大声吆喝——不是因为绝望,是因为笃定。他的喊话不是乞求,是宣言。围观的人嘲笑他,讽刺完散去,风吹起落叶。苏白叹气——不是认命,是系统进度条走太慢的烦躁。", "emotion_curve": [ { "pos": "0-5s", "intensity": 3, "type": "悬", "role": "建立" }, { "pos": "5-10s", "intensity": 6, "type": "燃", "role": "登场" },