{"id":"253a7672-9c31-4be9-af23-f57ea59fdc6e","entityType":"agent","slug":"clawhub-lucas-kay8-fableforge","name":"Fableforge","canonicalUrl":"https://www.xpersona.co/agent/clawhub-lucas-kay8-fableforge","canonicalPath":"/agent/clawhub-lucas-kay8-fableforge","generatedAt":"2026-10-11T17:43:37.944Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T14:32:52.266Z","emptyReason":null},"description":"FableForge 通用视频生成流水线 SOP。支持两种生产模式（图片流、视频 B-roll 流）和三种体裁（叙事寓言、商业分析、产品宣发）。包含从概念生成、剧本创作、TTS 配音、素材采集、到 HyperFrames 视频渲染的完整工业化 SOP，以及视觉风格指南与技术陷阱手册。v1.2.0 新增 VAD 物... Skill: Fableforge Owner: lucas-kay8 Summary: FableForge 通用视频生成流水线 SOP。支持两种生产模式（图片流、视频 B-roll 流）和三种体裁（叙事寓言、商业分析、产品宣发）。包含从概念生成、剧本创作、TTS 配音、素材采集、到 HyperFrames 视频渲染的完整工业化 SOP，以及视觉风格指南与技术陷阱手册。v1.2.0 新增 VAD 物... Tags: latest:1.2.0 Version history: v1.2.0 | 2026-05-22T03:04:08.772Z | user v1.2.0: 引入VAD声学平铺匹配、语速自动健康度审计门禁、大分镜GSAP变量解耦与生命周期控制 v1.1.0 | 2026-05-20T11:21:51.456Z | user FableForge 技能升级至 v1.1.0，新增全局禁令、素材新鲜度校验、渲染前集成检","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s1761m7dq1gcshz013v85wrpg586z1tn:fableforge","sourceUrl":"https://clawhub.ai/lucas-kay8/fableforge","homepage":"https://clawhub.ai/lucas-kay8/skills/fableforge","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/lucas-kay8/fableforge","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/lucas-kay8/skills/fableforge","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"FableForge 通用视频生成流水线 SOP。支持两种生产模式（图片流、视频 B-roll 流）和三种体裁（叙事寓言、商业分析、产品宣发）。包含从概念生成、剧本创作、TTS 配音、素材采集、到 HyperFrames 视频渲染的完整工业化 SOP，以及视觉风格指南与技术陷阱手册。v1.2.0 新增 VAD 物..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:32:52.266Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:32:52.266Z","emptyReason":null},"stars":null,"forks":null,"downloads":1049,"packageName":null,"latestVersion":"1.2.0","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:32:52.258Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T14:32:52.266Z","lastCrawledAt":"2026-10-11T14:32:52.258Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T14:32:52.258Z","lastVerifiedAt":null,"highlights":[{"version":"1.2.0","createdAt":"2026-05-22T03:04:08.772Z","changelog":"v1.2.0: 引入VAD声学平铺匹配、语速自动健康度审计门禁、大分镜GSAP变量解耦与生命周期控制","fileCount":17,"zipByteSize":49919},{"version":"1.1.0","createdAt":"2026-05-20T11:21:51.456Z","changelog":"FableForge 技能升级至 v1.1.0，新增全局禁令、素材新鲜度校验、渲染前集成检查清单、模式 B 封面/字幕模板","fileCount":16,"zipByteSize":45176},{"version":"1.0.0","createdAt":"2026-05-18T07:49:13.014Z","changelog":"ai-video-studio v1.0.0 初始版本发布 - 发布 FableForge 通用 AI 视频生成流水线 SOP，涵盖全流程分阶段执行标准 - 明确支持「图片流」与「B-roll 视频流」两种生产模式，三种体裁（叙事、分析、宣发） - 引入三重内容验收门禁、视觉风格圣经、技术排坑等质量保障措施 - 提供分阶段（Scaffolding、剧本、音频、排版、动画、发布）标准作业细则 - 附加行业级归档结构与资源手册，提升流程工业化与可扩展性","fileCount":16,"zipByteSize":42599}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1761m7dq1gcshz013v85wrpg586z1tn:fableforge","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lucas-kay8-fableforge/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lucas-kay8-fableforge/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lucas-kay8-fableforge/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-lucas-kay8-fableforge/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-lucas-kay8-fableforge/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-lucas-kay8-fableforge/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T17:43:37.941Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lucas-kay8-fableforge/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lucas-kay8-fableforge/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lucas-kay8-fableforge/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lucas-kay8-fableforge/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T14:32:52.266Z","emptyReason":null},"readme":"Skill: Fableforge\n\nOwner: lucas-kay8\n\nSummary: FableForge 通用视频生成流水线 SOP。支持两种生产模式（图片流、视频 B-roll 流）和三种体裁（叙事寓言、商业分析、产品宣发）。包含从概念生成、剧本创作、TTS 配音、素材采集、到 HyperFrames 视频渲染的完整工业化 SOP，以及视觉风格指南与技术陷阱手册。v1.2.0 新增 VAD 物...\n\nTags: latest:1.2.0\n\nVersion history:\n\nv1.2.0 | 2026-05-22T03:04:08.772Z | user\n\nv1.2.0: 引入VAD声学平铺匹配、语速自动健康度审计门禁、大分镜GSAP变量解耦与生命周期控制\n\nv1.1.0 | 2026-05-20T11:21:51.456Z | user\n\nFableForge 技能升级至 v1.1.0，新增全局禁令、素材新鲜度校验、渲染前集成检查清单、模式 B 封面/字幕模板\n\nv1.0.0 | 2026-05-18T07:49:13.014Z | auto\n\nai-video-studio v1.0.0 初始版本发布  \n- 发布 FableForge 通用 AI 视频生成流水线 SOP，涵盖全流程分阶段执行标准  \n- 明确支持「图片流」与「B-roll 视频流」两种生产模式，三种体裁（叙事、分析、宣发）  \n- 引入三重内容验收门禁、视觉风格圣经、技术排坑等质量保障措施  \n- 提供分阶段（Scaffolding、剧本、音频、排版、动画、发布）标准作业细则  \n- 附加行业级归档结构与资源手册，提升流程工业化与可扩展性\n\nArchive index:\n\nArchive v1.2.0: 17 files, 49919 bytes\n\nFiles: resources/stages/stage_0_env.md (1825b), resources/stages/stage_1_creatives.md (12505b), resources/stages/stage_2_timeline.md (4244b), resources/stages/stage_3_static.md (10222b), resources/stages/stage_4_animation.md (4440b), resources/stages/stage_5_publish.md (2798b), resources/style_bible.md (3137b), resources/template/index.html (3859b), resources/template/script-template.md (3443b), resources/template/style.css (2519b), resources/template/视频脚本.md (1462b), resources/troubleshooting.md (3969b), resources/voice-model/README.md (2287b), skill-card.md (3376b), SKILL.en.md (19094b), SKILL.md (16113b), _meta.json (129b)\n\nFile v1.2.0:SKILL.md\n\n---\nname: ai-video-studio\nversion: 1.2.0\ndescription: FableForge 通用视频生成流水线 SOP。支持两种生产模式（图片流、视频 B-roll 流）和三种体裁（叙事寓言、商业分析、产品宣发）。包含从概念生成、剧本创作、TTS 配音、素材采集、到 HyperFrames 视频渲染的完整工业化 SOP，以及视觉风格指南与技术陷阱手册。v1.2.0 新增 VAD 物理声学平铺匹配、语速自动健康度审计（防脱节门禁）、大分镜 GSAP 变量解耦与生命周期显隐控制。\n---\n\n# 🔨 FableForge · 视频生成工业流水线 AI Agent SOP\n\n本 Skill 是一份**命令级可执行 SOP**，而非经验教训集。每个 Stage 均包含**具体执行命令**和**退出验收标准**，严禁跳步或在退出标准未满足时进入下一阶段。\n\n### ⛔ 全局禁令（违反任意一条即判定为生产事故）\n\n1. **严禁复用旧集素材**：每一集的 `assets/` 目录下的所有文件（视频、音频、图片、BGM）必须为本次任务全新生成或下载。严禁从其他 `episodes/` 目录复制任何媒体文件。唯一例外是 `narration.wav`（由 TTS 脚本生成）和模板代码结构（非媒体文件）。\n2. **严禁跳过退出标准**：每个 Stage 的退出标准中的所有检查项必须逐一验证并标记为通过，才能进入下一个 Stage。\n3. **严禁无字幕渲染**：无论模式 A 还是模式 B，最终视频必须包含与配音同步的逐字滚动字幕。\n4. **严禁无封面/封底渲染**：所有视频必须包含封面标题幕（`#scene_cover`）和封底互动幕（`#scene_end`）。\n5. **严禁复用旧集 BGM**：每集的背景音乐必须根据本集剧本的情绪主题全新搜索并下载，不得复用历史集的 `bgm.mp3`。\n\n---\n\n## 0. 视频规格与体裁定义（内容优先定档制）\n\n**核心原则：内容的可理解性永远优先于时长限制。**\n\n视频时长不是预设的固定值，而是由内容倒推得出的。错误的做法是「先定 60 秒，然后把内容往里塞」；正确的做法是「先确认内容讲完需要多少字，再据此选档」。\n\n### 0.0 视频体裁系统 (Genre)\n\n本流水线支持三种核心体裁。在构思内容前，**必须首先确定体裁**：\n\n| 体裁 (Genre) | 特征与核心要求 | 适用场景 | 常用视觉模式 |\n|-------------|-----------|---------|---------|\n| **Genre X: 叙事/隐喻 (Narrative)** | 有角色、有冲突。旁白重感受轻动作，追求悬念与结局升华。 | 寓言故事、历史重现、管理隐喻 | + 模式 A (图片) |\n| **Genre Y: 分析/科普 (Analytical)** | 论点驱动、逻辑递进。追求清晰的结构拆解和痛点直击。 | 商业分析、职场洞察、技术科普 | + 模式 B (B-roll) |\n| **Genre Z: 宣发/展示 (Promotional)**| 产品中心、利益点明确。强节奏感与转化引导 (CTA)。 | 产品宣发、网站转视频、功能展示 | 混合模式 |\n\n### 0.1 三档体系\n\n| 档位 | 适用场景 | 旁白总字数 | 预估时长 | 分镜数 |\n|------|---------|-----------|---------|-------|\n| S · 短片 | 单一概念解释、痛点直击、高密度短平快 | 150～450 字 | 45～120 秒 | 1+5~12+1 |\n| M · 标准 | 完整叙事、多维度拆解、深度论证 | 450～900 字 | 120～270 秒 | 1+12~20+1 |\n| L · 长篇 | 复杂案例剖析、连续剧集 | 900～1500 字 | 270～420 秒 | 1+20~30+1 |\n\n> 超过 1500 字的内容必须拆成上下集（每集独立成片，各自包含封面和结尾）。\n\n### 0.2 定档公式\n\n```\n旁白总字数 = 原始故事中【不可删减要素】的合计字数（见 0.3）\n预估时长(秒) = 旁白总字数 ÷ 3.5（中文语速）\n根据预估时长选择对应档位\n```\n\n### 0.3 不可删减要素（内容完整性红线）\n\n不同体裁有不同的不可删减要素。如果被删除，观众将无法理解视频的核心价值。**剧本转化阶段（Stage 1.2）严禁删除这些要素：**\n\n| 体裁 (Genre) | 核心不可删减要素 | 删除后果 |\n|-------------|----------------|----------|\n| **Narrative (叙事类)** | 因果链、角色动机、关键对话、认知翻转事件、结局因果闭环 | 观众不知道“为什么”，悬念消失，结论像硬塞的 |\n| **Analytical (分析类)**| 痛点现象描述、核心矛盾拆解、数据对比/逻辑支撑、金句结论 | 视频变成空洞的说教，缺乏说服力 |\n| **Promotional(宣发类)**| 目标受众痛点、核心利益点 (Benefit)、差异化价值、明确的 CTA | 看完后不知道自己能得到什么，无法转化 |\n\n**可以精简的要素：**\n- 重复的环境描写或冗长的数据罗列（保留首次，后续可省略）\n- 纯装饰性的形容词堆叠\n- 不影响主线的次要信息\n- 已被画面传达的信息（如「山很高」——画面已经表达了）\n\n### 0.4 通用规格（所有档位共享）\n\n| 规格项 | 标准值 | 说明 |\n|--------|--------|------|\n| 每幕旁白字数 | 中文 30～80 字 / 英文 20～50 词 | 中文约 3.5 字/秒，英文约 2.5 词/秒 |\n| 每幕预估时长 | 5 ～ 15 秒 | 最终以音频实测为准 |\n| 分镜编号格式 | `scene_cover`, `scene1`~`scene{N}`, `scene_end` | 与 `assets/` 下的图片名严格一一对应 |\n| 旁白与分镜对应 | 1 幕 == 1 张图 == 1 段旁白 | 封面通常对应标题旁白，结尾对应金句旁白 |\n\n---\n\n## 0.5 质量门禁（三重内容验收）\n\n视频质量的上限由三个核心因素决定。**每一重门禁未通过，不得进入下一阶段。**\n\n### 门禁一：概念与大纲验收（概念生成后、停机确认前执行）\n\nAI 容易生成\"结构正确但洞察平庸\"的内容。在向用户展示前，必须根据体裁完成自检：\n\n**强制自检（全部通过方可提交用户确认）：**\n- [ ] **反常识测试 (通用)**：这个洞察/角度是\"大家都知道\"还是\"大家都经历但从没被命名\"的？前者没传播价值，重写。\n- [ ] **Genre X (叙事) 专属**：结局是否让人感到轻微不适或醍醐灌顶？隐喻是否太直白（能在前10秒猜到结局）？\n- [ ] **Genre Y (分析) 专属**：逻辑链条是否严密？是否提出了具有实操性的认知升华？\n- [ ] **现实锚定测试 (通用)**：结尾的解释/结论，是否映射到了用户**今天就可能遭遇**的具体场景？\n\n---\n\n### 门禁二：脚本节奏验收（剧本转化后执行）\n\n脚本是情绪与逻辑的乐谱。全片节奏必须有起伏，禁止平铺直叙。\n\n**体裁节奏铁律：**\n\n- **Genre X (叙事类) — 情绪驱动**：\n  - **写感受，不写动作**。旁白描述情绪状态，而不是画面动作（❌ `\"十只狼排成一列\"` → ✅ `\"山谷里没有声音，只有风\"`）。\n  - **采用 1-4 情绪档位系统**（1舒缓/2蓄力/3爆发/4留白），并在剧本中标注。\n- **Genre Y (分析类) — 逻辑驱动**：\n  - **结构清晰**：必须遵循“现象引入 → 核心矛盾 → 数据/逻辑支撑 → 升华结论”的节奏。\n  - **金句前置或垫后**：关键论点必须短小精悍。\n- **所有体裁通用**：\n  - **结论幕字数减半**：最后一幕旁白不超过 20 字。越重要的道理，越要用更少的字。\n  - **剧本格式补充档位字段**：每幕必须标注 `- **情绪/节奏档位**：{X}`，指导配音语气与画面。\n  - **剔除字幕语气省略号（黄金审美红线）**：严禁在生成的 HTML 字幕、文本及海报中包含任何由于配音语气停顿而产生的 `……`、`...` 或是拖泥带水的标点冗余。配音的停顿必须纯粹通过声音的节奏（如 TTS 音频）去表现，而屏幕上的视觉文字与金句必须保持绝对干净利索、斩钉截铁，字字铿锵有力。\n\n---\n\n### 门禁三：图片质量验收（图片生成后、进入 Stage 2 前执行）\n\n**构图与画幅规范（强制）：**\n- **画幅固定**：必须生成 **9:16 竖屏**图片（DALL-E 3 使用 `1024x1792`）。严禁使用横屏图片。\n- **主体位置**：主体人物/物件必须在画面**上方 1/3** 区域，底部留给字幕区。\n- **提示词必加**：`cinematic vertical shot, 9:16 aspect ratio, subject positioned in upper third of frame, dark atmospheric space at bottom`\n- **全片一致性**：主光源方向统一，保持跨幕视觉连贯。\n\n**风格圣经与一致性工作流（强制）：**\n为了保证多幕生图的视觉一致性，在生成任何图片之前，必须先根据体裁和设定定义一套「风格圣经」作为所有提示词的前缀，并为主要角色建立角色特征词组。\n\n详细的风格圣经编写步骤、提示词工程公式以及角色一致性锚定工作流，请务必直接阅读 [🎨 视觉风格参考手册](file://./resources/style_bible.md)。\n\n**逐张自检：**\n- [ ] **封面图 (scene_cover)**：视觉冲击力极强，具备悬念感，能瞬间抓住注意力。\n- [ ] **结尾图 (scene_end)**：意境深远，具备“神性”或“哲学感”，完美呼应主题并实现情感/认知升华。\n- [ ] 主体在画面上 1/3，底部有足够深色安全区供字幕叠加\n- [ ] 图片情绪与该幕的「情绪档位」匹配（档位 3 的图不能是平静场景）\n- [ ] 全片光影/色调风格一致\n- [ ] 无明显 AI 瑕疵（多余手指、文字乱码、比例失调等）\n\n---\n\n## 0.6 生产模式决策（内容定型后执行）\n\nFableForge 支持两种生产模式。**在用户确认内容方向后、动手写剧本之前**，必须先确定生产模式。\n\n### 两种模式概览\n\n| 维度 | 模式 A：纯图片 | 模式 B：视频 + 文字叠加 |\n|------|-------------|----------------------|\n| **适用题材** | 寓言故事、有角色弧线的隐喻 | 职场分析、管理洞察、观点输出 |\n| **画幅** | 16:9 横屏（1920×1080） | 9:16 竖屏（1080×1920） |\n| **视觉素材** | AI 生成的场景图片 | Pexels/Pixabay 免费 B-roll 视频 |\n| **文字呈现** | 底部字幕条 | 全屏文字叠加排版（暗化遮罩 + 大字） |\n| **叙事结构** | 角色驱动的故事弧线 | 论点驱动的拆解/金句输出 |\n| **产出节奏** | 较慢（等图片生成 + 风格校准） | 较慢（等图片生成 + 风格校准） |\n\n### 快速决策表\n\n| 判断条件 | 选择 |\n|---------|------|\n| 有具体角色名字和对话（僧人、狼王、船夫……） | 模式 A |\n| 叙事主语是「我」「你」「我们」「很多公司」 | 模式 B |\n| 需要展示隐喻（灯 → 认知、桥 → 管理） | 模式 A |\n| 需要展示数据对比（3 → 13）、金句输出 | 模式 B |\n| 用户明确说\"拍成视频\" / \"竖版\" / \"短视频\" | 模式 B |\n| 用户明确说\"写个寓言\" / \"讲个故事\" | 模式 A |\n\n> ⚠️ 用户可在停机确认时手动覆盖 AI 的模式推荐。模式确定后写入 `视频脚本.md` 头部的「内容定档」章节。\n\n### 模式选定后的流程分叉\n\n- **模式 A**：走 §1.5A（图片素材生成）→ §3.2（横屏 HTML 模板）→ 正常流程\n- **模式 B**：走 §1.5B（视频 B-roll 采集）→ §3.2B（竖屏 HTML + 文字叠加模板）→ 正常流程\n- 其余阶段（概念、剧本、TTS、BGM、音频解析、动画、渲染、发布）两种模式共享。\n\n---\n\n## 视频生产核心流水线 (Stages)\n\n为确保 AI 执行各阶段时的高精准度与低上下文占用，制片厂流水线已全面重构为模块化架构。**当您执行某一个特定阶段时，请直接调阅并遵循该阶段对应的子 SOP 指南**：\n\n### 🛠️ [Stage 0: 自动化环境部署 (Scaffolding)](file://./resources/stages/stage_0_env.md)\n*   **用途**：首次运行或初始化项目环境时执行。\n*   **动作**：部署模板、检测并下载静态 `ffmpeg` / `ffprobe` 环境、构建 VoxCPM2 隔离 Python 环境。\n*   **核心指南**：[阅读 Stage 0 SOP](file://./resources/stages/stage_0_env.md)\n\n### ✍️ [Stage 1：概念、剧本与物料生成](file://./resources/stages/stage_1_creatives.md)\n*   **用途**：创意策划与声画素材（文字海报、B-roll、配音与BGM）准备。\n*   **动作**：根据 Genre 生成大纲并在停机确认后进行内容定档与剧本拆解，运行声纹克隆脚本，使用图片 API 或自动化下载裁剪 B-roll，并强制生成纯文字封面/封底海报。\n*   **核心指南**：[阅读 Stage 1 SOP](file://./resources/stages/stage_1_creatives.md)\n\n### ⏱️ [Stage 2：音频解析与数据驱动时间轴](file://./resources/stages/stage_2_timeline.md)\n*   **用途**：解析配音，进行像素级音视频时间戳对齐。\n*   **动作**：通过 `ffprobe` 获取音频绝对时长，使用 Whisper (A方案) / RMS 能量分析 (B方案) 获得精确断句，映射生成 `data-start` 时间轴。\n*   **核心指南**：[阅读 Stage 2 SOP](file://./resources/stages/stage_2_timeline.md)\n\n### 📐 [Stage 3：静态排版构建与验收](file://./resources/stages/stage_3_static.md)\n*   **用途**：横版/竖屏 HTML 与 CSS 样式搭建。\n*   **动作**：搭建 `#composition` DOM 骨架。模式 B 下严格执行视频标签扁平化，配置组件库（`.headline`, `.neq` 等），确保静态显示 100% 正确并通运 `lint` 校验。\n*   **核心指南**：[阅读 Stage 3 SOP](file://./resources/stages/stage_3_static.md)\n\n### 🎬 [Stage 4：动画集成与预检发版](file://./resources/stages/stage_4_animation.md)\n*   **用途**：GSAP 动画渲染与 MP4 导出。\n*   **动作**：集成 Ken Burns 等情绪转场动画，运行 `inspect` 实施最终质量门禁，使用 `render` 导出 MP4 视频。\n*   **核心指南**：[阅读 Stage 4 SOP](file://./resources/stages/stage_4_animation.md)\n\n### 📦 [Stage 5：发布与归档](file://./resources/stages/stage_5_publish.md)\n*   **用途**：补充宣发策划，作品归档。\n*   **动作**：自动补充脚本元数据，**强制追加小红书爆款宣发案**（标题、大字封面文案及 Emoji 社交文案），更新 README 并在本地进行 Git 提交。\n*   **核心指南**：[阅读 Stage 5 SOP](file://./resources/stages/stage_5_publish.md)\n\n---\n\n## 附录：核心指南与排坑规范\n\n为了保持核心 SOP 的精炼度，以下核心手册与技术参考已存为独立的资源文件，Agent 在执行时可按需读取：\n\n- **🎨 视觉风格参考手册**：提供详细风格词典、提示词公式及文化锚点，请查阅 [视觉风格参考手册](file://./resources/style_bible.md)。\n- **🐛 技术陷阱与排坑规范**：汇总图片裁切、视频冻结、音轨对齐等已知 Bug 解决方案，请查阅 [技术排坑手册](file://./resources/troubleshooting.md)。\n\n### 附录 C：项目归档规范结构\n\n**模式 A（纯图片叙事视频）：**\n```text\n/YYYYMMDD/\n  ├── index.html          (核心时间轴，Stage 3/4 产物)\n  ├── assets/\n  │   ├── scene_cover.png (封面图，纯文字海报)\n  │   ├── scene1.png ~ sceneN.png\n  │   ├── scene_end.png   (结尾图，纯文字海报)\n  │   ├── narration.wav   (TTS 配音)\n  │   ├── bgm.mp3         (背景配乐，Stage 1.7 产物)\n  │   └── transcript.json (Whisper 时间戳，Stage 2.2 产物)\n  ├── 视频脚本.md          (剧本，Stage 1.2 产物)\n  └── promo_video.mp4     (最终成品，Stage 4.3 产物，Git 豁免名单)\n```\n\n**模式 B（视频 B-roll + 文字叠加）：**\n```text\n/YYYYMMDD_{project_name}/\n  ├── index.html               (核心时间轴，竖屏 1080×1920)\n  ├── style.css                (独立样式表，文字叠加组件库)\n  ├── download_and_process.py   (B-roll 自动化下载/裁剪脚本)\n  ├── assets/\n  │   ├── scene1.mp4 ~ sceneN.mp4  (裁剪后的 B-roll 视频，1080×1920，无音轨)\n  │   ├── narration.wav            (TTS 配音)\n  │   └── bgm.mp3                  (背景音乐)\n  ├── 视频脚本.md                   (剧本 + B-roll 素材规划表)\n  └── renders/\n      └── {project}_YYYY-MM-DD_HH-MM-SS.mp4  (渲染成品)\n```\n\nFile v1.2.0:resources/voice-model/README.md\n\n# 声音样本录制指南\n\n## 为什么需要录制声音样本？\n\n本项目使用 **VoxCPM2** 声纹克隆模型。它的工作原理是：\n1. 你提供一段 **15 秒**的自己的声音\n2. 模型学习你的**音色、语调、情感特征**\n3. 之后，模型就能用**你的声音**朗读任何文字\n\n效果就像你亲自配音，但实际上是 AI 在模拟你。\n\n---\n\n## 录音要求\n\n| 项目 | 标准 |\n|------|------|\n| 时长 | **15 秒**（过短效果差，过长会截断） |\n| 格式 | WAV（不要 MP3，会丢失音质） |\n| 采样率 | 44100 Hz 或以上 |\n| 语速 | 正常语速，不要刻意放慢 |\n| 内容 | 朗读下方指定文本（必须与 `PROMPT_TEXT` 一致） |\n\n---\n\n## 推荐朗读文本\n\n将下方文字复制到 `generate.py` 的 `PROMPT_TEXT` 参数，并**朗读同样的内容**：\n\n```\n大家好，我在录制自己的声音样本。这段录音将作为我的声纹模板，\n帮助 AI 精确还原我的音色和情感。现在是[你的名字]，感谢收听。\n```\n\n你也可以自定义这段文字，但要确保录音内容和 `PROMPT_TEXT` **完全一致**。\n\n---\n\n## 录音步骤（Mac）\n\n### 方法 A：使用 QuickTime（最简单）\n\n1. 打开 QuickTime Player\n2. 菜单栏 → 文件 → 新建音频录制\n3. 点击录制按钮，朗读文本，停止\n4. 导出 → 音频 → 保存为 WAV\n\n### 方法 B：使用 Audacity（质量更好）\n\n```bash\n# 安装 Audacity\nbrew install --cask audacity\n```\n\n1. 选择麦克风（推荐有线耳机）\n2. 点击录制，朗读文本\n3. 导出为 WAV，采样率 44100\n\n---\n\n## 保存路径\n\n录音完成后，将文件保存为：\n```\nvoice-model/01_samples/my_voice.wav\n```\n\n> ⚠️ **隐私提示**：此文件包含你的声纹信息，`.gitignore` 已自动排除 `01_samples/` 目录，不会被提交到 GitHub。\n\n---\n\n## 录音质量检验\n\n一个好的声音样本应该：\n- [ ] 没有明显的背景噪音（空调声、键盘声等）\n- [ ] 没有爆音（P、B 音爆声）\n- [ ] 没有回声（不要在浴室或空旷房间录制）\n- [ ] 语速自然，情感投入（不要像机器人一样朗读）\n\n---\n\n下一步：参考 [README.md 阶段一第 4 步](../README.md#阶段一录制你的声音首次必做一劳永逸) 运行 `generate.py` 测试效果。\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn70kae1g9r73x5v5vn83saj7h86yevd\",\n  \"slug\": \"fableforge\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1779419048772\n}\n\nFile v1.2.0:resources/stages/stage_0_env.md\n\n# Stage 0: 自动化环境部署 (Scaffolding)\n\n当用户在一个空文件夹中首次要求“初始化项目”或“初始化 FableForge”时，**必须且仅需执行一次**本阶段。如果你发现当前目录已经有了 `template/` 和 `bin/`，则说明已初始化过，请直接跳过。\n\n**0.1 复制模板与模型资源**\nFableForge 的项目模板与语音模型代码已打包在 Skill 目录中。请执行以下命令：\n\n```bash\n# 复制 HTML 模板与脚本模板\ncp -r .agents/skills/fableforge/resources/template ./template\n\n# 复制语音模型脚手架\ncp -r .agents/skills/fableforge/resources/voice-model ./voice-model\n```\n\n**0.2 自动下载 FFmpeg 环境**\n本流水线强烈依赖 `ffmpeg` 与 `ffprobe`。请自动为用户下载静态构建版：\n\n```bash\ncurl -L https://evermeet.cx/ffmpeg/get/zip -o ffmpeg.zip && unzip -o ffmpeg.zip\ncurl -L https://evermeet.cx/ffmpeg/get/ffprobe/zip -o ffprobe.zip && unzip -o ffprobe.zip\nmkdir -p bin && mv ffmpeg bin/ && mv ffprobe bin/ && chmod +x bin/*\nrm ffmpeg.zip ffprobe.zip\n```\n\n**0.3 自动配置 VoxCPM2 Python 环境**\n执行以下命令为用户的语音克隆模型创建隔离环境并安装依赖：\n\n```bash\npython3 -m venv voice-model/venv\nsource voice-model/venv/bin/activate\npip install voxcpm soundfile torch numpy\n```\n\n**0.4 引导用户录制声纹样本**\n执行完毕后，请暂停并提示用户：\n> \"FableForge 环境已初始化完毕！请您用手机或电脑录制一段 15 秒的声音（朗读任意文本），将其导出为 `.wav` 格式，并放置在 `voice-model/01_samples/my_voice.wav`。准备好后请告诉我，我们就可以开始做视频了！\"\n\n**✅ Stage 0 退出标准：**\n- [ ] 当前工作区包含 `template/`、`voice-model/` 和 `bin/` 目录。\n- [ ] 用户确认已准备好声纹样本。\n\nFile v1.2.0:resources/stages/stage_1_creatives.md\n\n# Stage 1：概念、剧本与物料生成\n\n### 1.1 概念与大纲生成（须停机等待用户确认）\n\n根据确定的体裁 (Genre)，使用对应的提示词框架生成内容大纲：\n\n**对于 Genre X (叙事类)：**\n> \"请你从[指定领域]里，选择一个深度的概念。然后写一个寓言/历史故事，用间接的方式把这个概念讲清楚。不要一开始就说答案，到故事快结束时反转。最后解释概念及隐喻。\"\n\n**对于 Genre Y (分析类)：**\n> \"请你从[指定领域]里，挖掘一个反直觉的痛点现象。先描绘这个现象，然后拆解背后的核心矛盾/系统性崩溃原因，最后给出具有实操性的商业洞察或管理金句。\"\n\n**对于 Genre Z (宣发类)：**\n> \"请根据[产品/功能描述]，提取最核心的用户痛点和利益点，以短视频节奏输出一段极具转化率的宣发文案框架（痛点直击 -> 价值展示 -> CTA）。\"\n\n**去重检查**：生成前扫描工作空间内所有 `YYYYMMDD/视频脚本.md`，确保主题不与历史作品重复。\n\n⛔ **此步完成后必须停机，将生成的大纲/故事完整展示给用户，等待明确确认。未经确认严禁继续。**\n\n### 1.2 内容定档（用户确认大纲后立即执行）\n\n在动手写剧本之前，必须先完成内容定档。这是防止「好内容变烂视频」的关键步骤。\n\n**步骤：**\n\n1. **标记不可删减要素**：逐段扫描用户确认的内容大纲，用以下标签标记（见 0.3）：\n   - `[因果/逻辑]` — 逻辑链节点\n   - `[转折/对比]` — 认知翻转或数据对比\n   - `[核心金句]` — 结论闭环\n\n2. **计算最低旁白字数**：将所有标记要素的文本合适，得出「不可压缩下限」。\n\n3. **选档**：根据合计字数，在 §0.1 三档体系中选择对应档位。\n\n4. **输出定档报告**（写入 `视频脚本.md` 头部）：\n   ```markdown\n   ## 内容定档\n   - **原始内容字数**：{X} 字\n   - **不可删减要素字数**：{Y} 字\n   - **选定档位**：{S/M/L}\n   - **预估旁白总字数**：{Z} 字\n   - **预估视频时长**：{Z ÷ 3.5} 秒\n   ```\n\n⛔ **如果不可删减要素字数 > 450（S 档上限），严禁使用 S 档强行压缩。必须升档。**\n\n### 1.3 剧本转化\n\n将内容按选定档位的规格拆解为分镜剧本，写入 `YYYYMMDD/视频脚本.md`。\n\n**内容完整性自检（剧本写完后必须执行，全部通过才能进入下一步）：**\n\n- [ ] **盲测**：让一个没读过原文的人只看剧本旁白，能否独立理解核心价值（故事结局/分析结论）？如果不能，说明删多了。\n- [ ] **因果/逻辑链完整**：每个「结论」都有对应的「事件/数据」作为铺垫，没有凭空冒出的道理。\n- [ ] **Genre X 专属**：角色有动作有对话，不能只靠旁白概括。\n- [ ] **Genre Y 专属**：痛点现象的铺垫是否足以推导出最终的解决方案和金句？\n\n剧本格式模板：\n```markdown\n## 分镜 scene_cover — 封面/标题幕\n- **情绪档位**：1\n- **旁白**：{通常为视频标题或引导句}\n- **画面描述**：{高吸引力、悬念感强的提示词}\n\n## 分镜 {N} — {幕名}\n- **时间（草稿估算）**：第 {X} ～ {Y} 秒\n- **情绪档位**：{1/2/3/4}\n- **旁白**：{中文30~80字}\n- **画面描述**：{图片提示词，中英文均可}\n\n## 分镜 scene_end — 结尾/升华幕\n- **情绪档位**：4\n- **旁白**：{点题金句，不超过 20 字}\n- **画面描述**：{意境深远、呼应主题的提示词}\n```\n\n### 1.4 TTS 语音生成\n\n**声纹选择（优先意识）：**\n- **默认原则**：优先检查 `/语音模型/voxenv` 环境。若存在，**必须**使用用户的声纹克隆生成旁白。\n- **降级方案**：仅在用户明确要求或克隆环境不可用时，才使用 Kokoro 等通用模型。\n\n**语音节奏优化：**\n\nVoxCPM2 的情绪输出相对平稳，需要在文本层面手动注入戏剧感。处理规则：\n\n- 在核心关键词前插入 `……`，让模型自动降速放重音\n- 超过 130 字的段落用 `|||` 在语气转折处手动分段\n- 档位 4（沉默留白幕）的旁白每个词组之间都加 `……`\n\n```\n❌ 平铺直叙：\n\"你以为选出了战将，其实你只选出了最擅长残杀队友的屠夫。\"\n\n✅ 有停顿感的版本：\n\"你以为……选出了战将。|||其实，你只筛选出了——最擅长残杀队友的……屠夫。\"\n```\n\n在项目目录下执行：\n\n```bash\n# 使用本地 VoxCPM2 模型生成语音（必须使用虚拟环境的 Python）\n# 1. 复制并编辑生成脚本（每个项目独立一份）\ncp /Users/lucas/Work/09.Antigravity/语音模型/generate_cantillon.py \\\n   /Users/lucas/Work/09.Antigravity/语音模型/generate_{project_name}.py\n# 2. 编辑 TARGET_TEXT、OUTPUT_FILE 等变量\n# 3. 运行\n/Users/lucas/Work/09.Antigravity/语音模型/voxenv/bin/python3 \\\n  /Users/lucas/Work/09.Antigravity/语音模型/generate_{project_name}.py\n```\n\n### 1.5A 图片素材生成（模式 A）\n\n> ℹ️ 仅模式 A（纯图片）执行此步。模式 B 跳转至 §1.5B。\n\n按剧本中每幕的\"画面描述\"逐一生成图片，命名严格遵循 `scene1.png`、`scene2.png` ... `scene{N}.png`，保存至 `YYYYMMDD/assets/`。\n\n**批量生成策略（应对 API 配额限流）：**\n\n图片生成 API 通常有速率限制（如每窗口期 5 张）。为避免流程阻塞，采用以下策略：\n\n1. **先批量准备提示词**：在生成前，将全部场景的提示词按风格圣经公式组装完毕，写入剧本。\n2. **分批生成 + 穿插其他工作**：每批生成到限流后，立即切换到其他 Stage 的工作（如音频分析、HTML 搭建），不要干等。\n3. **生成即归档**：每张图生成后立即 `cp` 到 `assets/` 目录并验证文件名，避免最后批量操作时遗漏。\n4. **断点续传**：用 `ls assets/scene*.png | wc -l` 检查进度，只生成缺失的图片。\n\n### 1.5B 视频 B-roll 素材采集与裁剪（模式 B）\n\n> ℹ️ 仅模式 B（视频 + 文字叠加）执行此步。模式 A 跳转至 §1.5A。\n\n**步骤 1 — B-roll 关键词策划：**\n\n根据每幕的情绪和主题，在 `视频脚本.md` 中列出搜索关键词：\n```markdown\n## B-roll 素材规划\n| 幕 | 情绪 | 搜索关键词 | 画幅偏好 |\n|----|------|-----------|---------|\n| scene1 | 压迫/悬疑 | dark office, laptop screen | 竖屏优先 |\n| scene2 | 忙碌/混乱 | meeting room, people talking | 竖屏优先 |\n| scene7 | 升华/开阔 | city night, aerial view | 横屏可接受 |\n```\n\n**步骤 2 — 素材探测（浏览器手动或自动）：**\n\n在 Pexels (https://pexels.com/search/videos/) 搜索关键词，获取视频直链。优先选择：\n- 竖屏 9:16（`_1080_1920_` 或 `_1440_2560_`）\n- 时长 ≥ 10 秒（裁剪后留 ≤ 20 秒）\n- 无水印、免版税\n\n**步骤 3 — 编写自动化下载脚本 `download_and_process.py`：**\n\n脚本必须包含以下能力（仅参考下方代码模板的结构，⛔ 严禁复制旧集的 URL 或文件路径，每集的 URL 必须根据本集剧本主题全新搜索获取）：\n\n```python\nVIDEO_MAP = {\n    \"scene1.mp4\": {\"url\": \"https://videos.pexels.com/...\", \"is_vertical\": True},\n    \"scene2.mp4\": {\"url\": \"https://videos.pexels.com/...\", \"is_vertical\": False},\n    # ...\n}\n```\n\n**下载容错规范：**\n- `curl -L -k --retry 5 --retry-delay 3 -H \"User-Agent: Mozilla/5.0 ...\"` — Pexels CDN 需要浏览器 UA，且 SSL 连接不稳定\n- 若 curl 返回非零但文件通过 `ffprobe` 校验 → 视为下载成功（Cloudflare 常在传输末尾断开连接）\n- 已存在的有效视频自动跳过（断点续传）\n\n**FFmpeg 竖屏裁剪规范：**\n\n| 原片画幅 | FFmpeg filter | 说明 |\n|---------|--------------|------|\n| 9:16 竖屏 | `scale=1080:1920` | 直接缩放 |\n| 16:9 横屏 | `crop=ih*9/16:ih,scale=1080:1920` | 居中裁剪后缩放 |\n\n所有视频统一参数：`-stream_loop 2 -t 30 -c:v libx264 -crf 18 -an -y`（循环拼接后限时长 30s，去音轨。确保素材时长覆盖该幕的完整 `data-duration`，避免播完后黑屏）\n\n**步骤 4 — 运行脚本：**\n```bash\nexport PATH=./bin:$PATH\npython3 download_and_process.py\n```\n\n### 1.6 纯文字海报生成（封面 scene_cover 与 封底 scene_end）\n\n> ℹ️ 无论处于模式 A（纯图片）还是模式 B（视频B-roll），所有视频都必须具备静态的海报级封面与封底。如果你有 `image_generate` 或类似生图工具的权限，请带上 `aspect_ratio=\"portrait\"` 等参数调用；否则，请输出 Prompt 引导用户在其他平台生成。\n\n**通用设计铁律：所有封面与封底必须是纯文字排版，绝不配图、无图标、无装饰。**\n- **满屏大标题** — 文字撑满整张画面，不留大片空白。\n- **错落有致** — 多行错位、大小穿插，制造视觉节奏感。\n- **留白呼吸** — 文字之间有空隙，不拥挤。\n- **落款署名** — 严禁硬编码他人名字。生成前，**必须通过对话询问用户**：“请问您的海报落款署名要写什么？”；如果用户不便回答，使用通用占位符如 `—— [主理人]`。\n\n**Style Slots (配色/字体风格矩阵)：**\n根据视频话题，自动选择以下 10 套体系之一。详细说明请查阅 [视觉风格参考手册](file://./resources/style_bible.md)。\n\n**Prompt 构建公式：**\n`[Vertical portrait poster, ONLY Chinese typography filling the entire frame. No images...]` + `[配色/字体风格描述]` + `[标题与落款排版]`\n\n*示例 Prompt (科技增长蓝封面)：*\n`Vertical portrait poster, ONLY Chinese typography filling the entire frame. No images, no illustrations, no icons, no decorations. Pure text only. Modern tech aesthetic: deep blue gradient background, white and cyan (#00D7FF) characters. Clean, bold display font. Staggered layout with varying character sizes. Title \"企业做AI千万不要一上来就全员铺工具\" arranged in 3-4 lines with oversized and medium contrast. \"—— [用户指定的IP名]\" as small signature at bottom. High-impact, minimal.`\n\n*封底 (End Card) 格式：*\n排版内容固定为：\"👍 点赞 ⭐ 收藏 \\n 🔔 加关注 \\n\\n 我们下期见！ \\n —— [用户指定的IP名]\"，配色必须与封面保持一致。\n\n生成后，严格命名为 `scene_cover.png` 和 `scene_end.png` 保存至 `assets/` 目录。\n\n**✅ Stage 1（素材）退出标准：**\n\n模式 A：\n- [ ] `assets/` 下场景图片数量 == 剧本分镜数\n- [ ] 场景图片命名符合规范（scene1~N.png）\n\n模式 B：\n- [ ] `assets/` 下每幕对应的 `.mp4` 文件已就位且通过 `ffprobe` 校验\n- [ ] 所有视频为 1080×1920 竖屏、无音轨、时长 ≤ 30s\n- [ ] ⛔ **新鲜度校验**：`download_and_process.py` 中的所有 URL 必须是根据本集剧本主题全新搜索获取的。验证方法：对比 `VIDEO_MAP` 中的 URL 与历史集的 `download_and_process.py`，不得有任何重复 URL。\n\n通用（模式 A 与 B 都必须满足）：\n- [ ] `assets/narration.wav` 已生成且通过 `ffprobe` 校验。\n- [ ] 封面/封底已就位：\n  - 模式 A：`scene_cover.png` 与 `scene_end.png` 已生成。\n  - 模式 B：`index.html` 中包含 `#scene_cover` 和 `#scene_end` 的 DOM 结构（参见 Stage 3 §3.2B 模板），且 GSAP 动画已绑定。\n\n### 1.7 BGM 背景音乐匹配\n\nBGM 是情绪的推手，必须在 Stage 2 之前完成匹配。\n\n**BGM 匹配工作流：**\n1. **情绪识别**：分析剧本中各幕的「情绪档位」，提取核心关键词（如：Suspense, Epic, Minimalist, Melancholic）。\n2. **曲库搜索**：从免版税音乐库（如 Scott Buckley, Pixabay, Bensound）搜索并下载 1 首全局背景音。\n3. **参数配置**：\n   - `data-track-index`: 设为 `-1`（始终位于底层）。\n   - `data-volume`: 默认设为 `0.15` ～ `0.25`（通过 preview 实时调整，严禁盖过旁白）。\n4. **集成到 index.html**：\n   ```html\n   <audio id=\"bgm\" src=\"assets/bgm.mp3\" data-start=\"0\" data-duration=\"{视频总长}\" data-track-index=\"-1\" data-volume=\"0.25\"></audio>\n   ```\n\n**✅ Stage 1.7 退出标准：**\n- [ ] `assets/bgm.mp3` 已就位且通过 `ffprobe` 校验。\n- [ ] ⛔ **BGM 新鲜度校验**：BGM 文件必须是根据本集剧本情绪主题全新搜索并下载的，严禁复用旧集 `bgm.mp3`。\n- [ ] `视频脚本.md` 已补充本集 BGM 署名信息（含作者、曲名、来源链接及 CC 协议）。\n\nFile v1.2.0:resources/stages/stage_2_timeline.md\n\n# Stage 2：音频解析与数据驱动时间轴\n\n### 2.1 获取音频精确时长\n\n```bash\nexport PATH=./bin:$PATH\nffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1 YYYYMMDD/assets/narration.wav\n# 记录输出的 duration=XX.XXXXXX，这是视频总时长的唯一权威数据\n```\n\n### 2.2 获取精确断句时间戳（三级方案，按精度递减选择）\n\n**方案 A — Whisper 词级转录（精度最高，优先推荐）：**\n```bash\nnpx hyperframes transcribe YYYYMMDD/assets/narration.wav\n# 生成 YYYYMMDD/assets/transcript.json，包含词级时间戳\n# 直接按句末时间戳切分场景，误差 < 0.1s\n```\n\n**方案 B — VAD 全局物理声学平铺匹配算法 (Globally Optimized Acoustic VAD-Tiling)（Whisper 不可用时）：**\n```python\n# 1. 读取音频数据提取 RMS 帧能量，自适应推算噪声基底作为能量阈值：\n#    threshold = max(noise_floor + 0.002, max_energy * 0.015)\n# 2. 通过滑动窗口锁定持续说话区间，过滤短微瞬时噪音（如静音阈值 >= 0.35s）：\n#    speech_segments = [(start_t, end_t), ...]\n# 3. 计算台词总字数与总活跃发音时长比率，求得发音平均时间单位。\n# 4. 根据每句台词字数比重，映射到 VAD 活跃区间内计算对应的物理绝对起止时间戳：\n#    s_t = active_t_to_physical_t(start_active_t)\n#    e_t = active_t_to_physical_t(end_active_t)\n# 5. 生成高精度的 transcript.json，该算法产出的语速极其均匀自然。\n```\n\n> ⚠️ 更多技术细节及排坑规范，请查阅 [技术排坑手册](file://./resources/troubleshooting.md)。\n\n**方案 C — 纯字数比例分配（兜底方案）：**\n```python\n# 当 RMS 分析不可靠时（如 TTS crossfade 过重），直接按字数分配\n# 误差 ±2s，对 10s+ 的场景可接受\nfor scene in scenes:\n    scene.duration = scene.char_count / total_chars * total_audio_duration\n```\n\n### 2.3 将时间戳映射到分镜\n\n根据 2.2 的输出，将每幕的 `data-start` 和 `data-duration` 精确填入 HTML 的标签属性或生成为 JS 数组，并遵循以下时序安全红线：\n\n> [!IMPORTANT]\n> **时序映射安全红线（防首幕死静、浮点重叠与语速突变）：**\n> 1. **首幕死静防范**：音频全局偏移 `global_offset` 必须保持在极短气口（如 `0.20s`），让旁白与背景音乐从 0.2s 即可响起，杜绝因粗暴设置长达数秒的全局偏移导致视频开头死静。封面幕（`scene_cover`）的时长禁止硬编码，必须自适应获取前几句封面台词结束点 `transcript[n][\"end\"]` 作为其真实持续时间。\n> 2. **浮点数重叠避让**：由于 JavaScript/Python 浮点数相加精度溢出（例如 `38.58 + 3.32 = 41.900000000000006`），极易导致 HyperFrames 编译器报错 `overlapping_clips_same_track`。因此，在计算各个分镜的 `data-duration` 时，必须**主动减少 0.01 秒安全气口**进行微调避让（例如 `duration = round(end - start, 2) - 0.01`），以完全规避浮点重叠。\n> 3. **语速健康度自动审计 (Health Check Gatekeeper)**：时间轴生成后，必须自动审计每句话的自适应物理语速：$\\text{语速} = \\text{字符数} \\div \\text{持续时间(秒)}$。健康的口播语速应严格落在 **3.2 ~ 5.5 字/s** 舒适区间。若单句语速 $\\le 1.5$ 字/s（过慢）或 $\\ge 6.5$ 字/s（急促），必须拦截物理压制并重新平铺，杜绝脱节。\n\n```js\n// 由音频数据派生，结合 0.01s 浮点避让、0.2s 气口与语速审计，禁止手动估算\nconst scenes = [\n  { id: \"scene_cover\", start: 0,    duration: 7.31,  subtitle: \"封面旁白...\" }, // (7.32 - 0.01)\n  { id: \"scene1\",      start: 7.32, duration: 17.50, subtitle: \"旁白文本...\" }, // (24.83 - 7.32 - 0.01)\n  // ...\n];\n```\n\n**✅ Stage 2 退出标准：**\n- [ ] Whisper `transcript.json` 已生成，或 VAD 物理声学平铺匹配已完成，或纯字数比例已计算\n- [ ] **已通过语速健康度审计**：每一句口播的字符语速严格处于 **3.2 ~ 5.5 字/s** 区间内，绝无大段错位\n- [ ] 所有分镜的 `start + duration` 之和与音频总时长误差 < 0.5 秒\n- [ ] 标注所使用的方案等级（A/B/C），方便后续迭代时升级\n\nFile v1.2.0:resources/stages/stage_3_static.md\n\n# Stage 3：静态排版构建与验收\n\n### 3.1 创建项目目录\n\n```bash\nmkdir -p YYYYMMDD/assets\n# 初始化 index.html（手动创建，参考下方 HTML 模板）\n```\n\n### 3.2 HTML 基础模板 — 模式 A（强制规范）\n\n> ℹ️ 以下为模式 A（纯图片）的 HTML/CSS 规范。模式 B 请跳转至 §3.2B。\n> 完整参考实现见 `template/index.html` 和 `template/style.css`。以下仅列出关键约束。\n\n**根容器必须包含 4 个 data-* 属性（缺一不可）：**\n```html\n<div id=\"composition\"\n     data-composition-id=\"composition\"\n     data-width=\"1920\"\n     data-height=\"1080\"\n     data-duration=\"{Stage 2.1 获取的音频总时长}\">\n```\n\n**场景 DOM 结构（由 JS 动态生成，严禁硬编码）：**\n```\nscene.clip\n  ├─ img.bg-fill    ← 背景模糊层（object-fit: cover + blur）\n  ├─ img.fg-main    ← 主体图片层\n  └─ div.overlay\n       └─ div.subtitle  ← 字幕（通过 textContent 写入）\n```\n\n**GSAP 铁律：**\n```js\nconst tl = gsap.timeline({ paused: true }); // 永远 paused: true\nwindow.__timelines = window.__timelines || {};\nwindow.__timelines[\"composition\"] = tl; // key 必须与 data-composition-id 一致\n```\n\n**图片引用规范：**\n- 使用 `assets/${id}.png`（如 `assets/scene1.png`），与 scene 数据的 id 字段一致\n\n### 3.3 CSS 布局规范 — 模式 A（强制）\n\n> ℹ️ 完整实现见 `template/style.css`。以下仅列出核心规则。\n\n**`object-fit` 决策树（根据图片画幅选择）：**\n\n| 图片画幅 | fg-main | bg-fill | 效果 |\n|---------|---------|---------|------|\n| 16:9 横版（推荐） | `object-fit: cover` | 不需要 | 完美填充，无黑边 |\n| 非标画幅（正方形等） | `object-fit: contain` | 需要（blur + cover） | 毛玻璃背景填充黑边 |\n\n```css\n/* 背景模糊层（非 16:9 素材时使用） */\n.bg-fill {\n  position: absolute; inset: 0;\n  object-fit: cover;\n  filter: blur(20px) brightness(0.4);\n  transform: scale(1.1); /* 补偿 blur 边缘虚化 */\n}\n\n/* 主体图片层：严禁使用 translate 居中 */\n.fg-main {\n  position: absolute; inset: 0;\n  object-fit: contain; /* 或 cover，见上方决策树 */\n  transform-origin: center center;\n}\n```\n\n### 3.2B HTML 基础模板 — 模式 B（视频 + 文字叠加）\n\n> ℹ️ 以下为模式 B 的 HTML/CSS 规范。仅参考下方模板的 DOM 结构，⛔ 严禁从旧集复制 HTML 文件。\n\n**根容器（竖屏画幅）：**\n```html\n<div id=\"composition\"\n     data-composition-id=\"composition\"\n     data-width=\"1080\"\n     data-height=\"1920\"\n     data-start=\"0\"\n     data-duration=\"{音频总长}\">\n```\n\n**⚠️ 视频标签扁平化铁律（最重要的规则）：**\n\n`<video>` 标签**必须**是 `#composition` 的**直接子元素**。严禁将 `<video data-start=\"...\">` 嵌套在任何带有 `data-start` 的 `<div>` 内部，否则 HyperFrames 渲染器无法管理视频播放，**视频将冻结在第一帧**。\n\n```html\n<!-- ✅ 正确：视频作为舞台的扁平直接子元素 -->\n<video id=\"v-scene1\" class=\"clip bg-video\" src=\"assets/scene1.mp4\" muted playsinline\n       data-start=\"0\" data-duration=\"8\" data-track-index=\"3\"></video>\n<video id=\"v-scene2\" class=\"clip bg-video\" src=\"assets/scene2.mp4\" muted playsinline\n       data-start=\"8\" data-duration=\"10\" data-track-index=\"3\"></video>\n\n<!-- 文字叠加层：独立的场景 div，不含 <video> -->\n<div id=\"scene1\" class=\"clip\"\n     data-start=\"0\" data-duration=\"8\" data-track-index=\"1\"\n     style=\"z-index: 1;\">\n  <div class=\"dim-overlay\"></div>\n  <div class=\"bottom-gradient\"></div>\n  <div class=\"text-layer text-layer--bottom\">\n    <div id=\"s1-line1\" class=\"body-text\">旁白文本</div>\n    <div id=\"s1-line2\" class=\"headline\">冲击<span class=\"accent\">金句</span>。</div>\n  </div>\n</div>\n```\n\n```html\n<!-- ❌ 错误：视频嵌套在带 data-start 的 div 内 → 渲染冻结 -->\n<div id=\"scene1\" class=\"clip\" data-start=\"0\" data-duration=\"8\">\n  <video class=\"bg-video\" src=\"assets/scene1.mp4\" data-start=\"0\" ...></video>\n</div>\n```\n\n**视频标签必备属性清单：**\n\n| 属性 | 说明 |\n|------|------|\n| `id` | 唯一标识，如 `v-scene1`（缺少则渲染冻结） |\n| `class=\"clip bg-video\"` | `clip` 让框架管理可见性，`bg-video` 应用视频样式 |\n| `muted playsinline` | HyperFrames 接管播放，严禁加 `autoplay` 或 `loop` |\n| `data-start` | 视频在时间轴上的起始秒数 |\n| `data-duration` | 视频播放时长 |\n| `data-track-index` | 设为 `3`（与音频轨 0、场景轨 1/2 错开） |\n\n**全局装饰层（模式 B 推荐）：**\n```html\n<div class=\"vignette\"></div>      <!-- 暗角 -->\n<div class=\"noise-overlay\"></div>  <!-- 胶片噪点 -->\n```\n\n### 3.3B CSS 规范 — 模式 B（文字叠加排版）\n\n**核心 CSS 铁律：**\n```css\n.bg-video {\n  position: absolute; inset: 0;\n  width: 100%; height: 100%;\n  object-fit: cover;\n  opacity: 1; /* 👈 必须！覆盖 .clip 的默认 opacity: 0 */\n}\n\n.dim-overlay {\n  position: absolute; inset: 0;\n  background: rgba(0, 0, 0, 0.55); /* 确保文字可读 */\n}\n\n.bottom-gradient {\n  position: absolute; bottom: 0; left: 0; right: 0;\n  height: 600px;\n  background: linear-gradient(to top, rgba(10,10,10,0.95) 0%, transparent 100%);\n  z-index: 1;\n}\n```\n\n**文字叠加组件库：**\n\n| 组件 | CSS 类 | 用途 |\n|------|--------|------|\n| 大标题金句 | `.headline` | 核心冲击句 |\n| 超大数字 | `.headline--huge` | 数据对比 |\n| 正文旁白 | `.body-text` | 常规叙述 |\n| 小字说明 | `.caption-text` | 补充信息 |\n| 强调色 | `.accent` | 关键词高亮 |\n| 不等号卡 | `.neq` + `.text-card` | 「A ≠ B」对比卡片 |\n| 分屏对比 | `.split-compare` | 错误 vs 正确对比 |\n\n**文字定位方式：**\n- `.text-layer--bottom`：底部三分之一（大多数叙述场景）\n- `.text-layer--center`：垂直居中（金句升华、数字冲击）\n\n> [!IMPORTANT]\n> **排版抗拉伸与防溢出折行红线（防长字拉伸与横向溢出）：**\n> 为了通过 `npx hyperframes inspect` 的像素级防溢出排版审计，所有大字报文本元素（`.headline`, `.body-text`, `.caption-text`）在 CSS 编写中必须**无条件遵循抗拉伸规程**：\n> 1. **强制折行属性**：必须声明 `word-wrap: break-word`、`word-break: break-all` 以及 `white-space: normal`。这保证了无论在何种分辨率和极限字符下，文字长句都会自适应安全换行，绝不向两侧拉伸溢出。\n> 2. **最大宽度限制**：配置 `max-width: 100%` 或 `max-width: 90%`（为两侧保留边缘美学边距），防止容器发生无意识拉伸变形。\n\n\n### 3.3B-2 模式 B 的封面与封底 DOM 结构（⛔ 强制）\n\n模式 B 的视频必须包含纯 HTML/CSS 实现的封面标题幕和封底互动幕。不使用 PNG 图片，而是通过大字排版 + GSAP 动效实现。\n\n```html\n<!-- 封面标题幕：必须是第一个场景 -->\n<div id=\"scene_cover\" class=\"clip\"\n     data-start=\"0\" data-duration=\"{6~8秒}\" data-track-index=\"1\"\n     style=\"z-index: 1;\">\n  <div class=\"scene-content\">\n    <div class=\"text-layer text-layer--center\">\n      <div id=\"cover-sub\" class=\"caption-text\">{副标题}</div>\n      <div id=\"cover-title\" class=\"headline\">{主标题}</div>\n      <div id=\"cover-author\" class=\"caption-text\">—— {署名}</div>\n    </div>\n  </div>\n</div>\n\n<!-- 封底互动幕：必须是最后一个场景 -->\n<div id=\"scene_end\" class=\"clip\"\n     data-start=\"{最后一幕结束时间}\" data-duration=\"{8~10秒}\" data-track-index=\"1\"\n     style=\"z-index: 99;\">\n  <div class=\"scene-content\">\n    <div class=\"text-layer text-layer--center\">\n      <div id=\"end-line1\" class=\"headline\">👍 点赞 ⭐ 收藏</div>\n      <div id=\"end-line2\" class=\"headline\">🔔 加关注</div>\n      <div id=\"end-cta\" class=\"caption-text\">我们下期见！—— {署名}</div>\n    </div>\n  </div>\n</div>\n```\n\n### 3.3B-3 模式 B 的逐字同步字幕（⛔ 强制）\n\n模式 B 的视频**必须**在底部包含与配音同步的逐字滚动字幕。实现步骤：\n\n1. **运行 Whisper 转录**（Stage 2）获取 `transcript.json` 或在 Stage 2 中手动构建断句数据。\n2. **在 `index.html` 中创建字幕轨道容器**：\n   ```html\n   <div id=\"subtitles-track\"\n        style=\"position:absolute; bottom:120px; left:0; right:0; height:140px; z-index:100;\">\n   </div>\n   ```\n3. **在 GSAP 脚本中创建字幕控制器**：解析 `transcript.json` 或内联 `CAPTIONS_DATA` 数组，逐字创建 `<span class=\"caption-word\">` 元素并绑定 GSAP 动画（高亮 color/scale 变化）。严禁使用 `className` 动画绑定，必须直接对 CSS 属性进行补间插值。\n4. **物理防遮挡**：字幕轨道必须与画面大字在纵向上完全隔离。大字使用 `padding-bottom >= 300px` 限制最大高度，字幕使用 `bottom: 120px` 固定在底部，确保两者之间有 ≥ 80px 的空白隔离带。\n\n### 3.4 静态验收（加入动画前的检查）\n\n用浏览器打开 `index.html`，截图确认：\n\n模式 A：\n- [ ] 每张图片完整显示，无裁切，无偏移\n- [ ] 图片在 1920×1080 的黑色背景内居中\n\n模式 B：\n- [ ] 视频背景可见（非黑屏），文字叠加清晰可读\n- [ ] `dim-overlay` 暗化效果适当（文字不被视频干扰）\n- [ ] 全屏文字卡（如「A ≠ B」）显示正确\n- [ ] ⛔ 封面标题幕 `#scene_cover` 存在且内容正确\n- [ ] ⛔ 封底互动幕 `#scene_end` 存在且内容正确\n- [ ] ⛔ 字幕轨道 `#subtitles-track` 存在且位于底部，与大字无纵向重叠\n\n**✅ Stage 3 退出标准：**\n- [ ] 纯静态下所有视觉素材（图片或视频）100% 正确显示\n- [ ] `data-composition-id`、`data-width`、`data-height` 已正确设置\n- [ ] 模式 A：字幕通过 `textContent` 注入；模式 B：文字叠加 DOM 结构完整\n- [ ] ⛔ 封面标题幕 `#scene_cover` 已就位（验证：`grep 'scene_cover' index.html` 返回结果）\n- [ ] ⛔ 封底互动幕 `#scene_end` 已就位（验证：`grep 'scene_end' index.html` 返回结果）\n- [ ] ⛔ 逐字字幕轨道 `#subtitles-track` 已就位（验证：`grep 'subtitles-track' index.html` 返回结果）\n- [ ] `npx hyperframes lint .` 报 **0 error(s)**\n\nFile v1.2.0:resources/stages/stage_4_animation.md\n\n# Stage 4：动画集成与预检发版\n\n### 4.1 加入 GSAP 动画\n\n在静态验收通过后，才可加入动效。可用动画菜单：\n\n| 动效 | 代码模板 | 适用场景 |\n|------|---------|--------|\n| Ken Burns 缩放 | `fromTo(img, {scale:1.0}, {scale:1.06, ease:\"none\"})` | 所有场景默认 |\n| Ken Burns 平移 | `fromTo(img, {x:-20}, {x:0, ease:\"none\"})` | 宽场景横向扫描 |\n| 字幕淡入 | `from(sub, {opacity:0, y:20, duration:0.8, ease:\"power2.out\"})` | 所有场景可选 |\n| 场景交叉淡化 | `to(div, {opacity:0, duration:0.5}, start+duration-0.25)` | 场景过渡 |\n| 光晕脉冲 | `to(glow, {opacity:0.4, repeat:-1, yoyo:true, duration:2})` | 火焰/光源场景 |\n\n### 4.1.1 情绪驱动转场匹配\n\n场景之间的转场不应千篇一律。根据**下一幕的情绪档位**选择对应转场：\n\n| 下一幕情绪档位 | 转场方式 | GSAP 代码 | 视觉效果 |\n|-------------|---------|----------|--------|\n| 1（舒缓叙事） | 慢溶解 | `fromTo(next, {opacity:0}, {opacity:1, duration:1.2, ease:\"power1.inOut\"})` | 平静过渡，如水墨晕染 |\n| 2（紧张蓄力） | 标准交叉淡化 | `fromTo(next, {opacity:0}, {opacity:1, duration:0.5, ease:\"none\"})` | 默认节奏 |\n| 3（高潮爆发） | 硬切 + 微缩放 | `tl.set(next, {opacity:1}); fromTo(next, {scale:1.05}, {scale:1.0, duration:0.3})` | 冲击感 |\n| 4（沉默留白） | 淡入黑 → 淡出黑 | `先 to(prev, {opacity:0, duration:0.8}), 延迟 0.5s, 再 fromTo(next, {opacity:0}, {opacity:1, duration:1.0})` | 呼吸感，给观众消化时间 |\n\n### 4.1.2 场景生命周期显隐控制与变量自适应绑定（重大动效架构红线）\n\n为了彻底杜绝多个大场景在时序切换时的 DOM 重合堆叠冲突，必须在 GSAP 动画设计中无条件执行生命周期隐藏控制：\n1. **隐藏状态机规范**：\n   在 `style.css` 中将所有非活动分镜的内部容器（如 `.scene-content`）默认设为 `opacity: 0; visibility: hidden;`。\n2. **GSAP 显隐切换控制**：\n   在 GSAP timeline 编写中，必须在每个分镜场景切入的瞬间通过 `tl.set` 激活，并在退出的瞬间隐藏：\n   ```javascript\n   // 当场景 scene1 激活时开启可见，退出或到下一场景 scene2 时隐藏，防止 DOM 悬空堆叠\n   tl.set(\"#scene1-content\", { visibility: \"visible\" }, SCENE_START.scene1);\n   tl.set(\"#scene1-content\", { visibility: \"hidden\" }, SCENE_START.scene2);\n   ```\n3. **变量化解耦绑定**：\n   禁止在 GSAP timeline 的动效注册中使用任何绝对硬编码的时间戳数值（如 `12.0`）。必须在 JS 头部声明自适应时间变量 `const SCENE_START` 并将所有动效与其绑定偏移（例如 `SCENE_START.scene1 + 2.78`），确保音频时间轴微调时动效自动、平滑地整体平移。\n\n\n### 4.2 强制预检（渲染前的最后防线）\n\n```bash\nexport PATH=./bin:$PATH\nnpx hyperframes@latest inspect YYYYMMDD/\n```\n\n**✅ Stage 4 退出标准（必须全部满足，才允许执行 render）：**\n- [ ] `inspect` 命令退出码为 0（无报错）\n- [ ] 控制台输出的 `totalDuration` 与 Stage 2.1 测量的音频时长误差 < 0.2 秒\n- [ ] 无任何 `StaticGuard` 警告\n\n### 4.2.1 渲染前集成检查清单（⛔ 全部通过方可执行 render）\n\n在执行 `npx hyperframes render` 之前，必须逐一确认以下事项。**任意一项未通过，严禁渲染。**\n\n| # | 检查项 | 验证方法 |\n|---|--------|---------|\n| 1 | 封面标题幕存在 | `grep 'scene_cover' index.html` 返回结果 |\n| 2 | 封底互动幕存在 | `grep 'scene_end' index.html` 返回结果 |\n| 3 | 逐字同步字幕存在 | `grep 'subtitles-track' index.html` 且 `grep 'caption-word\\|CAPTIONS_DATA' index.html` 返回结果 |\n| 4 | 配音音频就位 | `ffprobe assets/narration.wav` 成功且时长 > 0 |\n| 5 | BGM 就位且为新文件 | `ffprobe assets/bgm.mp3` 成功，且 `视频脚本.md` 中有本集 BGM 署名（含曲名和来源） |\n| 6 | 所有视频素材就位 | `ls assets/scene*.mp4 \\| wc -l` == 剧本分镜数，且每个文件通过 `ffprobe` 校验 |\n| 7 | 素材为本集新下载 | `download_and_process.py` 中 URL 不与任何旧集重复 |\n| 8 | lint 零错误 | `npx hyperframes lint` 报 0 error(s) |\n\n### 4.3 渲染导出\n\n```bash\nexport PATH=./bin:$PATH\n# 强制渲染到项目renders目录下\nnpx hyperframes@latest render YYYYMMDD/ -o YYYYMMDD/renders/promo_video.mp4 --force-new\n```\n\nFile v1.2.0:resources/stages/stage_5_publish.md\n\n# Stage 5：发布与归档\n\n### 5.1 视频脚本元数据与多平台宣发策划补充\n\n在 `视频脚本.md` 中补充技术元数据与 **「小红书/短视频爆款宣发策划」**，确保视频具备出厂即可一键分发的高效爆款能力。\n\n#### 1. 技术参数补充（脚本底部）\n```markdown\n## 技术参数\n- **声纹**：VoxCPM2 用户克隆 / Kokoro am_adam\n- **实测时长**：{ffprobe 实测值}s\n- **BGM**：{BGM 名称} by {BGM 作者} (CC BY 4.0)\n- **YouTube**：{URL}\n```\n\n#### 2. 小红书/短视频宣发策划（脚本最下方）\n在 `视频脚本.md` 的最底部，**强制追加**小红书专属的宣发案策划，包含：\n1. **爆款标题推荐**（至少 3-4 个）：\n   - *写作公式 1 (痛点直击)*：`[痛点表情] + 痛点揭露/反差怪象 + 为什么会这样？`（例如：🤯 职场怪象：为什么招的人越贵，公司反而越慢？）\n   - *写作公式 2 (认知颠覆)*：`[警示表情] + 戳破某种常见幻觉/认知错误！`（例如：🚫 戳破老板的幻觉：个体优秀 ≠ 组织高效！）\n   - *写作公式 3 (具体数字)*：`[下降/冲突表情] + 极端数字对比 + 场景重现`（例如：📉 协同内耗：本来3人能决定的事，为什么变成了13人讨论？）\n2. **封面/配图文字建议**：设计大字冲击的主副标题，做首屏抓手。\n3. **小红书正文文案**：\n   - 使用丰富的 **Emoji** 进行段落排版，提升可读性。\n   - 包含：**痛点共情**（点明现状） + **干货输出**（列出 3 点精辟洞察或引述视频金句） + **互动钩子**（引导评论区分享见解，如“你们公司也是这样吗？”） + **精准热门标签**（如 `#职场那些事儿 #组织架构 #管理思维 #职场内耗`）。\n\n*规范模板示例：*\n```markdown\n## 5. 小红书宣发策划\n\n### 爆款标题推荐\n1. [小红书标题 1]\n2. [小红书标题 2]\n3. [小红书标题 3]\n\n### 封面/配图文字建议\n- **主标题**：[极简有力]\n- **副标题**：[点题/对比]\n\n### 小红书正文文案\n[带有丰富 Emoji、干货条理明晰、包含互动提问和小红书热门 Tag 的 300-500 字社交文案]\n```\n\n### 5.2 README 更新\n\n在 `README.md` 的「演示作品」表格中追加新作品条目（中英文双语部分均需更新）。\n\n### 5.3 Git 归档\n\n**仅 commit，不自动 push。** 推送时机由用户决定。\n\n```bash\ngit add YYYYMMDD/ README.md\ngit commit -m \"feat: Add {video_title} project\"\n# git push 由用户按需执行，不自动推送\n```\n\n**✅ Stage 5 退出标准：**\n- [ ] `视频脚本.md` 包含完整元数据（声纹、时长、BGM、YouTube 链接）以及小红书爆款标题与宣发策划文案\n- [ ] `README.md` 中英双语演示作品表格已更新\n- [ ] `git commit` 成功\n\nFile v1.2.0:resources/style_bible.md\n\n# 🎨 视觉风格指南 (FableForge Visual Style Bible)\n\n本指南是 FableForge 视频生成流水线的官方视觉规范，提供各题材、文化背景下的生图公式与排除规则，确保 AI 生成图像的风格自洽和文化准确度。\n\n---\n\n## 1. 风格决策原则\n\n- **动态适配**：视觉风格必须完全服务于故事。可选国风写意、现代极简、蒸汽朋克、赛博朋克或电影感实拍风格。\n- **自洽性**：全片所有图片的色调、光影和元素必须统一，严禁跨时空混搭（除非剧情要求）。\n- **文化锚点优先于美感**：当「好看」和「文化准确」冲突时，选文化准确。一张唐代故事里出现的日式庭院，再好看也是错误。\n\n---\n\n## 2. 常见文化与体裁锚点速查表\n\n| 文化/体裁设定 | 场景/建筑关键词 | 元素/服饰关键词 | 常见误导（必须排除） |\n|-------------|---------------|---------------|-------------------|\n| **现代商务 (Analytical)** | Modern glass office, boardroom, high-rise, minimalist workspace | Business suit, smart casual, laptop, abstract charts | 奇幻元素, 杂乱背景, 古代物品 |\n| **极简数据 (Analytical)** | Abstract data visualization, glowing nodes, dark background | Neon lines, geometric shapes, HUD elements | 具体人物, 复杂实景建筑 |\n| 唐宋中国 (Narrative)| Dougong brackets, grey tiles, wooden beams, moon gate | Round-collar robe, Hanfu, Mingguang armor | 鸟居, 和服, 榻榻米, 哥特尖拱 |\n| 明清中国 (Narrative)| Upturned eaves, red lacquer columns, courtyard houses | Changshan, Qipao, Mandarin collar | 和服, 韩服, 维多利亚裙 |\n| 日本和风 (Narrative)| Torii gate, tatami, shoji screens, engawa | Kimono, hakama, geta sandals | 斗拱, 汉服, 旗袍 |\n| 中世纪欧洲 (Narrative)| Gothic arches, stone castle, stained glass | Chainmail, surcoat, leather boots | 东方建筑, 丝绸长袍 |\n| 赛博朋克 (Narrative)| Neon signs, holographic ads, megastructures | LED-trimmed jacket, visor, cybernetic limbs | 古典建筑, 自然光 |\n\n---\n\n## 3. 图片提示词工程\n\n- **公式**：`[画幅指令] + [文化锚点] + [本幕内容] + [色调光影] + [质量后缀] + [排除清单]`\n- **质量后缀**：`hyper-realistic details, cinematic lighting, masterpiece, 8K`\n- **排除清单格式**：`No [culture A] elements, no [culture B] elements, no modern objects.`\n- **中文文字生成**（架构图/概念图专用）：`A [style] visualization with Chinese labels. Main node: \"核心词\". Sub-nodes: \"关联词1\", \"关联词2\". Professional design, glowing connections.`\n\n---\n\n## 4. 风格圣经模板示例\n\n### 4.1 古代中国唐代水墨风提示词\n```\nCinematic vertical shot, 9:16 aspect ratio. Ancient Chinese Tang Dynasty style.\nA young monk in grey round-collar robes holds a bronze oil lamp in a temple courtyard\nwith Dougong bracket architecture and grey tile roofing.\nInk-wash atmosphere, warm golden lamplight against dark shadows, subtle rice-paper texture.\nhyper-realistic details, cinematic lighting, 8K.\nNo Japanese elements, no Western elements, no modern objects.\n```\n\nFile v1.2.0:resources/template/script-template.md\n\n# FableForge — Storyboard Script Template\n\n## Project Info\n\n- **Topic**: (Management / leadership concept, e.g.: Zero-sum game, Principal-Agent problem)\n- **Target Duration**: 60 seconds\n- **Scene Count**: (Fill in, recommended 8–12)\n- **Narration Tone**: (Calm storytelling / Dramatic tension / Warm reflection)\n\n---\n\n## Allegory Story\n\n(Paste the full allegory story here for narration reference)\n\n---\n\n## Scene-by-Scene Storyboard\n\n> **Spec Constraints:**\n> - Narration per scene: 30–60 words\n> - Scene duration: 5–8 seconds (finalized from audio measurement)\n> - Image naming: `scene{N}.png` — strictly 1:1 with scene number\n> - Emotional gear must be tagged for each scene\n\n---\n\n### Scene 1 — [Scene Name]\n\n- **Time (draft estimate)**: 0 ~ 6 seconds\n- **Emotional Gear**: 1 (Slow Narration — opening, world-building)\n- **Narration**: (30–60 word narration text)\n- **Visual Description**: (English image generation prompt — include style, subject, lighting, mood)\n- **Voice Pacing Note**: (Any `…` pause markers needed?)\n\n---\n\n### Scene 2 — [Scene Name]\n\n- **Time (draft estimate)**: 6 ~ 12 seconds\n- **Emotional Gear**: 1\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 3 — [Scene Name]\n\n- **Time (draft estimate)**: 12 ~ 18 seconds\n- **Emotional Gear**: 2 (Building Tension — conflict starts)\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 4 — [Scene Name]\n\n- **Time (draft estimate)**: 18 ~ 24 seconds\n- **Emotional Gear**: 2\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 5 — [Scene Name]\n\n- **Time (draft estimate)**: 24 ~ 31 seconds\n- **Emotional Gear**: 2\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 6 — [Scene Name]\n\n- **Time (draft estimate)**: 31 ~ 38 seconds\n- **Emotional Gear**: 3 (Peak Intensity — key turning point)\n- **Narration**: (Narration text — should be shorter)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 7 — [Scene Name]\n\n- **Time (draft estimate)**: 38 ~ 44 seconds\n- **Emotional Gear**: 3\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 8 — [Scene Name]\n\n- **Time (draft estimate)**: 44 ~ 50 seconds\n- **Emotional Gear**: 4 (Silence & Space — pause before conclusion)\n- **Narration**: (≤ 15 words — let the weight sink in)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**: Add `…` between every phrase\n\n---\n\n### Scene 9 — [Scene Name]\n\n- **Time (draft estimate)**: 50 ~ 56 seconds\n- **Emotional Gear**: 4 → 1 (Resolution landing)\n- **Narration**: (≤ 20 words — fewest words, biggest insight)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n(Copy the format above to add more scenes if needed)\n\n---\n\n## Full Narration (Combined)\n\n(Concatenate all scene narrations in order — paste directly into `generate.py` as `TARGET_TEXT`)\n\n```\nScene 1: [narration]\n\n||| Scene 2: [narration]\n\n||| ...\n```\n\n---\n\n## Publishing Metadata\n\n### Title Options\n1. (Option 1)\n2. (Option 2)\n3. (Option 3)\n\n### Cover Tagline\n(One punchy line, ≤ 15 words)\n\n### Tags / Topics\n(Keywords for social platforms, e.g.: leadership, management, fable, AI-video)\n\nFile v1.2.0:resources/template/视频脚本.md\n\n# 视频脚本模板\n\n## 基本信息\n\n- **主题**：（填写管理学/领导力概念，例：零和博弈、委托代理问题）\n- **视频时长目标**：60 秒\n- **分镜数量**：（填写幕数，建议 8～12）\n- **配音风格**：（沉稳叙事 / 紧张戏剧 / 温和启发）\n\n---\n\n## 寓言故事\n\n（在此处填写完整的寓言故事，供旁白参考）\n\n---\n\n## 分镜头剧本\n\n> 规格约束：\n> - 每幕旁白 30～60 字\n> - 每幕时长 5～8 秒（以音频实测为准）\n> - 图片命名：`scene{N}.png`，与幕序号严格一一对应\n\n---\n\n### 分镜 1 — 【幕名】\n\n- **时间（草稿估算）**：第 0 ～ 6 秒\n- **旁白**：（30～60字的旁白文本）\n- **画面描述**：（英文 AI 绘图提示词，需包含画风、主体、光影、氛围）\n\n---\n\n### 分镜 2 — 【幕名】\n\n- **时间（草稿估算）**：第 6 ～ 12 秒\n- **旁白**：（旁白文本）\n- **画面描述**：（提示词）\n\n---\n\n### 分镜 3 — 【幕名】\n\n- **时间（草稿估算）**：第 12 ～ 18 秒\n- **旁白**：（旁白文本）\n- **画面描述**：（提示词）\n\n---\n\n（复制上方格式，按需添加至 scene{N}）\n\n---\n\n## 完整旁白合并文本\n\n（将以上所有分镜旁白按顺序合并，直接用于 TTS 生成）\n\n---\n\n## 标题建议（用于发布）\n\n1. （标题方案 1）\n2. （标题方案 2）\n3. （标题方案 3）\n\n## 推荐封面文案\n\n（一句话点睛，20 字以内）\n\nArchive v1.1.0: 16 files, 45176 bytes\n\nFiles: resources/stages/stage_0_env.md (1825b), resources/stages/stage_1_creatives.md (12505b), resources/stages/stage_2_timeline.md (2454b), resources/stages/stage_3_static.md (9493b), resources/stages/stage_4_animation.md (3206b), resources/stages/stage_5_publish.md (2798b), resources/style_bible.md (3137b), resources/template/index.html (3859b), resources/template/script-template.md (3443b), resources/template/style.css (2519b), resources/template/视频脚本.md (1462b), resources/troubleshooting.md (2383b), resources/voice-model/README.md (2287b), SKILL.en.md (18954b), SKILL.md (16086b), _meta.json (129b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: ai-video-studio\nversion: 1.1.0\ndescription: FableForge 通用视频生成流水线 SOP。支持两种生产模式（图片流、视频 B-roll 流）和三种体裁（叙事寓言、商业分析、产品宣发）。包含从概念生成、剧本创作、TTS 配音、素材采集、到 HyperFrames 视频渲染的完整工业化 SOP，以及视觉风格指南与技术陷阱手册。v1.1.0 新增全局禁令、素材新鲜度校验、渲染前集成检查清单、模式 B 封面/封底/字幕强制模板。\n---\n\n# 🔨 FableForge · 视频生成工业流水线 AI Agent SOP\n\n本 Skill 是一份**命令级可执行 SOP**，而非经验教训集。每个 Stage 均包含**具体执行命令**和**退出验收标准**，严禁跳步或在退出标准未满足时进入下一阶段。\n\n### ⛔ 全局禁令（违反任意一条即判定为生产事故）\n\n1. **严禁复用旧集素材**：每一集的 `assets/` 目录下的所有文件（视频、音频、图片、BGM）必须为本次任务全新生成或下载。严禁从其他 `episodes/` 目录复制任何媒体文件。唯一例外是 `narration.wav`（由 TTS 脚本生成）和模板代码结构（非媒体文件）。\n2. **严禁跳过退出标准**：每个 Stage 的退出标准中的所有检查项必须逐一验证并标记为通过，才能进入下一个 Stage。\n3. **严禁无字幕渲染**：无论模式 A 还是模式 B，最终视频必须包含与配音同步的逐字滚动字幕。\n4. **严禁无封面/封底渲染**：所有视频必须包含封面标题幕（`#scene_cover`）和封底互动幕（`#scene_end`）。\n5. **严禁复用旧集 BGM**：每集的背景音乐必须根据本集剧本的情绪主题全新搜索并下载，不得复用历史集的 `bgm.mp3`。\n\n---\n\n## 0. 视频规格与体裁定义（内容优先定档制）\n\n**核心原则：内容的可理解性永远优先于时长限制。**\n\n视频时长不是预设的固定值，而是由内容倒推得出的。错误的做法是「先定 60 秒，然后把内容往里塞」；正确的做法是「先确认内容讲完需要多少字，再据此选档」。\n\n### 0.0 视频体裁系统 (Genre)\n\n本流水线支持三种核心体裁。在构思内容前，**必须首先确定体裁**：\n\n| 体裁 (Genre) | 特征与核心要求 | 适用场景 | 常用视觉模式 |\n|-------------|-----------|---------|---------|\n| **Genre X: 叙事/隐喻 (Narrative)** | 有角色、有冲突。旁白重感受轻动作，追求悬念与结局升华。 | 寓言故事、历史重现、管理隐喻 | + 模式 A (图片) |\n| **Genre Y: 分析/科普 (Analytical)** | 论点驱动、逻辑递进。追求清晰的结构拆解和痛点直击。 | 商业分析、职场洞察、技术科普 | + 模式 B (B-roll) |\n| **Genre Z: 宣发/展示 (Promotional)**| 产品中心、利益点明确。强节奏感与转化引导 (CTA)。 | 产品宣发、网站转视频、功能展示 | 混合模式 |\n\n### 0.1 三档体系\n\n| 档位 | 适用场景 | 旁白总字数 | 预估时长 | 分镜数 |\n|------|---------|-----------|---------|-------|\n| S · 短片 | 单一概念解释、痛点直击、高密度短平快 | 150～450 字 | 45～120 秒 | 1+5~12+1 |\n| M · 标准 | 完整叙事、多维度拆解、深度论证 | 450～900 字 | 120～270 秒 | 1+12~20+1 |\n| L · 长篇 | 复杂案例剖析、连续剧集 | 900～1500 字 | 270～420 秒 | 1+20~30+1 |\n\n> 超过 1500 字的内容必须拆成上下集（每集独立成片，各自包含封面和结尾）。\n\n### 0.2 定档公式\n\n```\n旁白总字数 = 原始故事中【不可删减要素】的合计字数（见 0.3）\n预估时长(秒) = 旁白总字数 ÷ 3.5（中文语速）\n根据预估时长选择对应档位\n```\n\n### 0.3 不可删减要素（内容完整性红线）\n\n不同体裁有不同的不可删减要素。如果被删除，观众将无法理解视频的核心价值。**剧本转化阶段（Stage 1.2）严禁删除这些要素：**\n\n| 体裁 (Genre) | 核心不可删减要素 | 删除后果 |\n|-------------|----------------|----------|\n| **Narrative (叙事类)** | 因果链、角色动机、关键对话、认知翻转事件、结局因果闭环 | 观众不知道“为什么”，悬念消失，结论像硬塞的 |\n| **Analytical (分析类)**| 痛点现象描述、核心矛盾拆解、数据对比/逻辑支撑、金句结论 | 视频变成空洞的说教，缺乏说服力 |\n| **Promotional(宣发类)**| 目标受众痛点、核心利益点 (Benefit)、差异化价值、明确的 CTA | 看完后不知道自己能得到什么，无法转化 |\n\n**可以精简的要素：**\n- 重复的环境描写或冗长的数据罗列（保留首次，后续可省略）\n- 纯装饰性的形容词堆叠\n- 不影响主线的次要信息\n- 已被画面传达的信息（如「山很高」——画面已经表达了）\n\n### 0.4 通用规格（所有档位共享）\n\n| 规格项 | 标准值 | 说明 |\n|--------|--------|------|\n| 每幕旁白字数 | 中文 30～80 字 / 英文 20～50 词 | 中文约 3.5 字/秒，英文约 2.5 词/秒 |\n| 每幕预估时长 | 5 ～ 15 秒 | 最终以音频实测为准 |\n| 分镜编号格式 | `scene_cover`, `scene1`~`scene{N}`, `scene_end` | 与 `assets/` 下的图片名严格一一对应 |\n| 旁白与分镜对应 | 1 幕 == 1 张图 == 1 段旁白 | 封面通常对应标题旁白，结尾对应金句旁白 |\n\n---\n\n## 0.5 质量门禁（三重内容验收）\n\n视频质量的上限由三个核心因素决定。**每一重门禁未通过，不得进入下一阶段。**\n\n### 门禁一：概念与大纲验收（概念生成后、停机确认前执行）\n\nAI 容易生成\"结构正确但洞察平庸\"的内容。在向用户展示前，必须根据体裁完成自检：\n\n**强制自检（全部通过方可提交用户确认）：**\n- [ ] **反常识测试 (通用)**：这个洞察/角度是\"大家都知道\"还是\"大家都经历但从没被命名\"的？前者没传播价值，重写。\n- [ ] **Genre X (叙事) 专属**：结局是否让人感到轻微不适或醍醐灌顶？隐喻是否太直白（能在前10秒猜到结局）？\n- [ ] **Genre Y (分析) 专属**：逻辑链条是否严密？是否提出了具有实操性的认知升华？\n- [ ] **现实锚定测试 (通用)**：结尾的解释/结论，是否映射到了用户**今天就可能遭遇**的具体场景？\n\n---\n\n### 门禁二：脚本节奏验收（剧本转化后执行）\n\n脚本是情绪与逻辑的乐谱。全片节奏必须有起伏，禁止平铺直叙。\n\n**体裁节奏铁律：**\n\n- **Genre X (叙事类) — 情绪驱动**：\n  - **写感受，不写动作**。旁白描述情绪状态，而不是画面动作（❌ `\"十只狼排成一列\"` → ✅ `\"山谷里没有声音，只有风\"`）。\n  - **采用 1-4 情绪档位系统**（1舒缓/2蓄力/3爆发/4留白），并在剧本中标注。\n- **Genre Y (分析类) — 逻辑驱动**：\n  - **结构清晰**：必须遵循“现象引入 → 核心矛盾 → 数据/逻辑支撑 → 升华结论”的节奏。\n  - **金句前置或垫后**：关键论点必须短小精悍。\n- **所有体裁通用**：\n  - **结论幕字数减半**：最后一幕旁白不超过 20 字。越重要的道理，越要用更少的字。\n  - **剧本格式补充档位字段**：每幕必须标注 `- **情绪/节奏档位**：{X}`，指导配音语气与画面。\n  - **剔除字幕语气省略号（黄金审美红线）**：严禁在生成的 HTML 字幕、文本及海报中包含任何由于配音语气停顿而产生的 `……`、`...` 或是拖泥带水的标点冗余。配音的停顿必须纯粹通过声音的节奏（如 TTS 音频）去表现，而屏幕上的视觉文字与金句必须保持绝对干净利索、斩钉截铁，字字铿锵有力。\n\n---\n\n### 门禁三：图片质量验收（图片生成后、进入 Stage 2 前执行）\n\n**构图与画幅规范（强制）：**\n- **画幅固定**：必须生成 **9:16 竖屏**图片（DALL-E 3 使用 `1024x1792`）。严禁使用横屏图片。\n- **主体位置**：主体人物/物件必须在画面**上方 1/3** 区域，底部留给字幕区。\n- **提示词必加**：`cinematic vertical shot, 9:16 aspect ratio, subject positioned in upper third of frame, dark atmospheric space at bottom`\n- **全片一致性**：主光源方向统一，保持跨幕视觉连贯。\n\n**风格圣经与一致性工作流（强制）：**\n为了保证多幕生图的视觉一致性，在生成任何图片之前，必须先根据体裁和设定定义一套「风格圣经」作为所有提示词的前缀，并为主要角色建立角色特征词组。\n\n详细的风格圣经编写步骤、提示词工程公式以及角色一致性锚定工作流，请务必直接阅读 [🎨 视觉风格参考手册](file://./resources/style_bible.md)。\n\n**逐张自检：**\n- [ ] **封面图 (scene_cover)**：视觉冲击力极强，具备悬念感，能瞬间抓住注意力。\n- [ ] **结尾图 (scene_end)**：意境深远，具备“神性”或“哲学感”，完美呼应主题并实现情感/认知升华。\n- [ ] 主体在画面上 1/3，底部有足够深色安全区供字幕叠加\n- [ ] 图片情绪与该幕的「情绪档位」匹配（档位 3 的图不能是平静场景）\n- [ ] 全片光影/色调风格一致\n- [ ] 无明显 AI 瑕疵（多余手指、文字乱码、比例失调等）\n\n---\n\n## 0.6 生产模式决策（内容定型后执行）\n\nFableForge 支持两种生产模式。**在用户确认内容方向后、动手写剧本之前**，必须先确定生产模式。\n\n### 两种模式概览\n\n| 维度 | 模式 A：纯图片 | 模式 B：视频 + 文字叠加 |\n|------|-------------|----------------------|\n| **适用题材** | 寓言故事、有角色弧线的隐喻 | 职场分析、管理洞察、观点输出 |\n| **画幅** | 16:9 横屏（1920×1080） | 9:16 竖屏（1080×1920） |\n| **视觉素材** | AI 生成的场景图片 | Pexels/Pixabay 免费 B-roll 视频 |\n| **文字呈现** | 底部字幕条 | 全屏文字叠加排版（暗化遮罩 + 大字） |\n| **叙事结构** | 角色驱动的故事弧线 | 论点驱动的拆解/金句输出 |\n| **产出节奏** | 较慢（等图片生成 + 风格校准） | 较慢（等图片生成 + 风格校准） |\n\n### 快速决策表\n\n| 判断条件 | 选择 |\n|---------|------|\n| 有具体角色名字和对话（僧人、狼王、船夫……） | 模式 A |\n| 叙事主语是「我」「你」「我们」「很多公司」 | 模式 B |\n| 需要展示隐喻（灯 → 认知、桥 → 管理） | 模式 A |\n| 需要展示数据对比（3 → 13）、金句输出 | 模式 B |\n| 用户明确说\"拍成视频\" / \"竖版\" / \"短视频\" | 模式 B |\n| 用户明确说\"写个寓言\" / \"讲个故事\" | 模式 A |\n\n> ⚠️ 用户可在停机确认时手动覆盖 AI 的模式推荐。模式确定后写入 `视频脚本.md` 头部的「内容定档」章节。\n\n### 模式选定后的流程分叉\n\n- **模式 A**：走 §1.5A（图片素材生成）→ §3.2（横屏 HTML 模板）→ 正常流程\n- **模式 B**：走 §1.5B（视频 B-roll 采集）→ §3.2B（竖屏 HTML + 文字叠加模板）→ 正常流程\n- 其余阶段（概念、剧本、TTS、BGM、音频解析、动画、渲染、发布）两种模式共享。\n\n---\n\n## 视频生产核心流水线 (Stages)\n\n为确保 AI 执行各阶段时的高精准度与低上下文占用，制片厂流水线已全面重构为模块化架构。**当您执行某一个特定阶段时，请直接调阅并遵循该阶段对应的子 SOP 指南**：\n\n### 🛠️ [Stage 0: 自动化环境部署 (Scaffolding)](file://./resources/stages/stage_0_env.md)\n*   **用途**：首次运行或初始化项目环境时执行。\n*   **动作**：部署模板、检测并下载静态 `ffmpeg` / `ffprobe` 环境、构建 VoxCPM2 隔离 Python 环境。\n*   **核心指南**：[阅读 Stage 0 SOP](file://./resources/stages/stage_0_env.md)\n\n### ✍️ [Stage 1：概念、剧本与物料生成](file://./resources/stages/stage_1_creatives.md)\n*   **用途**：创意策划与声画素材（文字海报、B-roll、配音与BGM）准备。\n*   **动作**：根据 Genre 生成大纲并在停机确认后进行内容定档与剧本拆解，运行声纹克隆脚本，使用图片 API 或自动化下载裁剪 B-roll，并强制生成纯文字封面/封底海报。\n*   **核心指南**：[阅读 Stage 1 SOP](file://./resources/stages/stage_1_creatives.md)\n\n### ⏱️ [Stage 2：音频解析与数据驱动时间轴](file://./resources/stages/stage_2_timeline.md)\n*   **用途**：解析配音，进行像素级音视频时间戳对齐。\n*   **动作**：通过 `ffprobe` 获取音频绝对时长，使用 Whisper (A方案) / RMS 能量分析 (B方案) 获得精确断句，映射生成 `data-start` 时间轴。\n*   **核心指南**：[阅读 Stage 2 SOP](file://./resources/stages/stage_2_timeline.md)\n\n### 📐 [Stage 3：静态排版构建与验收](file://./resources/stages/stage_3_static.md)\n*   **用途**：横版/竖屏 HTML 与 CSS 样式搭建。\n*   **动作**：搭建 `#composition` DOM 骨架。模式 B 下严格执行视频标签扁平化，配置组件库（`.headline`, `.neq` 等），确保静态显示 100% 正确并通运 `lint` 校验。\n*   **核心指南**：[阅读 Stage 3 SOP](file://./resources/stages/stage_3_static.md)\n\n### 🎬 [Stage 4：动画集成与预检发版](file://./resources/stages/stage_4_animation.md)\n*   **用途**：GSAP 动画渲染与 MP4 导出。\n*   **动作**：集成 Ken Burns 等情绪转场动画，运行 `inspect` 实施最终质量门禁，使用 `render` 导出 MP4 视频。\n*   **核心指南**：[阅读 Stage 4 SOP](file://./resources/stages/stage_4_animation.md)\n\n### 📦 [Stage 5：发布与归档](file://./resources/stages/stage_5_publish.md)\n*   **用途**：补充宣发策划，作品归档。\n*   **动作**：自动补充脚本元数据，**强制追加小红书爆款宣发案**（标题、大字封面文案及 Emoji 社交文案），更新 README 并在本地进行 Git 提交。\n*   **核心指南**：[阅读 Stage 5 SOP](file://./resources/stages/stage_5_publish.md)\n\n---\n\n## 附录：核心指南与排坑规范\n\n为了保持核心 SOP 的精炼度，以下核心手册与技术参考已存为独立的资源文件，Agent 在执行时可按需读取：\n\n- **🎨 视觉风格参考手册**：提供详细风格词典、提示词公式及文化锚点，请查阅 [视觉风格参考手册](file://./resources/style_bible.md)。\n- **🐛 技术陷阱与排坑规范**：汇总图片裁切、视频冻结、音轨对齐等已知 Bug 解决方案，请查阅 [技术排坑手册](file://./resources/troubleshooting.md)。\n\n### 附录 C：项目归档规范结构\n\n**模式 A（纯图片叙事视频）：**\n```text\n/YYYYMMDD/\n  ├── index.html          (核心时间轴，Stage 3/4 产物)\n  ├── assets/\n  │   ├── scene_cover.png (封面图，纯文字海报)\n  │   ├── scene1.png ~ sceneN.png\n  │   ├── scene_end.png   (结尾图，纯文字海报)\n  │   ├── narration.wav   (TTS 配音)\n  │   ├── bgm.mp3         (背景配乐，Stage 1.7 产物)\n  │   └── transcript.json (Whisper 时间戳，Stage 2.2 产物)\n  ├── 视频脚本.md          (剧本，Stage 1.2 产物)\n  └── promo_video.mp4     (最终成品，Stage 4.3 产物，Git 豁免名单)\n```\n\n**模式 B（视频 B-roll + 文字叠加）：**\n```text\n/YYYYMMDD_{project_name}/\n  ├── index.html               (核心时间轴，竖屏 1080×1920)\n  ├── style.css                (独立样式表，文字叠加组件库)\n  ├── download_and_process.py   (B-roll 自动化下载/裁剪脚本)\n  ├── assets/\n  │   ├── scene1.mp4 ~ sceneN.mp4  (裁剪后的 B-roll 视频，1080×1920，无音轨)\n  │   ├── narration.wav            (TTS 配音)\n  │   └── bgm.mp3                  (背景音乐)\n  ├── 视频脚本.md                   (剧本 + B-roll 素材规划表)\n  └── renders/\n      └── {project}_YYYY-MM-DD_HH-MM-SS.mp4  (渲染成品)\n```\n\nFile v1.1.0:resources/voice-model/README.md\n\n# 声音样本录制指南\n\n## 为什么需要录制声音样本？\n\n本项目使用 **VoxCPM2** 声纹克隆模型。它的工作原理是：\n1. 你提供一段 **15 秒**的自己的声音\n2. 模型学习你的**音色、语调、情感特征**\n3. 之后，模型就能用**你的声音**朗读任何文字\n\n效果就像你亲自配音，但实际上是 AI 在模拟你。\n\n---\n\n## 录音要求\n\n| 项目 | 标准 |\n|------|------|\n| 时长 | **15 秒**（过短效果差，过长会截断） |\n| 格式 | WAV（不要 MP3，会丢失音质） |\n| 采样率 | 44100 Hz 或以上 |\n| 语速 | 正常语速，不要刻意放慢 |\n| 内容 | 朗读下方指定文本（必须与 `PROMPT_TEXT` 一致） |\n\n---\n\n## 推荐朗读文本\n\n将下方文字复制到 `generate.py` 的 `PROMPT_TEXT` 参数，并**朗读同样的内容**：\n\n```\n大家好，我在录制自己的声音样本。这段录音将作为我的声纹模板，\n帮助 AI 精确还原我的音色和情感。现在是[你的名字]，感谢收听。\n```\n\n你也可以自定义这段文字，但要确保录音内容和 `PROMPT_TEXT` **完全一致**。\n\n---\n\n## 录音步骤（Mac）\n\n### 方法 A：使用 QuickTime（最简单）\n\n1. 打开 QuickTime Player\n2. 菜单栏 → 文件 → 新建音频录制\n3. 点击录制按钮，朗读文本，停止\n4. 导出 → 音频 → 保存为 WAV\n\n### 方法 B：使用 Audacity（质量更好）\n\n```bash\n# 安装 Audacity\nbrew install --cask audacity\n```\n\n1. 选择麦克风（推荐有线耳机）\n2. 点击录制，朗读文本\n3. 导出为 WAV，采样率 44100\n\n---\n\n## 保存路径\n\n录音完成后，将文件保存为：\n```\nvoice-model/01_samples/my_voice.wav\n```\n\n> ⚠️ **隐私提示**：此文件包含你的声纹信息，`.gitignore` 已自动排除 `01_samples/` 目录，不会被提交到 GitHub。\n\n---\n\n## 录音质量检验\n\n一个好的声音样本应该：\n- [ ] 没有明显的背景噪音（空调声、键盘声等）\n- [ ] 没有爆音（P、B 音爆声）\n- [ ] 没有回声（不要在浴室或空旷房间录制）\n- [ ] 语速自然，情感投入（不要像机器人一样朗读）\n\n---\n\n下一步：参考 [README.md 阶段一第 4 步](../README.md#阶段一录制你的声音首次必做一劳永逸) 运行 `generate.py` 测试效果。\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn70kae1g9r73x5v5vn83saj7h86yevd\",\n  \"slug\": \"fableforge\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1779276111456\n}\n\nFile v1.1.0:resources/stages/stage_0_env.md\n\n# Stage 0: 自动化环境部署 (Scaffolding)\n\n当用户在一个空文件夹中首次要求“初始化项目”或“初始化 FableForge”时，**必须且仅需执行一次**本阶段。如果你发现当前目录已经有了 `template/` 和 `bin/`，则说明已初始化过，请直接跳过。\n\n**0.1 复制模板与模型资源**\nFableForge 的项目模板与语音模型代码已打包在 Skill 目录中。请执行以下命令：\n\n```bash\n# 复制 HTML 模板与脚本模板\ncp -r .agents/skills/fableforge/resources/template ./template\n\n# 复制语音模型脚手架\ncp -r .agents/skills/fableforge/resources/voice-model ./voice-model\n```\n\n**0.2 自动下载 FFmpeg 环境**\n本流水线强烈依赖 `ffmpeg` 与 `ffprobe`。请自动为用户下载静态构建版：\n\n```bash\ncurl -L https://evermeet.cx/ffmpeg/get/zip -o ffmpeg.zip && unzip -o ffmpeg.zip\ncurl -L https://evermeet.cx/ffmpeg/get/ffprobe/zip -o ffprobe.zip && unzip -o ffprobe.zip\nmkdir -p bin && mv ffmpeg bin/ && mv ffprobe bin/ && chmod +x bin/*\nrm ffmpeg.zip ffprobe.zip\n```\n\n**0.3 自动配置 VoxCPM2 Python 环境**\n执行以下命令为用户的语音克隆模型创建隔离环境并安装依赖：\n\n```bash\npython3 -m venv voice-model/venv\nsource voice-model/venv/bin/activate\npip install voxcpm soundfile torch numpy\n```\n\n**0.4 引导用户录制声纹样本**\n执行完毕后，请暂停并提示用户：\n> \"FableForge 环境已初始化完毕！请您用手机或电脑录制一段 15 秒的声音（朗读任意文本），将其导出为 `.wav` 格式，并放置在 `voice-model/01_samples/my_voice.wav`。准备好后请告诉我，我们就可以开始做视频了！\"\n\n**✅ Stage 0 退出标准：**\n- [ ] 当前工作区包含 `template/`、`voice-model/` 和 `bin/` 目录。\n- [ ] 用户确认已准备好声纹样本。\n\nFile v1.1.0:resources/stages/stage_1_creatives.md\n\n# Stage 1：概念、剧本与物料生成\n\n### 1.1 概念与大纲生成（须停机等待用户确认）\n\n根据确定的体裁 (Genre)，使用对应的提示词框架生成内容大纲：\n\n**对于 Genre X (叙事类)：**\n> \"请你从[指定领域]里，选择一个深度的概念。然后写一个寓言/历史故事，用间接的方式把这个概念讲清楚。不要一开始就说答案，到故事快结束时反转。最后解释概念及隐喻。\"\n\n**对于 Genre Y (分析类)：**\n> \"请你从[指定领域]里，挖掘一个反直觉的痛点现象。先描绘这个现象，然后拆解背后的核心矛盾/系统性崩溃原因，最后给出具有实操性的商业洞察或管理金句。\"\n\n**对于 Genre Z (宣发类)：**\n> \"请根据[产品/功能描述]，提取最核心的用户痛点和利益点，以短视频节奏输出一段极具转化率的宣发文案框架（痛点直击 -> 价值展示 -> CTA）。\"\n\n**去重检查**：生成前扫描工作空间内所有 `YYYYMMDD/视频脚本.md`，确保主题不与历史作品重复。\n\n⛔ **此步完成后必须停机，将生成的大纲/故事完整展示给用户，等待明确确认。未经确认严禁继续。**\n\n### 1.2 内容定档（用户确认大纲后立即执行）\n\n在动手写剧本之前，必须先完成内容定档。这是防止「好内容变烂视频」的关键步骤。\n\n**步骤：**\n\n1. **标记不可删减要素**：逐段扫描用户确认的内容大纲，用以下标签标记（见 0.3）：\n   - `[因果/逻辑]` — 逻辑链节点\n   - `[转折/对比]` — 认知翻转或数据对比\n   - `[核心金句]` — 结论闭环\n\n2. **计算最低旁白字数**：将所有标记要素的文本合适，得出「不可压缩下限」。\n\n3. **选档**：根据合计字数，在 §0.1 三档体系中选择对应档位。\n\n4. **输出定档报告**（写入 `视频脚本.md` 头部）：\n   ```markdown\n   ## 内容定档\n   - **原始内容字数**：{X} 字\n   - **不可删减要素字数**：{Y} 字\n   - **选定档位**：{S/M/L}\n   - **预估旁白总字数**：{Z} 字\n   - **预估视频时长**：{Z ÷ 3.5} 秒\n   ```\n\n⛔ **如果不可删减要素字数 > 450（S 档上限），严禁使用 S 档强行压缩。必须升档。**\n\n### 1.3 剧本转化\n\n将内容按选定档位的规格拆解为分镜剧本，写入 `YYYYMMDD/视频脚本.md`。\n\n**内容完整性自检（剧本写完后必须执行，全部通过才能进入下一步）：**\n\n- [ ] **盲测**：让一个没读过原文的人只看剧本旁白，能否独立理解核心价值（故事结局/分析结论）？如果不能，说明删多了。\n- [ ] **因果/逻辑链完整**：每个「结论」都有对应的「事件/数据」作为铺垫，没有凭空冒出的道理。\n- [ ] **Genre X 专属**：角色有动作有对话，不能只靠旁白概括。\n- [ ] **Genre Y 专属**：痛点现象的铺垫是否足以推导出最终的解决方案和金句？\n\n剧本格式模板：\n```markdown\n## 分镜 scene_cover — 封面/标题幕\n- **情绪档位**：1\n- **旁白**：{通常为视频标题或引导句}\n- **画面描述**：{高吸引力、悬念感强的提示词}\n\n## 分镜 {N} — {幕名}\n- **时间（草稿估算）**：第 {X} ～ {Y} 秒\n- **情绪档位**：{1/2/3/4}\n- **旁白**：{中文30~80字}\n- **画面描述**：{图片提示词，中英文均可}\n\n## 分镜 scene_end — 结尾/升华幕\n- **情绪档位**：4\n- **旁白**：{点题金句，不超过 20 字}\n- **画面描述**：{意境深远、呼应主题的提示词}\n```\n\n### 1.4 TTS 语音生成\n\n**声纹选择（优先意识）：**\n- **默认原则**：优先检查 `/语音模型/voxenv` 环境。若存在，**必须**使用用户的声纹克隆生成旁白。\n- **降级方案**：仅在用户明确要求或克隆环境不可用时，才使用 Kokoro 等通用模型。\n\n**语音节奏优化：**\n\nVoxCPM2 的情绪输出相对平稳，需要在文本层面手动注入戏剧感。处理规则：\n\n- 在核心关键词前插入 `……`，让模型自动降速放重音\n- 超过 130 字的段落用 `|||` 在语气转折处手动分段\n- 档位 4（沉默留白幕）的旁白每个词组之间都加 `……`\n\n```\n❌ 平铺直叙：\n\"你以为选出了战将，其实你只选出了最擅长残杀队友的屠夫。\"\n\n✅ 有停顿感的版本：\n\"你以为……选出了战将。|||其实，你只筛选出了——最擅长残杀队友的……屠夫。\"\n```\n\n在项目目录下执行：\n\n```bash\n# 使用本地 VoxCPM2 模型生成语音（必须使用虚拟环境的 Python）\n# 1. 复制并编辑生成脚本（每个项目独立一份）\ncp /Users/lucas/Work/09.Antigravity/语音模型/generate_cantillon.py \\\n   /Users/lucas/Work/09.Antigravity/语音模型/generate_{project_name}.py\n# 2. 编辑 TARGET_TEXT、OUTPUT_FILE 等变量\n# 3. 运行\n/Users/lucas/Work/09.Antigravity/语音模型/voxenv/bin/python3 \\\n  /Users/lucas/Work/09.Antigravity/语音模型/generate_{project_name}.py\n```\n\n### 1.5A 图片素材生成（模式 A）\n\n> ℹ️ 仅模式 A（纯图片）执行此步。模式 B 跳转至 §1.5B。\n\n按剧本中每幕的\"画面描述\"逐一生成图片，命名严格遵循 `scene1.png`、`scene2.png` ... `scene{N}.png`，保存至 `YYYYMMDD/assets/`。\n\n**批量生成策略（应对 API 配额限流）：**\n\n图片生成 API 通常有速率限制（如每窗口期 5 张）。为避免流程阻塞，采用以下策略：\n\n1. **先批量准备提示词**：在生成前，将全部场景的提示词按风格圣经公式组装完毕，写入剧本。\n2. **分批生成 + 穿插其他工作**：每批生成到限流后，立即切换到其他 Stage 的工作（如音频分析、HTML 搭建），不要干等。\n3. **生成即归档**：每张图生成后立即 `cp` 到 `assets/` 目录并验证文件名，避免最后批量操作时遗漏。\n4. **断点续传**：用 `ls assets/scene*.png | wc -l` 检查进度，只生成缺失的图片。\n\n### 1.5B 视频 B-roll 素材采集与裁剪（模式 B）\n\n> ℹ️ 仅模式 B（视频 + 文字叠加）执行此步。模式 A 跳转至 §1.5A。\n\n**步骤 1 — B-roll 关键词策划：**\n\n根据每幕的情绪和主题，在 `视频脚本.md` 中列出搜索关键词：\n```markdown\n## B-roll 素材规划\n| 幕 | 情绪 | 搜索关键词 | 画幅偏好 |\n|----|------|-----------|---------|\n| scene1 | 压迫/悬疑 | dark office, laptop screen | 竖屏优先 |\n| scene2 | 忙碌/混乱 | meeting room, people talking | 竖屏优先 |\n| scene7 | 升华/开阔 | city night, aerial view | 横屏可接受 |\n```\n\n**步骤 2 — 素材探测（浏览器手动或自动）：**\n\n在 Pexels (https://pexels.com/search/videos/) 搜索关键词，获取视频直链。优先选择：\n- 竖屏 9:16（`_1080_1920_` 或 `_1440_2560_`）\n- 时长 ≥ 10 秒（裁剪后留 ≤ 20 秒）\n- 无水印、免版税\n\n**步骤 3 — 编写自动化下载脚本 `download_and_process.py`：**\n\n脚本必须包含以下能力（仅参考下方代码模板的结构，⛔ 严禁复制旧集的 URL 或文件路径，每集的 URL 必须根据本集剧本主题全新搜索获取）：\n\n```python\nVIDEO_MAP = {\n    \"scene1.mp4\": {\"url\": \"https://videos.pexels.com/...\", \"is_vertical\": True},\n    \"scene2.mp4\": {\"url\": \"https://videos.pexels.com/...\", \"is_vertical\": False},\n    # ...\n}\n```\n\n**下载容错规范：**\n- `curl -L -k --retry 5 --retry-delay 3 -H \"User-Agent: Mozilla/5.0 ...\"` — Pexels CDN 需要浏览器 UA，且 SSL 连接不稳定\n- 若 curl 返回非零但文件通过 `ffprobe` 校验 → 视为下载成功（Cloudflare 常在传输末尾断开连接）\n- 已存在的有效视频自动跳过（断点续传）\n\n**FFmpeg 竖屏裁剪规范：**\n\n| 原片画幅 | FFmpeg filter | 说明 |\n|---------|--------------|------|\n| 9:16 竖屏 | `scale=1080:1920` | 直接缩放 |\n| 16:9 横屏 | `crop=ih*9/16:ih,scale=1080:1920` | 居中裁剪后缩放 |\n\n所有视频统一参数：`-stream_loop 2 -t 30 -c:v libx264 -crf 18 -an -y`（循环拼接后限时长 30s，去音轨。确保素材时长覆盖该幕的完整 `data-duration`，避免播完后黑屏）\n\n**步骤 4 — 运行脚本：**\n```bash\nexport PATH=./bin:$PATH\npython3 download_and_process.py\n```\n\n### 1.6 纯文字海报生成（封面 scene_cover 与 封底 scene_end）\n\n> ℹ️ 无论处于模式 A（纯图片）还是模式 B（视频B-roll），所有视频都必须具备静态的海报级封面与封底。如果你有 `image_generate` 或类似生图工具的权限，请带上 `aspect_ratio=\"portrait\"` 等参数调用；否则，请输出 Prompt 引导用户在其他平台生成。\n\n**通用设计铁律：所有封面与封底必须是纯文字排版，绝不配图、无图标、无装饰。**\n- **满屏大标题** — 文字撑满整张画面，不留大片空白。\n- **错落有致** — 多行错位、大小穿插，制造视觉节奏感。\n- **留白呼吸** — 文字之间有空隙，不拥挤。\n- **落款署名** — 严禁硬编码他人名字。生成前，**必须通过对话询问用户**：“请问您的海报落款署名要写什么？”；如果用户不便回答，使用通用占位符如 `—— [主理人]`。\n\n**Style Slots (配色/字体风格矩阵)：**\n根据视频话题，自动选择以下 10 套体系之一。详细说明请查阅 [视觉风格参考手册](file://./resources/style_bible.md)。\n\n**Prompt 构建公式：**\n`[Vertical portrait poster, ONLY Chinese typography filling the entire frame. No images...]` + `[配色/字体风格描述]` + `[标题与落款排版]`\n\n*示例 Prompt (科技增长蓝封面)：*\n`Vertical portrait poster, ONLY Chinese typography filling the entire frame. No images, no illustrations, no icons, no decorations. Pure text only. Modern tech aesthetic: deep blue gradient background, white and cyan (#00D7FF) characters. Clean, bold display font. Staggered layout with varying character sizes. Title \"企业做AI千万不要一上来就全员铺工具\" arranged in 3-4 lines with oversized and medium contrast. \"—— [用户指定的IP名]\" as small signature at bottom. High-impact, minimal.`\n\n*封底 (End Card) 格式：*\n排版内容固定为：\"👍 点赞 ⭐ 收藏 \\n 🔔 加关注 \\n\\n 我们下期见！ \\n —— [用户指定的IP名]\"，配色必须与封面保持一致。\n\n生成后，严格命名为 `scene_cover.png` 和 `scene_end.png` 保存至 `assets/` 目录。\n\n**✅ Stage 1（素材）退出标准：**\n\n模式 A：\n- [ ] `assets/` 下场景图片数量 == 剧本分镜数\n- [ ] 场景图片命名符合规范（scene1~N.png）\n\n模式 B：\n- [ ] `assets/` 下每幕对应的 `.mp4` 文件已就位且通过 `ffprobe` 校验\n- [ ] 所有视频为 1080×1920 竖屏、无音轨、时长 ≤ 30s\n- [ ] ⛔ **新鲜度校验**：`download_and_process.py` 中的所有 URL 必须是根据本集剧本主题全新搜索获取的。验证方法：对比 `VIDEO_MAP` 中的 URL 与历史集的 `download_and_process.py`，不得有任何重复 URL。\n\n通用（模式 A 与 B 都必须满足）：\n- [ ] `assets/narration.wav` 已生成且通过 `ffprobe` 校验。\n- [ ] 封面/封底已就位：\n  - 模式 A：`scene_cover.png` 与 `scene_end.png` 已生成。\n  - 模式 B：`index.html` 中包含 `#scene_cover` 和 `#scene_end` 的 DOM 结构（参见 Stage 3 §3.2B 模板），且 GSAP 动画已绑定。\n\n### 1.7 BGM 背景音乐匹配\n\nBGM 是情绪的推手，必须在 Stage 2 之前完成匹配。\n\n**BGM 匹配工作流：**\n1. **情绪识别**：分析剧本中各幕的「情绪档位」，提取核心关键词（如：Suspense, Epic, Minimalist, Melancholic）。\n2. **曲库搜索**：从免版税音乐库（如 Scott Buckley, Pixabay, Bensound）搜索并下载 1 首全局背景音。\n3. **参数配置**：\n   - `data-track-index`: 设为 `-1`（始终位于底层）。\n   - `data-volume`: 默认设为 `0.15` ～ `0.25`（通过 preview 实时调整，严禁盖过旁白）。\n4. **集成到 index.html**：\n   ```html\n   <audio id=\"bgm\" src=\"assets/bgm.mp3\" data-start=\"0\" data-duration=\"{视频总长}\" data-track-index=\"-1\" data-volume=\"0.25\"></audio>\n   ```\n\n**✅ Stage 1.7 退出标准：**\n- [ ] `assets/bgm.mp3` 已就位且通过 `ffprobe` 校验。\n- [ ] ⛔ **BGM 新鲜度校验**：BGM 文件必须是根据本集剧本情绪主题全新搜索并下载的，严禁复用旧集 `bgm.mp3`。\n- [ ] `视频脚本.md` 已补充本集 BGM 署名信息（含作者、曲名、来源链接及 CC 协议）。\n\nFile v1.1.0:resources/stages/stage_2_timeline.md\n\n# Stage 2：音频解析与数据驱动时间轴\n\n### 2.1 获取音频精确时长\n\n```bash\nexport PATH=./bin:$PATH\nffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1 YYYYMMDD/assets/narration.wav\n# 记录输出的 duration=XX.XXXXXX，这是视频总时长的唯一权威数据\n```\n\n### 2.2 获取精确断句时间戳（三级方案，按精度递减选择）\n\n**方案 A — Whisper 词级转录（精度最高，优先推荐）：**\n```bash\nnpx hyperframes transcribe YYYYMMDD/assets/narration.wav\n# 生成 YYYYMMDD/assets/transcript.json，包含词级时间戳\n# 直接按句末时间戳切分场景，误差 < 0.1s\n```\n\n**方案 B — RMS 能量分析 + 字数比例交叉验证（Whisper 不可用时）：**\n```bash\nexport PATH=./bin:$PATH\n# 1. 提取 RMS 能量流\nffmpeg -v error -i YYYYMMDD/assets/narration.wav \\\n  -af astats=metadata=1:reset=1,ametadata=print:key=lavfi.astats.Overall.RMS_level:file=rms.txt \\\n  -f null -\n\n# 2. 用 Python 脚本分析静默段（>= 0.85s 的低能量区间为段间分界）\n# 3. 将 RMS 检测到的分界与「字数比例推算」交叉验证：\n#    - 按各段旁白字数比例分配总时长，得出各段预估 start\n#    - 在预估 start ± 8s 范围内找最近 of RMS 静默段\n#    - 取静默段结束时间作为实际 scene start\n```\n\n> ⚠️ 更多技术细节及排坑规范，请查阅 [技术排坑手册](file://./resources/troubleshooting.md)。\n\n**方案 C — 纯字数比例分配（兜底方案）：**\n```python\n# 当 RMS 分析不可靠时（如 TTS crossfade 过重），直接按字数分配\n# 误差 ±2s，对 10s+ 的场景可接受\nfor scene in scenes:\n    scene.duration = scene.char_count / total_chars * total_audio_duration\n```\n\n### 2.3 将时间戳映射到分镜\n\n根据 2.2 的输出，将每幕的 `data-start` 和 `data-duration` 精确填入剧本或直接生成为 JS 数组：\n\n```js\n// 由音频数据派生，禁止手动估算\nconst scenes = [\n  { id: \"scene1\", start: 0,    duration: 5.8,  subtitle: \"旁白文本...\" },\n  { id: \"scene2\", start: 5.8,  duration: 6.2,  subtitle: \"旁白文本...\" },\n  // ...\n];\n```\n\n**✅ Stage 2 退出标准：**\n- [ ] Whisper `transcript.json` 已生成，或 RMS 分析 + 字数交叉验证已完成，或纯字数比例已计算\n- [ ] 所有分镜的 `start + duration` 之和与音频总时长误差 < 0.5 秒\n- [ ] 标注所使用的方案等级（A/B/C），方便后续迭代时升级\n\nFile v1.1.0:resources/stages/stage_3_static.md\n\n# Stage 3：静态排版构建与验收\n\n### 3.1 创建项目目录\n\n```bash\nmkdir -p YYYYMMDD/assets\n# 初始化 index.html（手动创建，参考下方 HTML 模板）\n```\n\n### 3.2 HTML 基础模板 — 模式 A（强制规范）\n\n> ℹ️ 以下为模式 A（纯图片）的 HTML/CSS 规范。模式 B 请跳转至 §3.2B。\n> 完整参考实现见 `template/index.html` 和 `template/style.css`。以下仅列出关键约束。\n\n**根容器必须包含 4 个 data-* 属性（缺一不可）：**\n```html\n<div id=\"composition\"\n     data-composition-id=\"composition\"\n     data-width=\"1920\"\n     data-height=\"1080\"\n     data-duration=\"{Stage 2.1 获取的音频总时长}\">\n```\n\n**场景 DOM 结构（由 JS 动态生成，严禁硬编码）：**\n```\nscene.clip\n  ├─ img.bg-fill    ← 背景模糊层（object-fit: cover + blur）\n  ├─ img.fg-main    ← 主体图片层\n  └─ div.overlay\n       └─ div.subtitle  ← 字幕（通过 textContent 写入）\n```\n\n**GSAP 铁律：**\n```js\nconst tl = gsap.timeline({ paused: true }); // 永远 paused: true\nwindow.__timelines = window.__timelines || {};\nwindow.__timelines[\"composition\"] = tl; // key 必须与 data-composition-id 一致\n```\n\n**图片引用规范：**\n- 使用 `assets/${id}.png`（如 `assets/scene1.png`），与 scene 数据的 id 字段一致\n\n### 3.3 CSS 布局规范 — 模式 A（强制）\n\n> ℹ️ 完整实现见 `template/style.css`。以下仅列出核心规则。\n\n**`object-fit` 决策树（根据图片画幅选择）：**\n\n| 图片画幅 | fg-main | bg-fill | 效果 |\n|---------|---------|---------|------|\n| 16:9 横版（推荐） | `object-fit: cover` | 不需要 | 完美填充，无黑边 |\n| 非标画幅（正方形等） | `object-fit: contain` | 需要（blur + cover） | 毛玻璃背景填充黑边 |\n\n```css\n/* 背景模糊层（非 16:9 素材时使用） */\n.bg-fill {\n  position: absolute; inset: 0;\n  object-fit: cover;\n  filter: blur(20px) brightness(0.4);\n  transform: scale(1.1); /* 补偿 blur 边缘虚化 */\n}\n\n/* 主体图片层：严禁使用 translate 居中 */\n.fg-main {\n  position: absolute; inset: 0;\n  object-fit: contain; /* 或 cover，见上方决策树 */\n  transform-origin: center center;\n}\n```\n\n### 3.2B HTML 基础模板 — 模式 B（视频 + 文字叠加）\n\n> ℹ️ 以下为模式 B 的 HTML/CSS 规范。仅参考下方模板的 DOM 结构，⛔ 严禁从旧集复制 HTML 文件。\n\n**根容器（竖屏画幅）：**\n```html\n<div id=\"composition\"\n     data-composition-id=\"composition\"\n     data-width=\"1080\"\n     data-height=\"1920\"\n     data-start=\"0\"\n     data-duration=\"{音频总长}\">\n```\n\n**⚠️ 视频标签扁平化铁律（最重要的规则）：**\n\n`<video>` 标签**必须**是 `#composition` 的**直接子元素**。严禁将 `<video data-start=\"...\">` 嵌套在任何带有 `data-start` 的 `<div>` 内部，否则 HyperFrames 渲染器无法管理视频播放，**视频将冻结在第一帧**。\n\n```html\n<!-- ✅ 正确：视频作为舞台的扁平直接子元素 -->\n<video id=\"v-scene1\" class=\"clip bg-video\" src=\"assets/scene1.mp4\" muted playsinline\n       data-start=\"0\" data-duration=\"8\" data-track-index=\"3\"></video>\n<video id=\"v-scene2\" class=\"clip bg-video\" src=\"assets/scene2.mp4\" muted playsinline\n       data-start=\"8\" data-duration=\"10\" data-track-index=\"3\"></video>\n\n<!-- 文字叠加层：独立的场景 div，不含 <video> -->\n<div id=\"scene1\" class=\"clip\"\n     data-start=\"0\" data-duration=\"8\" data-track-index=\"1\"\n     style=\"z-index: 1;\">\n  <div class=\"dim-overlay\"></div>\n  <div class=\"bottom-gradient\"></div>\n  <div class=\"text-layer text-layer--bottom\">\n    <div id=\"s1-line1\" class=\"body-text\">旁白文本</div>\n    <div id=\"s1-line2\" class=\"headline\">冲击<span class=\"accent\">金句</span>。</div>\n  </div>\n</div>\n```\n\n```html\n<!-- ❌ 错误：视频嵌套在带 data-start 的 div 内 → 渲染冻结 -->\n<div id=\"scene1\" class=\"clip\" data-start=\"0\" data-duration=\"8\">\n  <video class=\"bg-video\" src=\"assets/scene1.mp4\" data-start=\"0\" ...></video>\n</div>\n```\n\n**视频标签必备属性清单：**\n\n| 属性 | 说明 |\n|------|------|\n| `id` | 唯一标识，如 `v-scene1`（缺少则渲染冻结） |\n| `class=\"clip bg-video\"` | `clip` 让框架管理可见性，`bg-video` 应用视频样式 |\n| `muted playsinline` | HyperFrames 接管播放，严禁加 `autoplay` 或 `loop` |\n| `data-start` | 视频在时间轴上的起始秒数 |\n| `data-duration` | 视频播放时长 |\n| `data-track-index` | 设为 `3`（与音频轨 0、场景轨 1/2 错开） |\n\n**全局装饰层（模式 B 推荐）：**\n```html\n<div class=\"vignette\"></div>      <!-- 暗角 -->\n<div class=\"noise-overlay\"></div>  <!-- 胶片噪点 -->\n```\n\n### 3.3B CSS 规范 — 模式 B（文字叠加排版）\n\n**核心 CSS 铁律：**\n```css\n.bg-video {\n  position: absolute; inset: 0;\n  width: 100%; height: 100%;\n  object-fit: cover;\n  opacity: 1; /* 👈 必须！覆盖 .clip 的默认 opacity: 0 */\n}\n\n.dim-overlay {\n  position: absolute; inset: 0;\n  background: rgba(0, 0, 0, 0.55); /* 确保文字可读 */\n}\n\n.bottom-gradient {\n  position: absolute; bottom: 0; left: 0; right: 0;\n  height: 600px;\n  background: linear-gradient(to top, rgba(10,10,10,0.95) 0%, transparent 100%);\n  z-index: 1;\n}\n```\n\n**文字叠加组件库：**\n\n| 组件 | CSS 类 | 用途 |\n|------|--------|------|\n| 大标题金句 | `.headline` | 核心冲击句 |\n| 超大数字 | `.headline--huge` | 数据对比 |\n| 正文旁白 | `.body-text` | 常规叙述 |\n| 小字说明 | `.caption-text` | 补充信息 |\n| 强调色 | `.accent` | 关键词高亮 |\n| 不等号卡 | `.neq` + `.text-card` | 「A ≠ B」对比卡片 |\n| 分屏对比 | `.split-compare` | 错误 vs 正确对比 |\n\n**文字定位方式：**\n- `.text-layer--bottom`：底部三分之一（大多数叙述场景）\n- `.text-layer--center`：垂直居中（金句升华、数字冲击）\n\n### 3.3B-2 模式 B 的封面与封底 DOM 结构（⛔ 强制）\n\n模式 B 的视频必须包含纯 HTML/CSS 实现的封面标题幕和封底互动幕。不使用 PNG 图片，而是通过大字排版 + GSAP 动效实现。\n\n```html\n<!-- 封面标题幕：必须是第一个场景 -->\n<div id=\"scene_cover\" class=\"clip\"\n     data-start=\"0\" data-duration=\"{6~8秒}\" data-track-index=\"1\"\n     style=\"z-index: 1;\">\n  <div class=\"scene-content\">\n    <div class=\"text-layer text-layer--center\">\n      <div id=\"cover-sub\" class=\"caption-text\">{副标题}</div>\n      <div id=\"cover-title\" class=\"headline\">{主标题}</div>\n      <div id=\"cover-author\" class=\"caption-text\">—— {署名}</div>\n    </div>\n  </div>\n</div>\n\n<!-- 封底互动幕：必须是最后一个场景 -->\n<div id=\"scene_end\" class=\"clip\"\n     data-start=\"{最后一幕结束时间}\" data-duration=\"{8~10秒}\" data-track-index=\"1\"\n     style=\"z-index: 99;\">\n  <div class=\"scene-content\">\n    <div class=\"text-layer text-layer--center\">\n      <div id=\"end-line1\" class=\"headline\">👍 点赞 ⭐ 收藏</div>\n      <div id=\"end-line2\" class=\"headline\">🔔 加关注</div>\n      <div id=\"end-cta\" class=\"caption-text\">我们下期见！—— {署名}</div>\n    </div>\n  </div>\n</div>\n```\n\n### 3.3B-3 模式 B 的逐字同步字幕（⛔ 强制）\n\n模式 B 的视频**必须**在底部包含与配音同步的逐字滚动字幕。实现步骤：\n\n1. **运行 Whisper 转录**（Stage 2）获取 `transcript.json` 或在 Stage 2 中手动构建断句数据。\n2. **在 `index.html` 中创建字幕轨道容器**：\n   ```html\n   <div id=\"subtitles-track\"\n        style=\"position:absolute; bottom:120px; left:0; right:0; height:140px; z-index:100;\">\n   </div>\n   ```\n3. **在 GSAP 脚本中创建字幕控制器**：解析 `transcript.json` 或内联 `CAPTIONS_DATA` 数组，逐字创建 `<span class=\"caption-word\">` 元素并绑定 GSAP 动画（高亮 color/scale 变化）。严禁使用 `className` 动画绑定，必须直接对 CSS 属性进行补间插值。\n4. **物理防遮挡**：字幕轨道必须与画面大字在纵向上完全隔离。大字使用 `padding-bottom >= 300px` 限制最大高度，字幕使用 `bottom: 120px` 固定在底部，确保两者之间有 ≥ 80px 的空白隔离带。\n\n### 3.4 静态验收（加入动画前的检查）\n\n用浏览器打开 `index.html`，截图确认：\n\n模式 A：\n- [ ] 每张图片完整显示，无裁切，无偏移\n- [ ] 图片在 1920×1080 的黑色背景内居中\n\n模式 B：\n- [ ] 视频背景可见（非黑屏），文字叠加清晰可读\n- [ ] `dim-overlay` 暗化效果适当（文字不被视频干扰）\n- [ ] 全屏文字卡（如「A ≠ B」）显示正确\n- [ ] ⛔ 封面标题幕 `#scene_cover` 存在且内容正确\n- [ ] ⛔ 封底互动幕 `#scene_end` 存在且内容正确\n- [ ] ⛔ 字幕轨道 `#subtitles-track` 存在且位于底部，与大字无纵向重叠\n\n**✅ Stage 3 退出标准：**\n- [ ] 纯静态下所有视觉素材（图片或视频）100% 正确显示\n- [ ] `data-composition-id`、`data-width`、`data-height` 已正确设置\n- [ ] 模式 A：字幕通过 `textContent` 注入；模式 B：文字叠加 DOM 结构完整\n- [ ] ⛔ 封面标题幕 `#scene_cover` 已就位（验证：`grep 'scene_cover' index.html` 返回结果）\n- [ ] ⛔ 封底互动幕 `#scene_end` 已就位（验证：`grep 'scene_end' index.html` 返回结果）\n- [ ] ⛔ 逐字字幕轨道 `#subtitles-track` 已就位（验证：`grep 'subtitles-track' index.html` 返回结果）\n- [ ] `npx hyperframes lint .` 报 **0 error(s)**\n\nFile v1.1.0:resources/stages/stage_4_animation.md\n\n# Stage 4：动画集成与预检发版\n\n### 4.1 加入 GSAP 动画\n\n在静态验收通过后，才可加入动效。可用动画菜单：\n\n| 动效 | 代码模板 | 适用场景 |\n|------|---------|--------|\n| Ken Burns 缩放 | `fromTo(img, {scale:1.0}, {scale:1.06, ease:\"none\"})` | 所有场景默认 |\n| Ken Burns 平移 | `fromTo(img, {x:-20}, {x:0, ease:\"none\"})` | 宽场景横向扫描 |\n| 字幕淡入 | `from(sub, {opacity:0, y:20, duration:0.8, ease:\"power2.out\"})` | 所有场景可选 |\n| 场景交叉淡化 | `to(div, {opacity:0, duration:0.5}, start+duration-0.25)` | 场景过渡 |\n| 光晕脉冲 | `to(glow, {opacity:0.4, repeat:-1, yoyo:true, duration:2})` | 火焰/光源场景 |\n\n### 4.1.1 情绪驱动转场匹配\n\n场景之间的转场不应千篇一律。根据**下一幕的情绪档位**选择对应转场：\n\n| 下一幕情绪档位 | 转场方式 | GSAP 代码 | 视觉效果 |\n|-------------|---------|----------|--------|\n| 1（舒缓叙事） | 慢溶解 | `fromTo(next, {opacity:0}, {opacity:1, duration:1.2, ease:\"power1.inOut\"})` | 平静过渡，如水墨晕染 |\n| 2（紧张蓄力） | 标准交叉淡化 | `fromTo(next, {opacity:0}, {opacity:1, duration:0.5, ease:\"none\"})` | 默认节奏 |\n| 3（高潮爆发） | 硬切 + 微缩放 | `tl.set(next, {opacity:1}); fromTo(next, {scale:1.05}, {scale:1.0, duration:0.3})` | 冲击感 |\n| 4（沉默留白） | 淡入黑 → 淡出黑 | `先 to(prev, {opacity:0, duration:0.8}), 延迟 0.5s, 再 fromTo(next, {opacity:0}, {opacity:1, duration:1.0})` | 呼吸感，给观众消化时间 |\n\n### 4.2 强制预检（渲染前的最后防线）\n\n```bash\nexport PATH=./bin:$PATH\nnpx hyperframes@latest inspect YYYYMMDD/\n```\n\n**✅ Stage 4 退出标准（必须全部满足，才允许执行 render）：**\n- [ ] `inspect` 命令退出码为 0（无报错）\n- [ ] 控制台输出的 `totalDuration` 与 Stage 2.1 测量的音频时长误差 < 0.2 秒\n- [ ] 无任何 `StaticGuard` 警告\n\n### 4.2.1 渲染前集成检查清单（⛔ 全部通过方可执行 render）\n\n在执行 `npx hyperframes render` 之前，必须逐一确认以下事项。**任意一项未通过，严禁渲染。**\n\n| # | 检查项 | 验证方法 |\n|---|--------|---------|\n| 1 | 封面标题幕存在 | `grep 'scene_cover' index.html` 返回结果 |\n| 2 | 封底互动幕存在 | `grep 'scene_end' index.html` 返回结果 |\n| 3 | 逐字同步字幕存在 | `grep 'subtitles-track' index.html` 且 `grep 'caption-word\\|CAPTIONS_DATA' index.html` 返回结果 |\n| 4 | 配音音频就位 | `ffprobe assets/narration.wav` 成功且时长 > 0 |\n| 5 | BGM 就位且为新文件 | `ffprobe assets/bgm.mp3` 成功，且 `视频脚本.md` 中有本集 BGM 署名（含曲名和来源） |\n| 6 | 所有视频素材就位 | `ls assets/scene*.mp4 \\| wc -l` == 剧本分镜数，且每个文件通过 `ffprobe` 校验 |\n| 7 | 素材为本集新下载 | `download_and_process.py` 中 URL 不与任何旧集重复 |\n| 8 | lint 零错误 | `npx hyperframes lint` 报 0 error(s) |\n\n### 4.3 渲染导出\n\n```bash\nexport PATH=./bin:$PATH\n# 强制渲染到项目renders目录下\nnpx hyperframes@latest render YYYYMMDD/ -o YYYYMMDD/renders/promo_video.mp4 --force-new\n```\n\nFile v1.1.0:resources/stages/stage_5_publish.md\n\n# Stage 5：发布与归档\n\n### 5.1 视频脚本元数据与多平台宣发策划补充\n\n在 `视频脚本.md` 中补充技术元数据与 **「小红书/短视频爆款宣发策划」**，确保视频具备出厂即可一键分发的高效爆款能力。\n\n#### 1. 技术参数补充（脚本底部）\n```markdown\n## 技术参数\n- **声纹**：VoxCPM2 用户克隆 / Kokoro am_adam\n- **实测时长**：{ffprobe 实测值}s\n- **BGM**：{BGM 名称} by {BGM 作者} (CC BY 4.0)\n- **YouTube**：{URL}\n```\n\n#### 2. 小红书/短视频宣发策划（脚本最下方）\n在 `视频脚本.md` 的最底部，**强制追加**小红书专属的宣发案策划，包含：\n1. **爆款标题推荐**（至少 3-4 个）：\n   - *写作公式 1 (痛点直击)*：`[痛点表情] + 痛点揭露/反差怪象 + 为什么会这样？`（例如：🤯 职场怪象：为什么招的人越贵，公司反而越慢？）\n   - *写作公式 2 (认知颠覆)*：`[警示表情] + 戳破某种常见幻觉/认知错误！`（例如：🚫 戳破老板的幻觉：个体优秀 ≠ 组织高效！）\n   - *写作公式 3 (具体数字)*：`[下降/冲突表情] + 极端数字对比 + 场景重现`（例如：📉 协同内耗：本来3人能决定的事，为什么变成了13人讨论？）\n2. **封面/配图文字建议**：设计大字冲击的主副标题，做首屏抓手。\n3. **小红书正文文案**：\n   - 使用丰富的 **Emoji** 进行段落排版，提升可读性。\n   - 包含：**痛点共情**（点明现状） + **干货输出**（列出 3 点精辟洞察或引述视频金句） + **互动钩子**（引导评论区分享见解，如“你们公司也是这样吗？”） + **精准热门标签**（如 `#职场那些事儿 #组织架构 #管理思维 #职场内耗`）。\n\n*规范模板示例：*\n```markdown\n## 5. 小红书宣发策划\n\n### 爆款标题推荐\n1. [小红书标题 1]\n2. [小红书标题 2]\n3. [小红书标题 3]\n\n### 封面/配图文字建议\n- **主标题**：[极简有力]\n- **副标题**：[点题/对比]\n\n### 小红书正文文案\n[带有丰富 Emoji、干货条理明晰、包含互动提问和小红书热门 Tag 的 300-500 字社交文案]\n```\n\n### 5.2 README 更新\n\n在 `README.md` 的「演示作品」表格中追加新作品条目（中英文双语部分均需更新）。\n\n### 5.3 Git 归档\n\n**仅 commit，不自动 push。** 推送时机由用户决定。\n\n```bash\ngit add YYYYMMDD/ README.md\ngit commit -m \"feat: Add {video_title} project\"\n# git push 由用户按需执行，不自动推送\n```\n\n**✅ Stage 5 退出标准：**\n- [ ] `视频脚本.md` 包含完整元数据（声纹、时长、BGM、YouTube 链接）以及小红书爆款标题与宣发策划文案\n- [ ] `README.md` 中英双语演示作品表格已更新\n- [ ] `git commit` 成功\n\nFile v1.1.0:resources/style_bible.md\n\n# 🎨 视觉风格指南 (FableForge Visual Style Bible)\n\n本指南是 FableForge 视频生成流水线的官方视觉规范，提供各题材、文化背景下的生图公式与排除规则，确保 AI 生成图像的风格自洽和文化准确度。\n\n---\n\n## 1. 风格决策原则\n\n- **动态适配**：视觉风格必须完全服务于故事。可选国风写意、现代极简、蒸汽朋克、赛博朋克或电影感实拍风格。\n- **自洽性**：全片所有图片的色调、光影和元素必须统一，严禁跨时空混搭（除非剧情要求）。\n- **文化锚点优先于美感**：当「好看」和「文化准确」冲突时，选文化准确。一张唐代故事里出现的日式庭院，再好看也是错误。\n\n---\n\n## 2. 常见文化与体裁锚点速查表\n\n| 文化/体裁设定 | 场景/建筑关键词 | 元素/服饰关键词 | 常见误导（必须排除） |\n|-------------|---------------|---------------|-------------------|\n| **现代商务 (Analytical)** | Modern glass office, boardroom, high-rise, minimalist workspace | Business suit, smart casual, laptop, abstract charts | 奇幻元素, 杂乱背景, 古代物品 |\n| **极简数据 (Analytical)** | Abstract data visualization, glowing nodes, dark background | Neon lines, geometric shapes, HUD elements | 具体人物, 复杂实景建筑 |\n| 唐宋中国 (Narrative)| Dougong brackets, grey tiles, wooden beams, moon gate | Round-collar robe, Hanfu, Mingguang armor | 鸟居, 和服, 榻榻米, 哥特尖拱 |\n| 明清中国 (Narrative)| Upturned eaves, red lacquer columns, courtyard houses | Changshan, Qipao, Mandarin collar | 和服, 韩服, 维多利亚裙 |\n| 日本和风 (Narrative)| Torii gate, tatami, shoji screens, engawa | Kimono, hakama, geta sandals | 斗拱, 汉服, 旗袍 |\n| 中世纪欧洲 (Narrative)| Gothic arches, stone castle, stained glass | Chainmail, surcoat, leather boots | 东方建筑, 丝绸长袍 |\n| 赛博朋克 (Narrative)| Neon signs, holographic ads, megastructures | LED-trimmed jacket, visor, cybernetic limbs | 古典建筑, 自然光 |\n\n---\n\n## 3. 图片提示词工程\n\n- **公式**：`[画幅指令] + [文化锚点] + [本幕内容] + [色调光影] + [质量后缀] + [排除清单]`\n- **质量后缀**：`hyper-realistic details, cinematic lighting, masterpiece, 8K`\n- **排除清单格式**：`No [culture A] elements, no [culture B] elements, no modern objects.`\n- **中文文字生成**（架构图/概念图专用）：`A [style] visualization with Chinese labels. Main node: \"核心词\". Sub-nodes: \"关联词1\", \"关联词2\". Professional design, glowing connections.`\n\n---\n\n## 4. 风格圣经模板示例\n\n### 4.1 古代中国唐代水墨风提示词\n```\nCinematic vertical shot, 9:16 aspect ratio. Ancient Chinese Tang Dynasty style.\nA young monk in grey round-collar robes holds a bronze oil lamp in a temple courtyard\nwith Dougong bracket architecture and grey tile roofing.\nInk-wash atmosphere, warm golden lamplight against dark shadows, subtle rice-paper texture.\nhyper-realistic details, cinematic lighting, 8K.\nNo Japanese elements, no Western elements, no modern objects.\n```\n\nFile v1.1.0:resources/template/script-template.md\n\n# FableForge — Storyboard Script Template\n\n## Project Info\n\n- **Topic**: (Management / leadership concept, e.g.: Zero-sum game, Principal-Agent problem)\n- **Target Duration**: 60 seconds\n- **Scene Count**: (Fill in, recommended 8–12)\n- **Narration Tone**: (Calm storytelling / Dramatic tension / Warm reflection)\n\n---\n\n## Allegory Story\n\n(Paste the full allegory story here for narration reference)\n\n---\n\n## Scene-by-Scene Storyboard\n\n> **Spec Constraints:**\n> - Narration per scene: 30–60 words\n> - Scene duration: 5–8 seconds (finalized from audio measurement)\n> - Image naming: `scene{N}.png` — strictly 1:1 with scene number\n> - Emotional gear must be tagged for each scene\n\n---\n\n### Scene 1 — [Scene Name]\n\n- **Time (draft estimate)**: 0 ~ 6 seconds\n- **Emotional Gear**: 1 (Slow Narration — opening, world-building)\n- **Narration**: (30–60 word narration text)\n- **Visual Description**: (English image generation prompt — include style, subject, lighting, mood)\n- **Voice Pacing Note**: (Any `…` pause markers needed?)\n\n---\n\n### Scene 2 — [Scene Name]\n\n- **Time (draft estimate)**: 6 ~ 12 seconds\n- **Emotional Gear**: 1\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 3 — [Scene Name]\n\n- **Time (draft estimate)**: 12 ~ 18 seconds\n- **Emotional Gear**: 2 (Building Tension — conflict starts)\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 4 — [Scene Name]\n\n- **Time (draft estimate)**: 18 ~ 24 seconds\n- **Emotional Gear**: 2\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 5 — [Scene Name]\n\n- **Time (draft estimate)**: 24 ~ 31 seconds\n- **Emotional Gear**: 2\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 6 — [Scene Name]\n\n- **Time (draft estimate)**: 31 ~ 38 seconds\n- **Emotional Gear**: 3 (Peak Intensity — key turning point)\n- **Narration**: (Narration text — should be shorter)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 7 — [Scene Name]\n\n- **Time (draft estimate)**: 38 ~ 44 seconds\n- **Emotional Gear**: 3\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 8 — [Scene Name]\n\n- **Time (draft estimate)**: 44 ~ 50 seconds\n- **Emotional Gear**: 4 (Silence & Space — pause before conclusion)\n- **Narration**: (≤ 15 words — let the weight sink in)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**: Add `…` between every phrase\n\n---\n\n### Scene 9 — [Scene Name]\n\n- **Time (draft estimate)**: 50 ~ 56 seconds\n- **Emotional Gear**: 4 → 1 (Resolution landing)\n- **Narration**: (≤ 20 words — fewest words, biggest insight)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n(Copy the format above to add more scenes if needed)\n\n---\n\n## Full Narration (Combined)\n\n(Concatenate all scene narrations in order — paste directly into `generate.py` as `TARGET_TEXT`)\n\n```\nScene 1: [narration]\n\n||| Scene 2: [narration]\n\n||| ...\n```\n\n---\n\n## Publishing Metadata\n\n### Title Options\n1. (Option 1)\n2. (Option 2)\n3. (Option 3)\n\n### Cover Tagline\n(One punchy line, ≤ 15 words)\n\n### Tags / Topics\n(Keywords for social platforms, e.g.: leadership, management, fable, AI-video)\n\nFile v1.1.0:resources/template/视频脚本.md\n\n# 视频脚本模板\n\n## 基本信息\n\n- **主题**：（填写管理学/领导力概念，例：零和博弈、委托代理问题）\n- **视频时长目标**：60 秒\n- **分镜数量**：（填写幕数，建议 8～12）\n- **配音风格**：（沉稳叙事 / 紧张戏剧 / 温和启发）\n\n---\n\n## 寓言故事\n\n（在此处填写完整的寓言故事，供旁白参考）\n\n---\n\n## 分镜头剧本\n\n> 规格约束：\n> - 每幕旁白 30～60 字\n> - 每幕时长 5～8 秒（以音频实测为准）\n> - 图片命名：`scene{N}.png`，与幕序号严格一一对应\n\n---\n\n### 分镜 1 — 【幕名】\n\n- **时间（草稿估算）**：第 0 ～ 6 秒\n- **旁白**：（30～60字的旁白文本）\n- **画面描述**：（英文 AI 绘图提示词，需包含画风、主体、光影、氛围）\n\n---\n\n### 分镜 2 — 【幕名】\n\n- **时间（草稿估算）**：第 6 ～ 12 秒\n- **旁白**：（旁白文本）\n- **画面描述**：（提示词）\n\n---\n\n### 分镜 3 — 【幕名】\n\n- **时间（草稿估算）**：第 12 ～ 18 秒\n- **旁白**：（旁白文本）\n- **画面描述**：（提示词）\n\n---\n\n（复制上方格式，按需添加至 scene{N}）\n\n---\n\n## 完整旁白合并文本\n\n（将以上所有分镜旁白按顺序合并，直接用于 TTS 生成）\n\n---\n\n## 标题建议（用于发布）\n\n1. （标题方案 1）\n2. （标题方案 2）\n3. （标题方案 3）\n\n## 推荐封面文案\n\n（一句话点睛，20 字以内）\n\nArchive v1.0.0: 16 files, 42599 bytes\n\nFiles: resources/stages/stage_0_env.md (1825b), resources/stages/stage_1_creatives.md (11659b), resources/stages/stage_2_timeline.md (2454b), resources/stages/stage_3_static.md (6651b), resources/stages/stage_4_animation.md (2153b), resources/stages/stage_5_publish.md (2798b), resources/style_bible.md (3137b), resources/template/index.html (3859b), resources/template/script-template.md (3443b), resources/template/style.css (2519b), resources/template/视频脚本.md (1462b), resources/troubleshooting.md (2383b), resources/voice-model/README.md (2287b), SKILL.en.md (18934b), SKILL.md (14576b), _meta.json (129b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: ai-video-studio\ndescription: FableForge 通用视频生成流水线 SOP。支持两种生产模式（图片流、视频 B-roll 流）和三种体裁（叙事寓言、商业分析、产品宣发）。包含从概念生成、剧本创作、TTS 配音、素材采集、到 HyperFrames 视频渲染的完整工业化 SOP，以及视觉风格指南与技术陷阱手册。\n---\n\n# 🔨 FableForge · 视频生成工业流水线 AI Agent SOP\n\n本 Skill 是一份**命令级可执行 SOP**，而非经验教训集。每个 Stage 均包含**具体执行命令**和**退出验收标准**，严禁跳步或在退出标准未满足时进入下一阶段。\n\n---\n\n## 0. 视频规格与体裁定义（内容优先定档制）\n\n**核心原则：内容的可理解性永远优先于时长限制。**\n\n视频时长不是预设的固定值，而是由内容倒推得出的。错误的做法是「先定 60 秒，然后把内容往里塞」；正确的做法是「先确认内容讲完需要多少字，再据此选档」。\n\n### 0.0 视频体裁系统 (Genre)\n\n本流水线支持三种核心体裁。在构思内容前，**必须首先确定体裁**：\n\n| 体裁 (Genre) | 特征与核心要求 | 适用场景 | 常用视觉模式 |\n|-------------|-----------|---------|---------|\n| **Genre X: 叙事/隐喻 (Narrative)** | 有角色、有冲突。旁白重感受轻动作，追求悬念与结局升华。 | 寓言故事、历史重现、管理隐喻 | + 模式 A (图片) |\n| **Genre Y: 分析/科普 (Analytical)** | 论点驱动、逻辑递进。追求清晰的结构拆解和痛点直击。 | 商业分析、职场洞察、技术科普 | + 模式 B (B-roll) |\n| **Genre Z: 宣发/展示 (Promotional)**| 产品中心、利益点明确。强节奏感与转化引导 (CTA)。 | 产品宣发、网站转视频、功能展示 | 混合模式 |\n\n### 0.1 三档体系\n\n| 档位 | 适用场景 | 旁白总字数 | 预估时长 | 分镜数 |\n|------|---------|-----------|---------|-------|\n| S · 短片 | 单一概念解释、痛点直击、高密度短平快 | 150～450 字 | 45～120 秒 | 1+5~12+1 |\n| M · 标准 | 完整叙事、多维度拆解、深度论证 | 450～900 字 | 120～270 秒 | 1+12~20+1 |\n| L · 长篇 | 复杂案例剖析、连续剧集 | 900～1500 字 | 270～420 秒 | 1+20~30+1 |\n\n> 超过 1500 字的内容必须拆成上下集（每集独立成片，各自包含封面和结尾）。\n\n### 0.2 定档公式\n\n```\n旁白总字数 = 原始故事中【不可删减要素】的合计字数（见 0.3）\n预估时长(秒) = 旁白总字数 ÷ 3.5（中文语速）\n根据预估时长选择对应档位\n```\n\n### 0.3 不可删减要素（内容完整性红线）\n\n不同体裁有不同的不可删减要素。如果被删除，观众将无法理解视频的核心价值。**剧本转化阶段（Stage 1.2）严禁删除这些要素：**\n\n| 体裁 (Genre) | 核心不可删减要素 | 删除后果 |\n|-------------|----------------|----------|\n| **Narrative (叙事类)** | 因果链、角色动机、关键对话、认知翻转事件、结局因果闭环 | 观众不知道“为什么”，悬念消失，结论像硬塞的 |\n| **Analytical (分析类)**| 痛点现象描述、核心矛盾拆解、数据对比/逻辑支撑、金句结论 | 视频变成空洞的说教，缺乏说服力 |\n| **Promotional(宣发类)**| 目标受众痛点、核心利益点 (Benefit)、差异化价值、明确的 CTA | 看完后不知道自己能得到什么，无法转化 |\n\n**可以精简的要素：**\n- 重复的环境描写或冗长的数据罗列（保留首次，后续可省略）\n- 纯装饰性的形容词堆叠\n- 不影响主线的次要信息\n- 已被画面传达的信息（如「山很高」——画面已经表达了）\n\n### 0.4 通用规格（所有档位共享）\n\n| 规格项 | 标准值 | 说明 |\n|--------|--------|------|\n| 每幕旁白字数 | 中文 30～80 字 / 英文 20～50 词 | 中文约 3.5 字/秒，英文约 2.5 词/秒 |\n| 每幕预估时长 | 5 ～ 15 秒 | 最终以音频实测为准 |\n| 分镜编号格式 | `scene_cover`, `scene1`~`scene{N}`, `scene_end` | 与 `assets/` 下的图片名严格一一对应 |\n| 旁白与分镜对应 | 1 幕 == 1 张图 == 1 段旁白 | 封面通常对应标题旁白，结尾对应金句旁白 |\n\n---\n\n## 0.5 质量门禁（三重内容验收）\n\n视频质量的上限由三个核心因素决定。**每一重门禁未通过，不得进入下一阶段。**\n\n### 门禁一：概念与大纲验收（概念生成后、停机确认前执行）\n\nAI 容易生成\"结构正确但洞察平庸\"的内容。在向用户展示前，必须根据体裁完成自检：\n\n**强制自检（全部通过方可提交用户确认）：**\n- [ ] **反常识测试 (通用)**：这个洞察/角度是\"大家都知道\"还是\"大家都经历但从没被命名\"的？前者没传播价值，重写。\n- [ ] **Genre X (叙事) 专属**：结局是否让人感到轻微不适或醍醐灌顶？隐喻是否太直白（能在前10秒猜到结局）？\n- [ ] **Genre Y (分析) 专属**：逻辑链条是否严密？是否提出了具有实操性的认知升华？\n- [ ] **现实锚定测试 (通用)**：结尾的解释/结论，是否映射到了用户**今天就可能遭遇**的具体场景？\n\n---\n\n### 门禁二：脚本节奏验收（剧本转化后执行）\n\n脚本是情绪与逻辑的乐谱。全片节奏必须有起伏，禁止平铺直叙。\n\n**体裁节奏铁律：**\n\n- **Genre X (叙事类) — 情绪驱动**：\n  - **写感受，不写动作**。旁白描述情绪状态，而不是画面动作（❌ `\"十只狼排成一列\"` → ✅ `\"山谷里没有声音，只有风\"`）。\n  - **采用 1-4 情绪档位系统**（1舒缓/2蓄力/3爆发/4留白），并在剧本中标注。\n- **Genre Y (分析类) — 逻辑驱动**：\n  - **结构清晰**：必须遵循“现象引入 → 核心矛盾 → 数据/逻辑支撑 → 升华结论”的节奏。\n  - **金句前置或垫后**：关键论点必须短小精悍。\n- **所有体裁通用**：\n  - **结论幕字数减半**：最后一幕旁白不超过 20 字。越重要的道理，越要用更少的字。\n  - **剧本格式补充档位字段**：每幕必须标注 `- **情绪/节奏档位**：{X}`，指导配音语气与画面。\n\n---\n\n### 门禁三：图片质量验收（图片生成后、进入 Stage 2 前执行）\n\n**构图与画幅规范（强制）：**\n- **画幅固定**：必须生成 **9:16 竖屏**图片（DALL-E 3 使用 `1024x1792`）。严禁使用横屏图片。\n- **主体位置**：主体人物/物件必须在画面**上方 1/3** 区域，底部留给字幕区。\n- **提示词必加**：`cinematic vertical shot, 9:16 aspect ratio, subject positioned in upper third of frame, dark atmospheric space at bottom`\n- **全片一致性**：主光源方向统一，保持跨幕视觉连贯。\n\n**风格圣经与一致性工作流（强制）：**\n为了保证多幕生图的视觉一致性，在生成任何图片之前，必须先根据体裁和设定定义一套「风格圣经」作为所有提示词的前缀，并为主要角色建立角色特征词组。\n\n详细的风格圣经编写步骤、提示词工程公式以及角色一致性锚定工作流，请务必直接阅读 [🎨 视觉风格参考手册](file://./resources/style_bible.md)。\n\n**逐张自检：**\n- [ ] **封面图 (scene_cover)**：视觉冲击力极强，具备悬念感，能瞬间抓住注意力。\n- [ ] **结尾图 (scene_end)**：意境深远，具备“神性”或“哲学感”，完美呼应主题并实现情感/认知升华。\n- [ ] 主体在画面上 1/3，底部有足够深色安全区供字幕叠加\n- [ ] 图片情绪与该幕的「情绪档位」匹配（档位 3 的图不能是平静场景）\n- [ ] 全片光影/色调风格一致\n- [ ] 无明显 AI 瑕疵（多余手指、文字乱码、比例失调等）\n\n---\n\n## 0.6 生产模式决策（内容定型后执行）\n\nFableForge 支持两种生产模式。**在用户确认内容方向后、动手写剧本之前**，必须先确定生产模式。\n\n### 两种模式概览\n\n| 维度 | 模式 A：纯图片 | 模式 B：视频 + 文字叠加 |\n|------|-------------|----------------------|\n| **适用题材** | 寓言故事、有角色弧线的隐喻 | 职场分析、管理洞察、观点输出 |\n| **画幅** | 16:9 横屏（1920×1080） | 9:16 竖屏（1080×1920） |\n| **视觉素材** | AI 生成的场景图片 | Pexels/Pixabay 免费 B-roll 视频 |\n| **文字呈现** | 底部字幕条 | 全屏文字叠加排版（暗化遮罩 + 大字） |\n| **叙事结构** | 角色驱动的故事弧线 | 论点驱动的拆解/金句输出 |\n| **产出节奏** | 较慢（等图片生成 + 风格校准） | 较慢（等图片生成 + 风格校准） |\n\n### 快速决策表\n\n| 判断条件 | 选择 |\n|---------|------|\n| 有具体角色名字和对话（僧人、狼王、船夫……） | 模式 A |\n| 叙事主语是「我」「你」「我们」「很多公司」 | 模式 B |\n| 需要展示隐喻（灯 → 认知、桥 → 管理） | 模式 A |\n| 需要展示数据对比（3 → 13）、金句输出 | 模式 B |\n| 用户明确说\"拍成视频\" / \"竖版\" / \"短视频\" | 模式 B |\n| 用户明确说\"写个寓言\" / \"讲个故事\" | 模式 A |\n\n> ⚠️ 用户可在停机确认时手动覆盖 AI 的模式推荐。模式确定后写入 `视频脚本.md` 头部的「内容定档」章节。\n\n### 模式选定后的流程分叉\n\n- **模式 A**：走 §1.5A（图片素材生成）→ §3.2（横屏 HTML 模板）→ 正常流程\n- **模式 B**：走 §1.5B（视频 B-roll 采集）→ §3.2B（竖屏 HTML + 文字叠加模板）→ 正常流程\n- 其余阶段（概念、剧本、TTS、BGM、音频解析、动画、渲染、发布）两种模式共享。\n\n---\n\n## 视频生产核心流水线 (Stages)\n\n为确保 AI 执行各阶段时的高精准度与低上下文占用，制片厂流水线已全面重构为模块化架构。**当您执行某一个特定阶段时，请直接调阅并遵循该阶段对应的子 SOP 指南**：\n\n### 🛠️ [Stage 0: 自动化环境部署 (Scaffolding)](file://./resources/stages/stage_0_env.md)\n*   **用途**：首次运行或初始化项目环境时执行。\n*   **动作**：部署模板、检测并下载静态 `ffmpeg` / `ffprobe` 环境、构建 VoxCPM2 隔离 Python 环境。\n*   **核心指南**：[阅读 Stage 0 SOP](file://./resources/stages/stage_0_env.md)\n\n### ✍️ [Stage 1：概念、剧本与物料生成](file://./resources/stages/stage_1_creatives.md)\n*   **用途**：创意策划与声画素材（文字海报、B-roll、配音与BGM）准备。\n*   **动作**：根据 Genre 生成大纲并在停机确认后进行内容定档与剧本拆解，运行声纹克隆脚本，使用图片 API 或自动化下载裁剪 B-roll，并强制生成纯文字封面/封底海报。\n*   **核心指南**：[阅读 Stage 1 SOP](file://./resources/stages/stage_1_creatives.md)\n\n### ⏱️ [Stage 2：音频解析与数据驱动时间轴](file://./resources/stages/stage_2_timeline.md)\n*   **用途**：解析配音，进行像素级音视频时间戳对齐。\n*   **动作**：通过 `ffprobe` 获取音频绝对时长，使用 Whisper (A方案) / RMS 能量分析 (B方案) 获得精确断句，映射生成 `data-start` 时间轴。\n*   **核心指南**：[阅读 Stage 2 SOP](file://./resources/stages/stage_2_timeline.md)\n\n### 📐 [Stage 3：静态排版构建与验收](file://./resources/stages/stage_3_static.md)\n*   **用途**：横版/竖屏 HTML 与 CSS 样式搭建。\n*   **动作**：搭建 `#composition` DOM 骨架。模式 B 下严格执行视频标签扁平化，配置组件库（`.headline`, `.neq` 等），确保静态显示 100% 正确并通运 `lint` 校验。\n*   **核心指南**：[阅读 Stage 3 SOP](file://./resources/stages/stage_3_static.md)\n\n### 🎬 [Stage 4：动画集成与预检发版](file://./resources/stages/stage_4_animation.md)\n*   **用途**：GSAP 动画渲染与 MP4 导出。\n*   **动作**：集成 Ken Burns 等情绪转场动画，运行 `inspect` 实施最终质量门禁，使用 `render` 导出 MP4 视频。\n*   **核心指南**：[阅读 Stage 4 SOP](file://./resources/stages/stage_4_animation.md)\n\n### 📦 [Stage 5：发布与归档](file://./resources/stages/stage_5_publish.md)\n*   **用途**：补充宣发策划，作品归档。\n*   **动作**：自动补充脚本元数据，**强制追加小红书爆款宣发案**（标题、大字封面文案及 Emoji 社交文案），更新 README 并在本地进行 Git 提交。\n*   **核心指南**：[阅读 Stage 5 SOP](file://./resources/stages/stage_5_publish.md)\n\n---\n\n## 附录：核心指南与排坑规范\n\n为了保持核心 SOP 的精炼度，以下核心手册与技术参考已存为独立的资源文件，Agent 在执行时可按需读取：\n\n- **🎨 视觉风格参考手册**：提供详细风格词典、提示词公式及文化锚点，请查阅 [视觉风格参考手册](file://./resources/style_bible.md)。\n- **🐛 技术陷阱与排坑规范**：汇总图片裁切、视频冻结、音轨对齐等已知 Bug 解决方案，请查阅 [技术排坑手册](file://./resources/troubleshooting.md)。\n\n### 附录 C：项目归档规范结构\n\n**模式 A（纯图片叙事视频）：**\n```text\n/YYYYMMDD/\n  ├── index.html          (核心时间轴，Stage 3/4 产物)\n  ├── assets/\n  │   ├── scene_cover.png (封面图，纯文字海报)\n  │   ├── scene1.png ~ sceneN.png\n  │   ├── scene_end.png   (结尾图，纯文字海报)\n  │   ├── narration.wav   (TTS 配音)\n  │   ├── bgm.mp3         (背景配乐，Stage 1.7 产物)\n  │   └── transcript.json (Whisper 时间戳，Stage 2.2 产物)\n  ├── 视频脚本.md          (剧本，Stage 1.2 产物)\n  └── promo_video.mp4     (最终成品，Stage 4.3 产物，Git 豁免名单)\n```\n\n**模式 B（视频 B-roll + 文字叠加）：**\n```text\n/YYYYMMDD_{project_name}/\n  ├── index.html               (核心时间轴，竖屏 1080×1920)\n  ├── style.css                (独立样式表，文字叠加组件库)\n  ├── download_and_process.py   (B-roll 自动化下载/裁剪脚本)\n  ├── assets/\n  │   ├── scene1.mp4 ~ sceneN.mp4  (裁剪后的 B-roll 视频，1080×1920，无音轨)\n  │   ├── narration.wav            (TTS 配音)\n  │   └── bgm.mp3                  (背景音乐)\n  ├── 视频脚本.md                   (剧本 + B-roll 素材规划表)\n  └── renders/\n      └── {project}_YYYY-MM-DD_HH-MM-SS.mp4  (渲染成品)\n```\n\nFile v1.0.0:resources/voice-model/README.md\n\n# 声音样本录制指南\n\n## 为什么需要录制声音样本？\n\n本项目使用 **VoxCPM2** 声纹克隆模型。它的工作原理是：\n1. 你提供一段 **15 秒**的自己的声音\n2. 模型学习你的**音色、语调、情感特征**\n3. 之后，模型就能用**你的声音**朗读任何文字\n\n效果就像你亲自配音，但实际上是 AI 在模拟你。\n\n---\n\n## 录音要求\n\n| 项目 | 标准 |\n|------|------|\n| 时长 | **15 秒**（过短效果差，过长会截断） |\n| 格式 | WAV（不要 MP3，会丢失音质） |\n| 采样率 | 44100 Hz 或以上 |\n| 语速 | 正常语速，不要刻意放慢 |\n| 内容 | 朗读下方指定文本（必须与 `PROMPT_TEXT` 一致） |\n\n---\n\n## 推荐朗读文本\n\n将下方文字复制到 `generate.py` 的 `PROMPT_TEXT` 参数，并**朗读同样的内容**：\n\n```\n大家好，我在录制自己的声音样本。这段录音将作为我的声纹模板，\n帮助 AI 精确还原我的音色和情感。现在是[你的名字]，感谢收听。\n```\n\n你也可以自定义这段文字，但要确保录音内容和 `PROMPT_TEXT` **完全一致**。\n\n---\n\n## 录音步骤（Mac）\n\n### 方法 A：使用 QuickTime（最简单）\n\n1. 打开 QuickTime Player\n2. 菜单栏 → 文件 → 新建音频录制\n3. 点击录制按钮，朗读文本，停止\n4. 导出 → 音频 → 保存为 WAV\n\n### 方法 B：使用 Audacity（质量更好）\n\n```bash\n# 安装 Audacity\nbrew install --cask audacity\n```\n\n1. 选择麦克风（推荐有线耳机）\n2. 点击录制，朗读文本\n3. 导出为 WAV，采样率 44100\n\n---\n\n## 保存路径\n\n录音完成后，将文件保存为：\n```\nvoice-model/01_samples/my_voice.wav\n```\n\n> ⚠️ **隐私提示**：此文件包含你的声纹信息，`.gitignore` 已自动排除 `01_samples/` 目录，不会被提交到 GitHub。\n\n---\n\n## 录音质量检验\n\n一个好的声音样本应该：\n- [ ] 没有明显的背景噪音（空调声、键盘声等）\n- [ ] 没有爆音（P、B 音爆声）\n- [ ] 没有回声（不要在浴室或空旷房间录制）\n- [ ] 语速自然，情感投入（不要像机器人一样朗读）\n\n---\n\n下一步：参考 [README.md 阶段一第 4 步](../README.md#阶段一录制你的声音首次必做一劳永逸) 运行 `generate.py` 测试效果。\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn70kae1g9r73x5v5vn83saj7h86yevd\",\n  \"slug\": \"fableforge\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1779090553014\n}\n\nFile v1.0.0:resources/stages/stage_0_env.md\n\n# Stage 0: 自动化环境部署 (Scaffolding)\n\n当用户在一个空文件夹中首次要求“初始化项目”或“初始化 FableForge”时，**必须且仅需执行一次**本阶段。如果你发现当前目录已经有了 `template/` 和 `bin/`，则说明已初始化过，请直接跳过。\n\n**0.1 复制模板与模型资源**\nFableForge 的项目模板与语音模型代码已打包在 Skill 目录中。请执行以下命令：\n\n```bash\n# 复制 HTML 模板与脚本模板\ncp -r .agents/skills/fableforge/resources/template ./template\n\n# 复制语音模型脚手架\ncp -r .agents/skills/fableforge/resources/voice-model ./voice-model\n```\n\n**0.2 自动下载 FFmpeg 环境**\n本流水线强烈依赖 `ffmpeg` 与 `ffprobe`。请自动为用户下载静态构建版：\n\n```bash\ncurl -L https://evermeet.cx/ffmpeg/get/zip -o ffmpeg.zip && unzip -o ffmpeg.zip\ncurl -L https://evermeet.cx/ffmpeg/get/ffprobe/zip -o ffprobe.zip && unzip -o ffprobe.zip\nmkdir -p bin && mv ffmpeg bin/ && mv ffprobe bin/ && chmod +x bin/*\nrm ffmpeg.zip ffprobe.zip\n```\n\n**0.3 自动配置 VoxCPM2 Python 环境**\n执行以下命令为用户的语音克隆模型创建隔离环境并安装依赖：\n\n```bash\npython3 -m venv voice-model/venv\nsource voice-model/venv/bin/activate\npip install voxcpm soundfile torch numpy\n```\n\n**0.4 引导用户录制声纹样本**\n执行完毕后，请暂停并提示用户：\n> \"FableForge 环境已初始化完毕！请您用手机或电脑录制一段 15 秒的声音（朗读任意文本），将其导出为 `.wav` 格式，并放置在 `voice-model/01_samples/my_voice.wav`。准备好后请告诉我，我们就可以开始做视频了！\"\n\n**✅ Stage 0 退出标准：**\n- [ ] 当前工作区包含 `template/`、`voice-model/` 和 `bin/` 目录。\n- [ ] 用户确认已准备好声纹样本。\n\nFile v1.0.0:resources/stages/stage_1_creatives.md\n\n# Stage 1：概念、剧本与物料生成\n\n### 1.1 概念与大纲生成（须停机等待用户确认）\n\n根据确定的体裁 (Genre)，使用对应的提示词框架生成内容大纲：\n\n**对于 Genre X (叙事类)：**\n> \"请你从[指定领域]里，选择一个深度的概念。然后写一个寓言/历史故事，用间接的方式把这个概念讲清楚。不要一开始就说答案，到故事快结束时反转。最后解释概念及隐喻。\"\n\n**对于 Genre Y (分析类)：**\n> \"请你从[指定领域]里，挖掘一个反直觉的痛点现象。先描绘这个现象，然后拆解背后的核心矛盾/系统性崩溃原因，最后给出具有实操性的商业洞察或管理金句。\"\n\n**对于 Genre Z (宣发类)：**\n> \"请根据[产品/功能描述]，提取最核心的用户痛点和利益点，以短视频节奏输出一段极具转化率的宣发文案框架（痛点直击 -> 价值展示 -> CTA）。\"\n\n**去重检查**：生成前扫描工作空间内所有 `YYYYMMDD/视频脚本.md`，确保主题不与历史作品重复。\n\n⛔ **此步完成后必须停机，将生成的大纲/故事完整展示给用户，等待明确确认。未经确认严禁继续。**\n\n### 1.2 内容定档（用户确认大纲后立即执行）\n\n在动手写剧本之前，必须先完成内容定档。这是防止「好内容变烂视频」的关键步骤。\n\n**步骤：**\n\n1. **标记不可删减要素**：逐段扫描用户确认的内容大纲，用以下标签标记（见 0.3）：\n   - `[因果/逻辑]` — 逻辑链节点\n   - `[转折/对比]` — 认知翻转或数据对比\n   - `[核心金句]` — 结论闭环\n\n2. **计算最低旁白字数**：将所有标记要素的文本合适，得出「不可压缩下限」。\n\n3. **选档**：根据合计字数，在 §0.1 三档体系中选择对应档位。\n\n4. **输出定档报告**（写入 `视频脚本.md` 头部）：\n   ```markdown\n   ## 内容定档\n   - **原始内容字数**：{X} 字\n   - **不可删减要素字数**：{Y} 字\n   - **选定档位**：{S/M/L}\n   - **预估旁白总字数**：{Z} 字\n   - **预估视频时长**：{Z ÷ 3.5} 秒\n   ```\n\n⛔ **如果不可删减要素字数 > 450（S 档上限），严禁使用 S 档强行压缩。必须升档。**\n\n### 1.3 剧本转化\n\n将内容按选定档位的规格拆解为分镜剧本，写入 `YYYYMMDD/视频脚本.md`。\n\n**内容完整性自检（剧本写完后必须执行，全部通过才能进入下一步）：**\n\n- [ ] **盲测**：让一个没读过原文的人只看剧本旁白，能否独立理解核心价值（故事结局/分析结论）？如果不能，说明删多了。\n- [ ] **因果/逻辑链完整**：每个「结论」都有对应的「事件/数据」作为铺垫，没有凭空冒出的道理。\n- [ ] **Genre X 专属**：角色有动作有对话，不能只靠旁白概括。\n- [ ] **Genre Y 专属**：痛点现象的铺垫是否足以推导出最终的解决方案和金句？\n\n剧本格式模板：\n```markdown\n## 分镜 scene_cover — 封面/标题幕\n- **情绪档位**：1\n- **旁白**：{通常为视频标题或引导句}\n- **画面描述**：{高吸引力、悬念感强的提示词}\n\n## 分镜 {N} — {幕名}\n- **时间（草稿估算）**：第 {X} ～ {Y} 秒\n- **情绪档位**：{1/2/3/4}\n- **旁白**：{中文30~80字}\n- **画面描述**：{图片提示词，中英文均可}\n\n## 分镜 scene_end — 结尾/升华幕\n- **情绪档位**：4\n- **旁白**：{点题金句，不超过 20 字}\n- **画面描述**：{意境深远、呼应主题的提示词}\n```\n\n### 1.4 TTS 语音生成\n\n**声纹选择（优先意识）：**\n- **默认原则**：优先检查 `/语音模型/voxenv` 环境。若存在，**必须**使用用户的声纹克隆生成旁白。\n- **降级方案**：仅在用户明确要求或克隆环境不可用时，才使用 Kokoro 等通用模型。\n\n**语音节奏优化：**\n\nVoxCPM2 的情绪输出相对平稳，需要在文本层面手动注入戏剧感。处理规则：\n\n- 在核心关键词前插入 `……`，让模型自动降速放重音\n- 超过 130 字的段落用 `|||` 在语气转折处手动分段\n- 档位 4（沉默留白幕）的旁白每个词组之间都加 `……`\n\n```\n❌ 平铺直叙：\n\"你以为选出了战将，其实你只选出了最擅长残杀队友的屠夫。\"\n\n✅ 有停顿感的版本：\n\"你以为……选出了战将。|||其实，你只筛选出了——最擅长残杀队友的……屠夫。\"\n```\n\n在项目目录下执行：\n\n```bash\n# 使用本地 VoxCPM2 模型生成语音（必须使用虚拟环境的 Python）\n# 1. 复制并编辑生成脚本（每个项目独立一份）\ncp /Users/lucas/Work/09.Antigravity/语音模型/generate_cantillon.py \\\n   /Users/lucas/Work/09.Antigravity/语音模型/generate_{project_name}.py\n# 2. 编辑 TARGET_TEXT、OUTPUT_FILE 等变量\n# 3. 运行\n/Users/lucas/Work/09.Antigravity/语音模型/voxenv/bin/python3 \\\n  /Users/lucas/Work/09.Antigravity/语音模型/generate_{project_name}.py\n```\n\n### 1.5A 图片素材生成（模式 A）\n\n> ℹ️ 仅模式 A（纯图片）执行此步。模式 B 跳转至 §1.5B。\n\n按剧本中每幕的\"画面描述\"逐一生成图片，命名严格遵循 `scene1.png`、`scene2.png` ... `scene{N}.png`，保存至 `YYYYMMDD/assets/`。\n\n**批量生成策略（应对 API 配额限流）：**\n\n图片生成 API 通常有速率限制（如每窗口期 5 张）。为避免流程阻塞，采用以下策略：\n\n1. **先批量准备提示词**：在生成前，将全部场景的提示词按风格圣经公式组装完毕，写入剧本。\n2. **分批生成 + 穿插其他工作**：每批生成到限流后，立即切换到其他 Stage 的工作（如音频分析、HTML 搭建），不要干等。\n3. **生成即归档**：每张图生成后立即 `cp` 到 `assets/` 目录并验证文件名，避免最后批量操作时遗漏。\n4. **断点续传**：用 `ls assets/scene*.png | wc -l` 检查进度，只生成缺失的图片。\n\n### 1.5B 视频 B-roll 素材采集与裁剪（模式 B）\n\n> ℹ️ 仅模式 B（视频 + 文字叠加）执行此步。模式 A 跳转至 §1.5A。\n\n**步骤 1 — B-roll 关键词策划：**\n\n根据每幕的情绪和主题，在 `视频脚本.md` 中列出搜索关键词：\n```markdown\n## B-roll 素材规划\n| 幕 | 情绪 | 搜索关键词 | 画幅偏好 |\n|----|------|-----------|---------|\n| scene1 | 压迫/悬疑 | dark office, laptop screen | 竖屏优先 |\n| scene2 | 忙碌/混乱 | meeting room, people talking | 竖屏优先 |\n| scene7 | 升华/开阔 | city night, aerial view | 横屏可接受 |\n```\n\n**步骤 2 — 素材探测（浏览器手动或自动）：**\n\n在 Pexels (https://pexels.com/search/videos/) 搜索关键词，获取视频直链。优先选择：\n- 竖屏 9:16（`_1080_1920_` 或 `_1440_2560_`）\n- 时长 ≥ 10 秒（裁剪后留 ≤ 20 秒）\n- 无水印、免版税\n\n**步骤 3 — 编写自动化下载脚本 `download_and_process.py`：**\n\n脚本必须包含以下能力（参考实现见 `20260518_org_slowdown/download_and_process.py`）：\n\n```python\nVIDEO_MAP = {\n    \"scene1.mp4\": {\"url\": \"https://videos.pexels.com/...\", \"is_vertical\": True},\n    \"scene2.mp4\": {\"url\": \"https://videos.pexels.com/...\", \"is_vertical\": False},\n    # ...\n}\n```\n\n**下载容错规范：**\n- `curl -L -k --retry 5 --retry-delay 3 -H \"User-Agent: Mozilla/5.0 ...\"` — Pexels CDN 需要浏览器 UA，且 SSL 连接不稳定\n- 若 curl 返回非零但文件通过 `ffprobe` 校验 → 视为下载成功（Cloudflare 常在传输末尾断开连接）\n- 已存在的有效视频自动跳过（断点续传）\n\n**FFmpeg 竖屏裁剪规范：**\n\n| 原片画幅 | FFmpeg filter | 说明 |\n|---------|--------------|------|\n| 9:16 竖屏 | `scale=1080:1920` | 直接缩放 |\n| 16:9 横屏 | `crop=ih*9/16:ih,scale=1080:1920` | 居中裁剪后缩放 |\n\n所有视频统一参数：`-t 20 -c:v libx264 -crf 18 -an -y`（限时长 20s，去音轨）\n\n**步骤 4 — 运行脚本：**\n```bash\nexport PATH=./bin:$PATH\npython3 download_and_process.py\n```\n\n### 1.6 纯文字海报生成（封面 scene_cover 与 封底 scene_end）\n\n> ℹ️ 无论处于模式 A（纯图片）还是模式 B（视频B-roll），所有视频都必须具备静态的海报级封面与封底。如果你有 `image_generate` 或类似生图工具的权限，请带上 `aspect_ratio=\"portrait\"` 等参数调用；否则，请输出 Prompt 引导用户在其他平台生成。\n\n**通用设计铁律：所有封面与封底必须是纯文字排版，绝不配图、无图标、无装饰。**\n- **满屏大标题** — 文字撑满整张画面，不留大片空白。\n- **错落有致** — 多行错位、大小穿插，制造视觉节奏感。\n- **留白呼吸** — 文字之间有空隙，不拥挤。\n- **落款署名** — 严禁硬编码他人名字。生成前，**必须通过对话询问用户**：“请问您的海报落款署名要写什么？”；如果用户不便回答，使用通用占位符如 `—— [主理人]`。\n\n**Style Slots (配色/字体风格矩阵)：**\n根据视频话题，自动选择以下 10 套体系之一。详细说明请查阅 [视觉风格参考手册](file://./resources/style_bible.md)。\n\n**Prompt 构建公式：**\n`[Vertical portrait poster, ONLY Chinese typography filling the entire frame. No images...]` + `[配色/字体风格描述]` + `[标题与落款排版]`\n\n*示例 Prompt (科技增长蓝封面)：*\n`Vertical portrait poster, ONLY Chinese typography filling the entire frame. No images, no illustrations, no icons, no decorations. Pure text only. Modern tech aesthetic: deep blue gradient background, white and cyan (#00D7FF) characters. Clean, bold display font. Staggered layout with varying character sizes. Title \"企业做AI千万不要一上来就全员铺工具\" arranged in 3-4 lines with oversized and medium contrast. \"—— [用户指定的IP名]\" as small signature at bottom. High-impact, minimal.`\n\n*封底 (End Card) 格式：*\n排版内容固定为：\"👍 点赞 ⭐ 收藏 \\n 🔔 加关注 \\n\\n 我们下期见！ \\n —— [用户指定的IP名]\"，配色必须与封面保持一致。\n\n生成后，严格命名为 `scene_cover.png` 和 `scene_end.png` 保存至 `assets/` 目录。\n\n**✅ Stage 1（素材）退出标准：**\n\n模式 A：\n- [ ] `assets/` 下场景图片数量 == 剧本分镜数\n- [ ] 场景图片命名符合规范（scene1~N.png）\n\n模式 B：\n- [ ] `assets/` 下每幕对应的 `.mp4` 文件已就位且通过 `ffprobe` 校验\n- [ ] 所有视频为 1080×1920 竖屏、无音轨、时长 ≤ 20s\n\n通用（模式 A 与 B 都必须满足）：\n- [ ] `scene_cover.png` 与 `scene_end.png` 已生成并就位。\n- [ ] `assets/narration.wav` 已生成。\n\n### 1.7 BGM 背景音乐匹配\n\nBGM 是情绪的推手，必须在 Stage 2 之前完成匹配。\n\n**BGM 匹配工作流：**\n1. **情绪识别**：分析剧本中各幕的「情绪档位」，提取核心关键词（如：Suspense, Epic, Minimalist, Melancholic）。\n2. **曲库搜索**：从免版税音乐库（如 Scott Buckley, Pixabay, Bensound）搜索并下载 1 首全局背景音。\n3. **参数配置**：\n   - `data-track-index`: 设为 `-1`（始终位于底层）。\n   - `data-volume`: 默认设为 `0.15` ～ `0.25`（通过 preview 实时调整，严禁盖过旁白）。\n4. **集成到 index.html**：\n   ```html\n   <audio id=\"bgm\" src=\"assets/bgm.mp3\" data-start=\"0\" data-duration=\"{视频总长}\" data-track-index=\"-1\" data-volume=\"0.25\"></audio>\n   ```\n\n**✅ Stage 1.7 退出标准：**\n- [ ] `assets/bgm.mp3` 已就位。\n- [ ] `视频脚本.md` 已补充 BGM 署名信息（含作者、链接及 CC 协议）。\n\nFile v1.0.0:resources/stages/stage_2_timeline.md\n\n# Stage 2：音频解析与数据驱动时间轴\n\n### 2.1 获取音频精确时长\n\n```bash\nexport PATH=./bin:$PATH\nffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1 YYYYMMDD/assets/narration.wav\n# 记录输出的 duration=XX.XXXXXX，这是视频总时长的唯一权威数据\n```\n\n### 2.2 获取精确断句时间戳（三级方案，按精度递减选择）\n\n**方案 A — Whisper 词级转录（精度最高，优先推荐）：**\n```bash\nnpx hyperframes transcribe YYYYMMDD/assets/narration.wav\n# 生成 YYYYMMDD/assets/transcript.json，包含词级时间戳\n# 直接按句末时间戳切分场景，误差 < 0.1s\n```\n\n**方案 B — RMS 能量分析 + 字数比例交叉验证（Whisper 不可用时）：**\n```bash\nexport PATH=./bin:$PATH\n# 1. 提取 RMS 能量流\nffmpeg -v error -i YYYYMMDD/assets/narration.wav \\\n  -af astats=metadata=1:reset=1,ametadata=print:key=lavfi.astats.Overall.RMS_level:file=rms.txt \\\n  -f null -\n\n# 2. 用 Python 脚本分析静默段（>= 0.85s 的低能量区间为段间分界）\n# 3. 将 RMS 检测到的分界与「字数比例推算」交叉验证：\n#    - 按各段旁白字数比例分配总时长，得出各段预估 start\n#    - 在预估 start ± 8s 范围内找最近 of RMS 静默段\n#    - 取静默段结束时间作为实际 scene start\n```\n\n> ⚠️ 更多技术细节及排坑规范，请查阅 [技术排坑手册](file://./resources/troubleshooting.md)。\n\n**方案 C — 纯字数比例分配（兜底方案）：**\n```python\n# 当 RMS 分析不可靠时（如 TTS crossfade 过重），直接按字数分配\n# 误差 ±2s，对 10s+ 的场景可接受\nfor scene in scenes:\n    scene.duration = scene.char_count / total_chars * total_audio_duration\n```\n\n### 2.3 将时间戳映射到分镜\n\n根据 2.2 的输出，将每幕的 `data-start` 和 `data-duration` 精确填入剧本或直接生成为 JS 数组：\n\n```js\n// 由音频数据派生，禁止手动估算\nconst scenes = [\n  { id: \"scene1\", start: 0,    duration: 5.8,  subtitle: \"旁白文本...\" },\n  { id: \"scene2\", start: 5.8,  duration: 6.2,  subtitle: \"旁白文本...\" },\n  // ...\n];\n```\n\n**✅ Stage 2 退出标准：**\n- [ ] Whisper `transcript.json` 已生成，或 RMS 分析 + 字数交叉验证已完成，或纯字数比例已计算\n- [ ] 所有分镜的 `start + duration` 之和与音频总时长误差 < 0.5 秒\n- [ ] 标注所使用的方案等级（A/B/C），方便后续迭代时升级\n\nFile v1.0.0:resources/stages/stage_3_static.md\n\n# Stage 3：静态排版构建与验收\n\n### 3.1 创建项目目录\n\n```bash\nmkdir -p YYYYMMDD/assets\n# 初始化 index.html（手动创建，参考下方 HTML 模板）\n```\n\n### 3.2 HTML 基础模板 — 模式 A（强制规范）\n\n> ℹ️ 以下为模式 A（纯图片）的 HTML/CSS 规范。模式 B 请跳转至 §3.2B。\n> 完整参考实现见 `template/index.html` 和 `template/style.css`。以下仅列出关键约束。\n\n**根容器必须包含 4 个 data-* 属性（缺一不可）：**\n```html\n<div id=\"composition\"\n     data-composition-id=\"composition\"\n     data-width=\"1920\"\n     data-height=\"1080\"\n     data-duration=\"{Stage 2.1 获取的音频总时长}\">\n```\n\n**场景 DOM 结构（由 JS 动态生成，严禁硬编码）：**\n```\nscene.clip\n  ├─ img.bg-fill    ← 背景模糊层（object-fit: cover + blur）\n  ├─ img.fg-main    ← 主体图片层\n  └─ div.overlay\n       └─ div.subtitle  ← 字幕（通过 textContent 写入）\n```\n\n**GSAP 铁律：**\n```js\nconst tl = gsap.timeline({ paused: true }); // 永远 paused: true\nwindow.__timelines = window.__timelines || {};\nwindow.__timelines[\"composition\"] = tl; // key 必须与 data-composition-id 一致\n```\n\n**图片引用规范：**\n- 使用 `assets/${id}.png`（如 `assets/scene1.png`），与 scene 数据的 id 字段一致\n\n### 3.3 CSS 布局规范 — 模式 A（强制）\n\n> ℹ️ 完整实现见 `template/style.css`。以下仅列出核心规则。\n\n**`object-fit` 决策树（根据图片画幅选择）：**\n\n| 图片画幅 | fg-main | bg-fill | 效果 |\n|---------|---------|---------|------|\n| 16:9 横版（推荐） | `object-fit: cover` | 不需要 | 完美填充，无黑边 |\n| 非标画幅（正方形等） | `object-fit: contain` | 需要（blur + cover） | 毛玻璃背景填充黑边 |\n\n```css\n/* 背景模糊层（非 16:9 素材时使用） */\n.bg-fill {\n  position: absolute; inset: 0;\n  object-fit: cover;\n  filter: blur(20px) brightness(0.4);\n  transform: scale(1.1); /* 补偿 blur 边缘虚化 */\n}\n\n/* 主体图片层：严禁使用 translate 居中 */\n.fg-main {\n  position: absolute; inset: 0;\n  object-fit: contain; /* 或 cover，见上方决策树 */\n  transform-origin: center center;\n}\n```\n\n### 3.2B HTML 基础模板 — 模式 B（视频 + 文字叠加）\n\n> ℹ️ 以下为模式 B 的 HTML/CSS 规范。参考实现见 `20260518_org_slowdown/index.html` 和 `style.css`。\n\n**根容器（竖屏画幅）：**\n```html\n<div id=\"composition\"\n     data-composition-id=\"composition\"\n     data-width=\"1080\"\n     data-height=\"1920\"\n     data-start=\"0\"\n     data-duration=\"{音频总长}\">\n```\n\n**⚠️ 视频标签扁平化铁律（最重要的规则）：**\n\n`<video>` 标签**必须**是 `#composition` 的**直接子元素**。严禁将 `<video data-start=\"...\">` 嵌套在任何带有 `data-start` 的 `<div>` 内部，否则 HyperFrames 渲染器无法管理视频播放，**视频将冻结在第一帧**。\n\n```html\n<!-- ✅ 正确：视频作为舞台的扁平直接子元素 -->\n<video id=\"v-scene1\" class=\"clip bg-video\" src=\"assets/scene1.mp4\" muted playsinline\n       data-start=\"0\" data-duration=\"8\" data-track-index=\"3\"></video>\n<video id=\"v-scene2\" class=\"clip bg-video\" src=\"assets/scene2.mp4\" muted playsinline\n       data-start=\"8\" data-duration=\"10\" data-track-index=\"3\"></video>\n\n<!-- 文字叠加层：独立的场景 div，不含 <video> -->\n<div id=\"scene1\" class=\"clip\"\n     data-start=\"0\" data-duration=\"8\" data-track-index=\"1\"\n     style=\"z-index: 1;\">\n  <div class=\"dim-overlay\"></div>\n  <div class=\"bottom-gradient\"></div>\n  <div class=\"text-layer text-layer--bottom\">\n    <div id=\"s1-line1\" class=\"body-text\">旁白文本</div>\n    <div id=\"s1-line2\" class=\"headline\">冲击<span class=\"accent\">金句</span>。</div>\n  </div>\n</div>\n```\n\n```html\n<!-- ❌ 错误：视频嵌套在带 data-start 的 div 内 → 渲染冻结 -->\n<div id=\"scene1\" class=\"clip\" data-start=\"0\" data-duration=\"8\">\n  <video class=\"bg-video\" src=\"assets/scene1.mp4\" data-start=\"0\" ...></video>\n</div>\n```\n\n**视频标签必备属性清单：**\n\n| 属性 | 说明 |\n|------|------|\n| `id` | 唯一标识，如 `v-scene1`（缺少则渲染冻结） |\n| `class=\"clip bg-video\"` | `clip` 让框架管理可见性，`bg-video` 应用视频样式 |\n| `muted playsinline` | HyperFrames 接管播放，严禁加 `autoplay` 或 `loop` |\n| `data-start` | 视频在时间轴上的起始秒数 |\n| `data-duration` | 视频播放时长 |\n| `data-track-index` | 设为 `3`（与音频轨 0、场景轨 1/2 错开） |\n\n**全局装饰层（模式 B 推荐）：**\n```html\n<div class=\"vignette\"></div>      <!-- 暗角 -->\n<div class=\"noise-overlay\"></div>  <!-- 胶片噪点 -->\n```\n\n### 3.3B CSS 规范 — 模式 B（文字叠加排版）\n\n**核心 CSS 铁律：**\n```css\n.bg-video {\n  position: absolute; inset: 0;\n  width: 100%; height: 100%;\n  object-fit: cover;\n  opacity: 1; /* 👈 必须！覆盖 .clip 的默认 opacity: 0 */\n}\n\n.dim-overlay {\n  position: absolute; inset: 0;\n  background: rgba(0, 0, 0, 0.55); /* 确保文字可读 */\n}\n\n.bottom-gradient {\n  position: absolute; bottom: 0; left: 0; right: 0;\n  height: 600px;\n  background: linear-gradient(to top, rgba(10,10,10,0.95) 0%, transparent 100%);\n  z-index: 1;\n}\n```\n\n**文字叠加组件库：**\n\n| 组件 | CSS 类 | 用途 |\n|------|--------|------|\n| 大标题金句 | `.headline` | 核心冲击句 |\n| 超大数字 | `.headline--huge` | 数据对比 |\n| 正文旁白 | `.body-text` | 常规叙述 |\n| 小字说明 | `.caption-text` | 补充信息 |\n| 强调色 | `.accent` | 关键词高亮 |\n| 不等号卡 | `.neq` + `.text-card` | 「A ≠ B」对比卡片 |\n| 分屏对比 | `.split-compare` | 错误 vs 正确对比 |\n\n**文字定位方式：**\n- `.text-layer--bottom`：底部三分之一（大多数叙述场景）\n- `.text-layer--center`：垂直居中（金句升华、数字冲击）\n\n### 3.4 静态验收（加入动画前的检查）\n\n用浏览器打开 `index.html`，截图确认：\n\n模式 A：\n- [ ] 每张图片完整显示，无裁切，无偏移\n- [ ] 图片在 1920×1080 的黑色背景内居中\n\n模式 B：\n- [ ] 视频背景可见（非黑屏），文字叠加清晰可读\n- [ ] `dim-overlay` 暗化效果适当（文字不被视频干扰）\n- [ ] 全屏文字卡（如「A ≠ B」）显示正确\n\n**✅ Stage 3 退出标准：**\n- [ ] 纯静态下所有视觉素材（图片或视频）100% 正确显示\n- [ ] `data-composition-id`、`data-width`、`data-height` 已正确设置\n- [ ] 模式 A：字幕通过 `textContent` 注入；模式 B：文字叠加 DOM 结构完整\n- [ ] `npx hyperframes lint .` 报 **0 error(s)**\n\nFile v1.0.0:resources/stages/stage_4_animation.md\n\n# Stage 4：动画集成与预检发版\n\n### 4.1 加入 GSAP 动画\n\n在静态验收通过后，才可加入动效。可用动画菜单：\n\n| 动效 | 代码模板 | 适用场景 |\n|------|---------|--------|\n| Ken Burns 缩放 | `fromTo(img, {scale:1.0}, {scale:1.06, ease:\"none\"})` | 所有场景默认 |\n| Ken Burns 平移 | `fromTo(img, {x:-20}, {x:0, ease:\"none\"})` | 宽场景横向扫描 |\n| 字幕淡入 | `from(sub, {opacity:0, y:20, duration:0.8, ease:\"power2.out\"})` | 所有场景可选 |\n| 场景交叉淡化 | `to(div, {opacity:0, duration:0.5}, start+duration-0.25)` | 场景过渡 |\n| 光晕脉冲 | `to(glow, {opacity:0.4, repeat:-1, yoyo:true, duration:2})` | 火焰/光源场景 |\n\n### 4.1.1 情绪驱动转场匹配\n\n场景之间的转场不应千篇一律。根据**下一幕的情绪档位**选择对应转场：\n\n| 下一幕情绪档位 | 转场方式 | GSAP 代码 | 视觉效果 |\n|-------------|---------|----------|--------|\n| 1（舒缓叙事） | 慢溶解 | `fromTo(next, {opacity:0}, {opacity:1, duration:1.2, ease:\"power1.inOut\"})` | 平静过渡，如水墨晕染 |\n| 2（紧张蓄力） | 标准交叉淡化 | `fromTo(next, {opacity:0}, {opacity:1, duration:0.5, ease:\"none\"})` | 默认节奏 |\n| 3（高潮爆发） | 硬切 + 微缩放 | `tl.set(next, {opacity:1}); fromTo(next, {scale:1.05}, {scale:1.0, duration:0.3})` | 冲击感 |\n| 4（沉默留白） | 淡入黑 → 淡出黑 | `先 to(prev, {opacity:0, duration:0.8}), 延迟 0.5s, 再 fromTo(next, {opacity:0}, {opacity:1, duration:1.0})` | 呼吸感，给观众消化时间 |\n\n### 4.2 强制预检（渲染前的最后防线）\n\n```bash\nexport PATH=./bin:$PATH\nnpx hyperframes@latest inspect YYYYMMDD/\n```\n\n**✅ Stage 4 退出标准（必须全部满足，才允许执行 render）：**\n- [ ] `inspect` 命令退出码为 0（无报错）\n- [ ] 控制台输出的 `totalDuration` 与 Stage 2.1 测量的音频时长误差 < 0.2 秒\n- [ ] 无任何 `StaticGuard` 警告\n\n### 4.3 渲染导出\n\n```bash\nexport PATH=./bin:$PATH\n# 强制渲染到项目renders目录下\nnpx hyperframes@latest render YYYYMMDD/ -o YYYYMMDD/renders/promo_video.mp4 --force-new\n```\n\nFile v1.0.0:resources/stages/stage_5_publish.md\n\n# Stage 5：发布与归档\n\n### 5.1 视频脚本元数据与多平台宣发策划补充\n\n在 `视频脚本.md` 中补充技术元数据与 **「小红书/短视频爆款宣发策划」**，确保视频具备出厂即可一键分发的高效爆款能力。\n\n#### 1. 技术参数补充（脚本底部）\n```markdown\n## 技术参数\n- **声纹**：VoxCPM2 用户克隆 / Kokoro am_adam\n- **实测时长**：{ffprobe 实测值}s\n- **BGM**：{BGM 名称} by {BGM 作者} (CC BY 4.0)\n- **YouTube**：{URL}\n```\n\n#### 2. 小红书/短视频宣发策划（脚本最下方）\n在 `视频脚本.md` 的最底部，**强制追加**小红书专属的宣发案策划，包含：\n1. **爆款标题推荐**（至少 3-4 个）：\n   - *写作公式 1 (痛点直击)*：`[痛点表情] + 痛点揭露/反差怪象 + 为什么会这样？`（例如：🤯 职场怪象：为什么招的人越贵，公司反而越慢？）\n   - *写作公式 2 (认知颠覆)*：`[警示表情] + 戳破某种常见幻觉/认知错误！`（例如：🚫 戳破老板的幻觉：个体优秀 ≠ 组织高效！）\n   - *写作公式 3 (具体数字)*：`[下降/冲突表情] + 极端数字对比 + 场景重现`（例如：📉 协同内耗：本来3人能决定的事，为什么变成了13人讨论？）\n2. **封面/配图文字建议**：设计大字冲击的主副标题，做首屏抓手。\n3. **小红书正文文案**：\n   - 使用丰富的 **Emoji** 进行段落排版，提升可读性。\n   - 包含：**痛点共情**（点明现状） + **干货输出**（列出 3 点精辟洞察或引述视频金句） + **互动钩子**（引导评论区分享见解，如“你们公司也是这样吗？”） + **精准热门标签**（如 `#职场那些事儿 #组织架构 #管理思维 #职场内耗`）。\n\n*规范模板示例：*\n```markdown\n## 5. 小红书宣发策划\n\n### 爆款标题推荐\n1. [小红书标题 1]\n2. [小红书标题 2]\n3. [小红书标题 3]\n\n### 封面/配图文字建议\n- **主标题**：[极简有力]\n- **副标题**：[点题/对比]\n\n### 小红书正文文案\n[带有丰富 Emoji、干货条理明晰、包含互动提问和小红书热门 Tag 的 300-500 字社交文案]\n```\n\n### 5.2 README 更新\n\n在 `README.md` 的「演示作品」表格中追加新作品条目（中英文双语部分均需更新）。\n\n### 5.3 Git 归档\n\n**仅 commit，不自动 push。** 推送时机由用户决定。\n\n```bash\ngit add YYYYMMDD/ README.md\ngit commit -m \"feat: Add {video_title} project\"\n# git push 由用户按需执行，不自动推送\n```\n\n**✅ Stage 5 退出标准：**\n- [ ] `视频脚本.md` 包含完整元数据（声纹、时长、BGM、YouTube 链接）以及小红书爆款标题与宣发策划文案\n- [ ] `README.md` 中英双语演示作品表格已更新\n- [ ] `git commit` 成功\n\nFile v1.0.0:resources/style_bible.md\n\n# 🎨 视觉风格指南 (FableForge Visual Style Bible)\n\n本指南是 FableForge 视频生成流水线的官方视觉规范，提供各题材、文化背景下的生图公式与排除规则，确保 AI 生成图像的风格自洽和文化准确度。\n\n---\n\n## 1. 风格决策原则\n\n- **动态适配**：视觉风格必须完全服务于故事。可选国风写意、现代极简、蒸汽朋克、赛博朋克或电影感实拍风格。\n- **自洽性**：全片所有图片的色调、光影和元素必须统一，严禁跨时空混搭（除非剧情要求）。\n- **文化锚点优先于美感**：当「好看」和「文化准确」冲突时，选文化准确。一张唐代故事里出现的日式庭院，再好看也是错误。\n\n---\n\n## 2. 常见文化与体裁锚点速查表\n\n| 文化/体裁设定 | 场景/建筑关键词 | 元素/服饰关键词 | 常见误导（必须排除） |\n|-------------|---------------|---------------|-------------------|\n| **现代商务 (Analytical)** | Modern glass office, boardroom, high-rise, minimalist workspace | Business suit, smart casual, laptop, abstract charts | 奇幻元素, 杂乱背景, 古代物品 |\n| **极简数据 (Analytical)** | Abstract data visualization, glowing nodes, dark background | Neon lines, geometric shapes, HUD elements | 具体人物, 复杂实景建筑 |\n| 唐宋中国 (Narrative)| Dougong brackets, grey tiles, wooden beams, moon gate | Round-collar robe, Hanfu, Mingguang armor | 鸟居, 和服, 榻榻米, 哥特尖拱 |\n| 明清中国 (Narrative)| Upturned eaves, red lacquer columns, courtyard houses | Changshan, Qipao, Mandarin collar | 和服, 韩服, 维多利亚裙 |\n| 日本和风 (Narrative)| Torii gate, tatami, shoji screens, engawa | Kimono, hakama, geta sandals | 斗拱, 汉服, 旗袍 |\n| 中世纪欧洲 (Narrative)| Gothic arches, stone castle, stained glass | Chainmail, surcoat, leather boots | 东方建筑, 丝绸长袍 |\n| 赛博朋克 (Narrative)| Neon signs, holographic ads, megastructures | LED-trimmed jacket, visor, cybernetic limbs | 古典建筑, 自然光 |\n\n---\n\n## 3. 图片提示词工程\n\n- **公式**：`[画幅指令] + [文化锚点] + [本幕内容] + [色调光影] + [质量后缀] + [排除清单]`\n- **质量后缀**：`hyper-realistic details, cinematic lighting, masterpiece, 8K`\n- **排除清单格式**：`No [culture A] elements, no [culture B] elements, no modern objects.`\n- **中文文字生成**（架构图/概念图专用）：`A [style] visualization with Chinese labels. Main node: \"核心词\". Sub-nodes: \"关联词1\", \"关联词2\". Professional design, glowing connections.`\n\n---\n\n## 4. 风格圣经模板示例\n\n### 4.1 古代中国唐代水墨风提示词\n```\nCinematic vertical shot, 9:16 aspect ratio. Ancient Chinese Tang Dynasty style.\nA young monk in grey round-collar robes holds a bronze oil lamp in a temple courtyard\nwith Dougong bracket architecture and grey tile roofing.\nInk-wash atmosphere, warm golden lamplight against dark shadows, subtle rice-paper texture.\nhyper-realistic details, cinematic lighting, 8K.\nNo Japanese elements, no Western elements, no modern objects.\n```\n\nFile v1.0.0:resources/template/script-template.md\n\n# FableForge — Storyboard Script Template\n\n## Project Info\n\n- **Topic**: (Management / leadership concept, e.g.: Zero-sum game, Principal-Agent problem)\n- **Target Duration**: 60 seconds\n- **Scene Count**: (Fill in, recommended 8–12)\n- **Narration Tone**: (Calm storytelling / Dramatic tension / Warm reflection)\n\n---\n\n## Allegory Story\n\n(Paste the full allegory story here for narration reference)\n\n---\n\n## Scene-by-Scene Storyboard\n\n> **Spec Constraints:**\n> - Narration per scene: 30–60 words\n> - Scene duration: 5–8 seconds (finalized from audio measurement)\n> - Image naming: `scene{N}.png` — strictly 1:1 with scene number\n> - Emotional gear must be tagged for each scene\n\n---\n\n### Scene 1 — [Scene Name]\n\n- **Time (draft estimate)**: 0 ~ 6 seconds\n- **Emotional Gear**: 1 (Slow Narration — opening, world-building)\n- **Narration**: (30–60 word narration text)\n- **Visual Description**: (English image generation prompt — include style, subject, lighting, mood)\n- **Voice Pacing Note**: (Any `…` pause markers needed?)\n\n---\n\n### Scene 2 — [Scene Name]\n\n- **Time (draft estimate)**: 6 ~ 12 seconds\n- **Emotional Gear**: 1\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 3 — [Scene Name]\n\n- **Time (draft estimate)**: 12 ~ 18 seconds\n- **Emotional Gear**: 2 (Building Tension — conflict starts)\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 4 — [Scene Name]\n\n- **Time (draft estimate)**: 18 ~ 24 seconds\n- **Emotional Gear**: 2\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 5 — [Scene Name]\n\n- **Time (draft estimate)**: 24 ~ 31 seconds\n- **Emotional Gear**: 2\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 6 — [Scene Name]\n\n- **Time (draft estimate)**: 31 ~ 38 seconds\n- **Emotional Gear**: 3 (Peak Intensity — key turning point)\n- **Narration**: (Narration text — should be shorter)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 7 — [Scene Name]\n\n- **Time (draft estimate)**: 38 ~ 44 seconds\n- **Emotional Gear**: 3\n- **Narration**: (Narration text)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n### Scene 8 — [Scene Name]\n\n- **Time (draft estimate)**: 44 ~ 50 seconds\n- **Emotional Gear**: 4 (Silence & Space — pause before conclusion)\n- **Narration**: (≤ 15 words — let the weight sink in)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**: Add `…` between every phrase\n\n---\n\n### Scene 9 — [Scene Name]\n\n- **Time (draft estimate)**: 50 ~ 56 seconds\n- **Emotional Gear**: 4 → 1 (Resolution landing)\n- **Narration**: (≤ 20 words — fewest words, biggest insight)\n- **Visual Description**: (Image prompt)\n- **Voice Pacing Note**:\n\n---\n\n(Copy the format above to add more scenes if needed)\n\n---\n\n## Full Narration (Combined)\n\n(Concatenate all scene narrations in order — paste directly into `generate.py` as `TARGET_TEXT`)\n\n```\nScene 1: [narration]\n\n||| Scene 2: [narration]\n\n||| ...\n```\n\n---\n\n## Publishing Metadata\n\n### Title Options\n1. (Option 1)\n2. (Option 2)\n3. (Option 3)\n\n### Cover Tagline\n(One punchy line, ≤ 15 words)\n\n### Tags / Topics\n(Keywords for social platforms, e.g.: leadership, management, fable, AI-video)\n\nFile v1.0.0:resources/template/视频脚本.md\n\n# 视频脚本模板\n\n## 基本信息\n\n- **主题**：（填写管理学/领导力概念，例：零和博弈、委托代理问题）\n- **视频时长目标**：60 秒\n- **分镜数量**：（填写幕数，建议 8～12）\n- **配音风格**：（沉稳叙事 / 紧张戏剧 / 温和启发）\n\n---\n\n## 寓言故事\n\n（在此处填写完整的寓言故事，供旁白参考）\n\n---\n\n## 分镜头剧本\n\n> 规格约束：\n> - 每幕旁白 30～60 字\n> - 每幕时长 5～8 秒（以音频实测为准）\n> - 图片命名：`scene{N}.png`，与幕序号严格一一对应\n\n---\n\n### 分镜 1 — 【幕名】\n\n- **时间（草稿估算）**：第 0 ～ 6 秒\n- **旁白**：（30～60字的旁白文本）\n- **画面描述**：（英文 AI 绘图提示词，需包含画风、主体、光影、氛围）\n\n---\n\n### 分镜 2 — 【幕名】\n\n- **时间（草稿估算）**：第 6 ～ 12 秒\n- **旁白**：（旁白文本）\n- **画面描述**：（提示词）\n\n---\n\n### 分镜 3 — 【幕名】\n\n- **时间（草稿估算）**：第 12 ～ 18 秒\n- **旁白**：（旁白文本）\n- **画面描述**：（提示词）\n\n---\n\n（复制上方格式，按需添加至 scene{N}）\n\n---\n\n## 完整旁白合并文本\n\n（将以上所有分镜旁白按顺序合并，直接用于 TTS 生成）\n\n---\n\n## 标题建议（用于发布）\n\n1. （标题方案 1）\n2. （标题方案 2）\n3. （标题方案 3）\n\n## 推荐封面文案\n\n（一句话点睛，20 字以内）","readmeExcerpt":"Skill: Fableforge Owner: lucas-kay8 Summary: FableForge 通用视频生成流水线 SOP。支持两种生产模式（图片流、视频 B-roll 流）和三种体裁（叙事寓言、商业分析、产品宣发）。包含从概念生成、剧本创作、TTS 配音、素材采集、到 HyperFrames 视频渲染的完整工业化 SOP，以及视觉风格指南与技术陷阱手册。v1.2.0 新增 VAD 物... Tags: latest:1.2.0 Version history: v1.2.0 | 2026-05-22T03:04:08.772Z | user v1.2.0: 引入VAD声学平铺匹配、语速自动健康度审计门禁、大分镜GSAP变量解耦与生命周期控制 v1.1.0 | 2026-05-20T11:21:51.456Z | user FableForge 技能升级至 v1.1.0，新增全局禁令、素材新鲜度校验、渲染前集成检","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"旁白总字数 = 原始故事中【不可删减要素】的合计字数（见 0.3）\n预估时长(秒) = 旁白总字数 ÷ 3.5（中文语速）\n根据预估时长选择对应档位"},{"language":"text","snippet":"/YYYYMMDD/\n  ├── index.html          (核心时间轴，Stage 3/4 产物)\n  ├── assets/\n  │   ├── scene_cover.png (封面图，纯文字海报)\n  │   ├── scene1.png ~ sceneN.png\n  │   ├── scene_end.png   (结尾图，纯文字海报)\n  │   ├── narration.wav   (TTS 配音)\n  │   ├── bgm.mp3         (背景配乐，Stage 1.7 产物)\n  │   └── transcript.json (Whisper 时间戳，Stage 2.2 产物)\n  ├── 视频脚本.md          (剧本，Stage 1.2 产物)\n  └── promo_video.mp4     (最终成品，Stage 4.3 产物，Git 豁免名单)"},{"language":"text","snippet":"/YYYYMMDD_{project_name}/\n  ├── index.html               (核心时间轴，竖屏 1080×1920)\n  ├── style.css                (独立样式表，文字叠加组件库)\n  ├── download_and_process.py   (B-roll 自动化下载/裁剪脚本)\n  ├── assets/\n  │   ├── scene1.mp4 ~ sceneN.mp4  (裁剪后的 B-roll 视频，1080×1920，无音轨)\n  │   ├── narration.wav            (TTS 配音)\n  │   └── bgm.mp3                  (背景音乐)\n  ├── 视频脚本.md                   (剧本 + B-roll 素材规划表)\n  └── renders/\n      └── {project}_YYYY-MM-DD_HH-MM-SS.mp4  (渲染成品)"},{"language":"text","snippet":"大家好，我在录制自己的声音样本。这段录音将作为我的声纹模板，\n帮助 AI 精确还原我的音色和情感。现在是[你的名字]，感谢收听。"},{"language":"bash","snippet":"# 安装 Audacity\nbrew install --cask audacity"},{"language":"text","snippet":"voice-model/01_samples/my_voice.wav"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: ai-video-studio\nversion: 1.2.0\ndescription: FableForge 通用视频生成流水线 SOP。支持两种生产模式（图片流、视频 B-roll 流）和三种体裁（叙事寓言、商业分析、产品宣发）。包含从概念生成、剧本创作、TTS 配音、素材采集、到 HyperFrames 视频渲染的完整工业化 SOP，以及视觉风格指南与技术陷阱手册。v1.2.0 新增 VAD 物理声学平铺匹配、语速自动健康度审计（防脱节门禁）、大分镜 GSAP 变量解耦与生命周期显隐控制。\n---\n\n# 🔨 FableForge · 视频生成工业流水线 AI Agent SOP\n\n本 Skill 是一份**命令级可执行 SOP**，而非经验教训集。每个 Stage 均包含**具体执行命令**和**退出验收标准**，严禁跳步或在退出标准未满足时进入下一阶段。\n\n### ⛔ 全局禁令（违反任意一条即判定为生产事故）\n\n1. **严禁复用旧集素材**：每一集的 `assets/` 目录下的所有文件（视频、音频、图片、BGM）必须为本次任务全新生成或下载。严禁从其他 `episodes/` 目录复制任何媒体文件。唯一例外是 `narration.wav`（由 TTS 脚本生成）和模板代码结构（非媒体文件）。\n2. **严禁跳过退出标准**：每个 Stage 的退出标准中的所有检查项必须逐一验证并标记为通过，才能进入下一个 Stage。\n3. **严禁无字幕渲染**：无论模式 A 还是模式 B，最终视频必须包含与配音同步的逐字滚动字幕。\n4. **严禁无封面/封底渲染**：所有视频必须包含封面标题幕（`#scene_cover`）和封底互动幕（`#scene_end`）。\n5. **严禁复用旧集 BGM**：每集的背景音乐必须根据本集剧本的情绪主题全新搜索并下载，不得复用历史集的 `bgm.mp3`。\n\n---\n\n## 0. 视频规格与体裁定义（内容优先定档制）\n\n**核心原则：内容的可理解性永远优先于时长限制。**\n\n视频时长不是预设的固定值，而是由内容倒推得出的。错误的做法是「先定 60 秒，然后把内容往里塞」；正确的做法是「先确认内容讲完需要多少字，再据此选档」。\n\n### 0.0 视频体裁系统 (Genre)\n\n本流水线支持三种核心体裁。在构思内容前，**必须首先确定体裁**：\n\n| 体裁 (Genre) | 特征与核心要求 | 适用场景 | 常用视觉模式 |\n|-------------|-----------|---------|---------|\n| **Genre X: 叙事/隐喻 (Narrative)** | 有角色、有冲突。旁白重感受轻动作，追求悬念与结局升华。 | 寓言故事、历史重现、管理隐喻 | + 模式 A (图片) |\n| **Genre Y: 分析/科普 (Analytical)** | 论点驱动、逻辑递进。追求清晰的结构拆解和痛点直击。 | 商业分析、职场洞察、技术科普 | + 模式 B (B-roll) |\n| **Genre Z: 宣发/展示 (Promotional)**| 产品中心、利益点明确。强节奏感与转化引导 (CTA)。 | 产品宣发、网站转视频、功能展示 | 混合模式 |\n\n### 0.1 三档体系\n\n| 档位 | 适用场景 | 旁白总字数 | 预估时长 | 分镜数 |\n|------|---------|-----------|---------|-------|\n| S · 短片 | 单一概念解释、痛点直击、高密度短平快 | 150～450 字 | 45～120 秒 | 1+5~12+1 |\n| M · 标准 | 完整叙事、多维度拆解、深度论证 | 450～900 字 | 120～270 秒 | 1+12~20+1 |\n| L · 长篇 | 复杂案例剖析、连续剧集 | 900～1500 字 | 270～420 秒 | 1+20~30+1 |\n\n> 超过 1500 字的内容必须拆成上下集（每集独立成片，各自包含封面和结尾）。\n\n### 0.2 定档公式\n\n```\n旁白总字数 = 原始故事中【不可删减要素】的合计字数（见 0.3）\n预估时长(秒) = 旁白总字数 ÷ 3.5（中文语速）\n根据预估时长选择对应档位\n```\n\n### 0.3 不可删减要素（内容完整性红线）\n\n不同体裁有不同的不可删减要素。如果被删除，观众将无法理解视频的核心价值。**剧本转化阶段（Stage 1.2）严禁删除这些要素：**\n\n| 体裁 (Genre) | 核心不可删减要素 | 删除后果 |\n|-------------|----------------|----------|\n| **Narrative (叙事类)** | 因果链、角色动机、关键对话、认知翻转事件、结局因果闭环 | 观众不知道“为什么”，悬念消失，结论像硬塞的 |\n| **Analytical (分析类)**| 痛点现象描述、核心矛盾拆解、数据对比/逻辑支撑、金句结论 | 视频变成空洞的说教，缺乏说服力 |\n| **Promotional(宣发类)**| 目标受众痛点、核心利益点 (Benefit)、差异化价值、明确的 CTA | 看完后不知道自己能得到什么，无法转化 |\n\n**可以精简的要素：**\n- 重复的环境描写或冗长的数据罗列（保留首次，后续可省略）\n- 纯装饰性的形容词堆叠\n- 不影响主线的次要信息\n- 已被画面传达的信息（如「山很高」——画面已经表达了）\n\n### 0.4 通用规格（所有档位共享）\n\n| 规格项 | 标准值 | 说明 |\n|--------|--------|------|\n| 每幕旁白字数 | 中文 30～80 字 / 英文 20～50 词 | 中文约 3.5 字/秒，英文约 2.5 词/秒 |\n| 每幕预估时长 | 5 ～ 15 秒 | 最终以音频实测为准 |\n| 分镜编号格式 | `scene_cover`, `scene1`~`scene{N}`, `scene_end` | 与 `assets/` 下的图片名严格一一对应 |\n| 旁白与分镜对应 | 1 幕 == 1 张图 == 1 段旁白 | 封面通常对应标题旁白，结尾对应金句旁白 |\n\n---\n\n## 0.5 质量门禁（三重内容验收）\n\n视频质量的上限由三个核心因素决定。**每一重门禁未通过，不得进入下一阶段。**\n\n### 门禁一：概念与大纲验收（概念生成后、停机确认前执行）\n\nAI 容易生成\"结构正确但洞察平庸\"的内容。在向用户展示前，必须根据体裁完成自检：\n\n**强制自检（全部通过方可提交用户确认）：**\n- [ ] **反常识测试 (通用)**：这个洞察/角度是\"大家都知道\"还是\"大家都经历但从没被命名\"的？前者没传播价值，重写。\n- [ ] **Genre X (叙事) 专属**：结局是否让人感到轻微不适或醍醐灌顶？隐喻是否太直白（能在前10秒猜到结局）？\n- [ ] **Genre Y (分析) 专属**：逻辑链条是否严密？是否提出了具有实操性的认知升华？\n- [ ] **"},{"path":"resources/voice-model/README.md","content":"# 声音样本录制指南\n\n## 为什么需要录制声音样本？\n\n本项目使用 **VoxCPM2** 声纹克隆模型。它的工作原理是：\n1. 你提供一段 **15 秒**的自己的声音\n2. 模型学习你的**音色、语调、情感特征**\n3. 之后，模型就能用**你的声音**朗读任何文字\n\n效果就像你亲自配音，但实际上是 AI 在模拟你。\n\n---\n\n## 录音要求\n\n| 项目 | 标准 |\n|------|------|\n| 时长 | **15 秒**（过短效果差，过长会截断） |\n| 格式 | WAV（不要 MP3，会丢失音质） |\n| 采样率 | 44100 Hz 或以上 |\n| 语速 | 正常语速，不要刻意放慢 |\n| 内容 | 朗读下方指定文本（必须与 `PROMPT_TEXT` 一致） |\n\n---\n\n## 推荐朗读文本\n\n将下方文字复制到 `generate.py` 的 `PROMPT_TEXT` 参数，并**朗读同样的内容**：\n\n```\n大家好，我在录制自己的声音样本。这段录音将作为我的声纹模板，\n帮助 AI 精确还原我的音色和情感。现在是[你的名字]，感谢收听。\n```\n\n你也可以自定义这段文字，但要确保录音内容和 `PROMPT_TEXT` **完全一致**。\n\n---\n\n## 录音步骤（Mac）\n\n### 方法 A：使用 QuickTime（最简单）\n\n1. 打开 QuickTime Player\n2. 菜单栏 → 文件 → 新建音频录制\n3. 点击录制按钮，朗读文本，停止\n4. 导出 → 音频 → 保存为 WAV\n\n### 方法 B：使用 Audacity（质量更好）\n\n```bash\n# 安装 Audacity\nbrew install --cask audacity\n```\n\n1. 选择麦克风（推荐有线耳机）\n2. 点击录制，朗读文本\n3. 导出为 WAV，采样率 44100\n\n---\n\n## 保存路径\n\n录音完成后，将文件保存为：\n```\nvoice-model/01_samples/my_voice.wav\n```\n\n> ⚠️ **隐私提示**：此文件包含你的声纹信息，`.gitignore` 已自动排除 `01_samples/` 目录，不会被提交到 GitHub。\n\n---\n\n## 录音质量检验\n\n一个好的声音样本应该：\n- [ ] 没有明显的背景噪音（空调声、键盘声等）\n- [ ] 没有爆音（P、B 音爆声）\n- [ ] 没有回声（不要在浴室或空旷房间录制）\n- [ ] 语速自然，情感投入（不要像机器人一样朗读）\n\n---\n\n下一步：参考 [README.md 阶段一第 4 步](../README.md#阶段一录制你的声音首次必做一劳永逸) 运行 `generate.py` 测试效果。"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn70kae1g9r73x5v5vn83saj7h86yevd\",\n  \"slug\": \"fableforge\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1779419048772\n}"},{"path":"resources/stages/stage_0_env.md","content":"# Stage 0: 自动化环境部署 (Scaffolding)\n\n当用户在一个空文件夹中首次要求“初始化项目”或“初始化 FableForge”时，**必须且仅需执行一次**本阶段。如果你发现当前目录已经有了 `template/` 和 `bin/`，则说明已初始化过，请直接跳过。\n\n**0.1 复制模板与模型资源**\nFableForge 的项目模板与语音模型代码已打包在 Skill 目录中。请执行以下命令：\n\n```bash\n# 复制 HTML 模板与脚本模板\ncp -r .agents/skills/fableforge/resources/template ./template\n\n# 复制语音模型脚手架\ncp -r .agents/skills/fableforge/resources/voice-model ./voice-model\n```\n\n**0.2 自动下载 FFmpeg 环境**\n本流水线强烈依赖 `ffmpeg` 与 `ffprobe`。请自动为用户下载静态构建版：\n\n```bash\ncurl -L https://evermeet.cx/ffmpeg/get/zip -o ffmpeg.zip && unzip -o ffmpeg.zip\ncurl -L https://evermeet.cx/ffmpeg/get/ffprobe/zip -o ffprobe.zip && unzip -o ffprobe.zip\nmkdir -p bin && mv ffmpeg bin/ && mv ffprobe bin/ && chmod +x bin/*\nrm ffmpeg.zip ffprobe.zip\n```\n\n**0.3 自动配置 VoxCPM2 Python 环境**\n执行以下命令为用户的语音克隆模型创建隔离环境并安装依赖：\n\n```bash\npython3 -m venv voice-model/venv\nsource voice-model/venv/bin/activate\npip install voxcpm soundfile torch numpy\n```\n\n**0.4 引导用户录制声纹样本**\n执行完毕后，请暂停并提示用户：\n> \"FableForge 环境已初始化完毕！请您用手机或电脑录制一段 15 秒的声音（朗读任意文本），将其导出为 `.wav` 格式，并放置在 `voice-model/01_samples/my_voice.wav`。准备好后请告诉我，我们就可以开始做视频了！\"\n\n**✅ Stage 0 退出标准：**\n- [ ] 当前工作区包含 `template/`、`voice-model/` 和 `bin/` 目录。\n- [ ] 用户确认已准备好声纹样本。"},{"path":"resources/stages/stage_1_creatives.md","content":"# Stage 1：概念、剧本与物料生成\n\n### 1.1 概念与大纲生成（须停机等待用户确认）\n\n根据确定的体裁 (Genre)，使用对应的提示词框架生成内容大纲：\n\n**对于 Genre X (叙事类)：**\n> \"请你从[指定领域]里，选择一个深度的概念。然后写一个寓言/历史故事，用间接的方式把这个概念讲清楚。不要一开始就说答案，到故事快结束时反转。最后解释概念及隐喻。\"\n\n**对于 Genre Y (分析类)：**\n> \"请你从[指定领域]里，挖掘一个反直觉的痛点现象。先描绘这个现象，然后拆解背后的核心矛盾/系统性崩溃原因，最后给出具有实操性的商业洞察或管理金句。\"\n\n**对于 Genre Z (宣发类)：**\n> \"请根据[产品/功能描述]，提取最核心的用户痛点和利益点，以短视频节奏输出一段极具转化率的宣发文案框架（痛点直击 -> 价值展示 -> CTA）。\"\n\n**去重检查**：生成前扫描工作空间内所有 `YYYYMMDD/视频脚本.md`，确保主题不与历史作品重复。\n\n⛔ **此步完成后必须停机，将生成的大纲/故事完整展示给用户，等待明确确认。未经确认严禁继续。**\n\n### 1.2 内容定档（用户确认大纲后立即执行）\n\n在动手写剧本之前，必须先完成内容定档。这是防止「好内容变烂视频」的关键步骤。\n\n**步骤：**\n\n1. **标记不可删减要素**：逐段扫描用户确认的内容大纲，用以下标签标记（见 0.3）：\n   - `[因果/逻辑]` — 逻辑链节点\n   - `[转折/对比]` — 认知翻转或数据对比\n   - `[核心金句]` — 结论闭环\n\n2. **计算最低旁白字数**：将所有标记要素的文本合适，得出「不可压缩下限」。\n\n3. **选档**：根据合计字数，在 §0.1 三档体系中选择对应档位。\n\n4. **输出定档报告**（写入 `视频脚本.md` 头部）：\n   ```markdown\n   ## 内容定档\n   - **原始内容字数**：{X} 字\n   - **不可删减要素字数**：{Y} 字\n   - **选定档位**：{S/M/L}\n   - **预估旁白总字数**：{Z} 字\n   - **预估视频时长**：{Z ÷ 3.5} 秒\n   ```\n\n⛔ **如果不可删减要素字数 > 450（S 档上限），严禁使用 S 档强行压缩。必须升档。**\n\n### 1.3 剧本转化\n\n将内容按选定档位的规格拆解为分镜剧本，写入 `YYYYMMDD/视频脚本.md`。\n\n**内容完整性自检（剧本写完后必须执行，全部通过才能进入下一步）：**\n\n- [ ] **盲测**：让一个没读过原文的人只看剧本旁白，能否独立理解核心价值（故事结局/分析结论）？如果不能，说明删多了。\n- [ ] **因果/逻辑链完整**：每个「结论」都有对应的「事件/数据」作为铺垫，没有凭空冒出的道理。\n- [ ] **Genre X 专属**：角色有动作有对话，不能只靠旁白概括。\n- [ ] **Genre Y 专属**：痛点现象的铺垫是否足以推导出最终的解决方案和金句？\n\n剧本格式模板：\n```markdown\n## 分镜 scene_cover — 封面/标题幕\n- **情绪档位**：1\n- **旁白**：{通常为视频标题或引导句}\n- **画面描述**：{高吸引力、悬念感强的提示词}\n\n## 分镜 {N} — {幕名}\n- **时间（草稿估算）**：第 {X} ～ {Y} 秒\n- **情绪档位**：{1/2/3/4}\n- **旁白**：{中文30~80字}\n- **画面描述**：{图片提示词，中英文均可}\n\n## 分镜 scene_end — 结尾/升华幕\n- **情绪档位**：4\n- **旁白**：{点题金句，不超过 20 字}\n- **画面描述**：{意境深远、呼应主题的提示词}\n```\n\n### 1.4 TTS 语音生成\n\n**声纹选择（优先意识）：**\n- **默认原则**：优先检查 `/语音模型/voxenv` 环境。若存在，**必须**使用用户的声纹克隆生成旁白。\n- **降级方案**：仅在用户明确要求或克隆环境不可用时，才使用 Kokoro 等通用模型。\n\n**语音节奏优化：**\n\nVoxCPM2 的情绪输出相对平稳，需要在文本层面手动注入戏剧感。处理规则：\n\n- 在核心关键词前插入 `……`，让模型自动降速放重音\n- 超过 130 字的段落用 `|||` 在语气转折处手动分段\n- 档位 4（沉默留白幕）的旁白每个词组之间都加 `……`\n\n```\n❌ 平铺直叙：\n\"你以为选出了战将，其实你只选出了最擅长残杀队友的屠夫。\"\n\n✅ 有停顿感的版本：\n\"你以为……选出了战将。|||其实，你只筛选出了——最擅长残杀队友的……屠夫。\"\n```\n\n在项目目录下执行：\n\n```bash\n# 使用本地 VoxCPM2 模型生成语音（必须使用虚拟环境的 Python）\n# 1. 复制并编辑生成脚本（每个项目独立一份）\ncp /Users/lucas/Work/09.Antigravity/语音模型/generate_cantillon.py \\\n   /Users/lucas/Work/09.Antigravity/语音模型/generate_{project_name}.py\n# 2. 编辑 TARGET_TEXT、OUTPUT_FILE 等变量\n# 3. 运行\n/Users/lucas/Work/09.Antigravity/语音模型/voxenv/bin/python3 \\\n  /Users/lucas/Work/09.Antigravity/语音模型/generate_{project_name}.py\n```\n\n### 1.5A 图片素材生成（模式 A）\n\n> ℹ️ 仅模式 A（纯图片）执行此步。模式 B 跳转至 §1.5B。\n\n按剧本中每幕的\"画面描述\"逐一生成图片，命名严格遵循 `scene1.png`、`scene2.png` ... `scene{N}.png`，保存至 `YYYYMMDD/assets/`。\n\n**批量生成策略（应对 API 配额限流）：**\n\n图片生成 API 通常有速率限制（如每窗口期 5 张）。为避免流程阻塞，采用以下策略：\n\n1. **先批量准备提示词**：在生成前，将全部场景的提示词按风格圣经公式组装完毕，写入剧本。\n2. **分批生成 + 穿插其他工作**：每批生成到限流后，立即切换到其他 Stage 的工作（如音频分析、HTML 搭建），不要干等。\n3. **生成即归档**：每张图生成后立即 `cp` 到 `assets/` 目录并验证文件名，避免最后批量操作时遗漏。\n4. **断点续传**：用 `ls assets/scene*.png | wc -l` 检查进度，只生成缺失的图片。\n\n### 1.5B 视频 B-roll 素材采集与裁剪（模式 B）\n\n> ℹ️ 仅模式 B（视频 + 文字叠加）执行此步。模式 A 跳转至 §1.5A。\n\n**步骤 1 — B-roll 关键词策划：**\n\n根据每幕的情绪和主题，在 `视频脚本.md` 中列出搜"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"FableForge 通用视频生成流水线 SOP。支持两种生产模式（图片流、视频 B-roll 流）和三种体裁（叙事寓言、商业分析、产品宣发）。包含从概念生成、剧本创作、TTS 配音、素材采集、到 HyperFrames 视频渲染的完整工业化 SOP，以及视觉风格指南与技术陷阱手册。v1.2.0 新增 VAD 物... Skill: Fableforge Owner: lucas-kay8 Summary: FableForge 通用视频生成流水线 SOP。支持两种生产模式（图片流、视频 B-roll 流）和三种体裁（叙事寓言、商业分析、产品宣发）。包含从概念生成、剧本创作、TTS 配音、素材采集、到 HyperFrames 视频渲染的完整工业化 SOP，以及视觉风格指南与技术陷阱手册。v1.2.0 新增 VAD 物... Tags: latest:1.2.0 Version history: v1.2.0 | 2026-05-22T03:04:08.772Z | user v1.2.0: 引入VAD声学平铺匹配、语速自动健康度审计门禁、大分镜GSAP变量解耦与生命周期控制 v1.1.0 | 2026-05-20T11:21:51.456Z | user FableForge 技能升级至 v1.1.0，新增全局禁令、素材新鲜度校验、渲染前集成检","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":554,"uniquenessScore":61,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T14:32:52.266Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T14:32:52.266Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:43:37.944Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}