<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AI视频生成 on 我的博客</title><link>https://blog.5616760.com/tags/ai%E8%A7%86%E9%A2%91%E7%94%9F%E6%88%90/</link><description>Recent content in AI视频生成 on 我的博客</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Mon, 19 Oct 2026 23:30:00 +0800</lastBuildDate><atom:link href="https://blog.5616760.com/tags/ai%E8%A7%86%E9%A2%91%E7%94%9F%E6%88%90/index.xml" rel="self" type="application/rss+xml"/><item><title>sweety-handdraw-video：让 Agent 按旁白作画的手绘视频 Skill——预算制分镜、拟人运笔与 21 种画风</title><link>https://blog.5616760.com/0053.html</link><pubDate>Mon, 19 Oct 2026 23:30:00 +0800</pubDate><guid>https://blog.5616760.com/0053.html</guid><description>&lt;p&gt;先给结论：&lt;strong&gt;sweety-handdraw-video 不是&amp;quot;AI 视频生成&amp;quot;项目，它是一条「模型导演 + 本地引擎」的混合流水线——把创作判断交给 Agent，把渲染确定性交给 Python 脚本。&lt;/strong&gt; 市面上的图生视频方案（Sora、可灵一类）走的是「文本提示 → 扩散模型整段生成」，笔触不可控、内容不可核对、中文字写不出笔顺、画面时间轴对不上旁白。这个项目换了一条路：&lt;strong&gt;Agent 负责理解内容、写口播、设计分镜、生成插画；本地引擎负责逐笔描线、按笔顺手写、配音对齐和导出，每一笔的位置和时刻都是算出来的，不是抽出来的。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="图：《那条死于愤怒的蛇》样片封面，v1.2 流程制作，49 秒淡彩叙事插画" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.5616760.com/img/0053-001.jpg"&gt;&lt;/p&gt;&#10;&lt;h2 id="目录"&gt;目录&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%b8%80%e5%ae%83%e6%98%af%e4%bb%80%e4%b9%88%e4%b8%80%e5%91%a8-715-star-%e7%9a%84%e6%89%8b%e7%bb%98%e8%a7%86%e9%a2%91-skill" &gt;它是什么：一周 715 star 的手绘视频 Skill&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%ba%8c%e5%ae%83%e8%a7%a3%e5%86%b3%e7%9a%84%e9%97%ae%e9%a2%98%e6%89%8b%e7%bb%98%e8%a7%86%e9%a2%91%e4%b8%ba%e4%bb%80%e4%b9%88%e9%9a%be" &gt;它解决的问题：手绘视频为什么难&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%b8%89%e4%ba%94%e6%ad%a5%e6%b5%81%e6%b0%b4%e7%ba%bf%e4%bb%8e%e4%b8%bb%e9%a2%98%e5%88%b0%e6%88%90%e7%89%87" &gt;五步流水线：从主题到成片&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%9b%9b%e9%a2%84%e7%ae%97%e5%88%b6%e5%88%86%e9%95%9c%e5%85%88%e7%ae%97%e7%94%bb%e5%be%97%e5%ae%8c%e5%86%8d%e7%94%9f%e5%9b%be" &gt;预算制分镜：先算画得完，再生图&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%ba%94%e5%85%ad%e7%a7%8d%e5%af%bc%e6%bc%94%e5%af%86%e5%ba%a6%e6%a8%a1%e5%bc%8f" &gt;六种导演密度模式&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%85%ad%e5%83%8f%e4%ba%ba%e4%b8%80%e6%a0%b7%e7%94%bb%e8%bf%90%e7%ac%94%e7%9a%84%e7%89%a9%e7%90%86%e5%b8%b8%e6%95%b0" &gt;像人一样画：运笔的物理常数&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%b8%83%e6%b8%b2%e6%9f%93%e5%bc%95%e6%93%8e%e4%b8%8e%e5%ad%97%e5%b9%95%e7%a1%ac%e9%97%a8%e6%a7%9b" &gt;渲染引擎与字幕硬门槛&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%85%ab%e9%85%8d%e9%9f%b3%e6%97%81%e7%99%bd%e5%85%88%e8%a1%8c%e4%b8%8e%e8%af%ad%e4%b9%89%e5%88%86%e6%ae%b5%e9%97%a8%e7%a6%81" &gt;配音：旁白先行与语义分段门禁&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%b9%9d21-%e7%a7%8d%e7%94%bb%e9%a3%8e%e4%b8%8e%e5%85%ad%e6%ac%be%e6%89%8b%e8%87%82" &gt;21 种画风与六款手臂&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%8d%81%e5%b7%a5%e7%a8%8b%e7%bb%86%e8%8a%8250mb-%e7%a6%bb%e7%ba%bf%e5%8c%85%e4%b8%8e%e9%95%9c%e5%83%8f%e4%bf%ae%e5%a4%8d" &gt;工程细节：50MB 离线包与镜像修复&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%8d%81%e4%b8%80%e8%af%9a%e5%ae%9e%e7%9a%84%e8%be%b9%e7%95%8c%e5%ae%83%e8%87%aa%e5%b7%b1%e5%86%99%e4%b8%8b%e7%9a%84%e9%99%90%e5%88%b6" &gt;诚实的边界：它自己写下的限制&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%8d%81%e4%ba%8c%e6%88%90%e7%86%9f%e5%ba%a6%e8%af%84%e4%bc%b0" &gt;成熟度评估&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%8d%81%e4%b8%89%e7%bb%93%e8%af%ad" &gt;结语&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="一它是什么一周-715-star-的手绘视频-skill"&gt;一、它是什么：一周 715 star 的手绘视频 Skill&#10;&lt;/h2&gt;&lt;p&gt;一句话：&lt;strong&gt;一个安装在 Claude Code / Codex 里的 Agent Skill，输入一个主题、一篇文章或一个完整故事，输出边画边讲的有声 MP4——Agent 当导演，本地 Python 引擎当画手。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;数据快照（&lt;strong&gt;2026-10-20&lt;/strong&gt; 通过 GitHub API 与仓库源码核实）：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;维度&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;数据&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;仓库&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;threerocks/sweety-handdraw-video&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;定位&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;手绘口播视频制作 Skill（白板动画 / 文章转讲解）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Stars / Forks&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;715 / 136&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Open Issues&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;创建时间&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;2026-10-12&lt;/strong&gt;（至今 8 天）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;累计提交&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;76&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;最新 Release&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;v1.4.1&lt;/strong&gt;（2026-10-19）；包内 &lt;code&gt;VERSION&lt;/code&gt; 文件为 &lt;code&gt;1.4.1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;许可&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MIT（主项目；内置依赖保留各自许可）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;文件总数&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;1,009&lt;/strong&gt;（其中 &lt;code&gt;skills/&lt;/code&gt; 占 981，即内置依赖与素材）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;安装包体积&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;843 个文件 / &lt;strong&gt;49.4 MB&lt;/strong&gt;（v1.3 实测核验）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;宿主与平台&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Claude Code、Codex；&lt;strong&gt;macOS 与 Linux&lt;/strong&gt;（Windows 暂不承诺）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;技术栈&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Python 3.9+（Pillow / NumPy / SciPy / fontTools）+ FFmpeg&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;作者&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;leo_xiaolei（X：&lt;a class="link" href="https://x.com/leo_xiaolei" target="_blank" rel="noopener"&#10; &gt;@leo_xiaolei&lt;/a&gt;）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;几个数字值得单独说：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;8 天 715 star、76 次提交&lt;/strong&gt;。这个star 增速在工具类项目里属爆发级别，且迭代极快——10-12 建仓库，10-13 就连发 v1.2.1/v1.2.2/v1.2.3 三个封板，10-17 发 v1.3，10-19 发 v1.4.1。版本号里能看到功能演进：v1.2 封板包含整篇连续旁白和原片参考导入，v1.3 加了声音门禁和素材随包，v1.4 转向原生选项、9:16 竖屏默认和导演密度契约。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;1,009 个文件里 981 个在 &lt;code&gt;skills/&lt;/code&gt; 目录&lt;/strong&gt;——这不是冗余，是它把五个上游项目以固定快照内置了：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;内置依赖&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;职责&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;sweety-image-art-direction&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;主体、接触关系、构图、比例与观看主次&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;hand-drawn-styles&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;风格配方、参考锚点与预览&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;omniailab-ai-director&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;导演规划、叙事、声画关系与终审方法&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;huashu-art-motion&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;适用题材下的艺术动效方法&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;sweety-image-privacy&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;图像隐私元数据清理与审计&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;「内置而不安装」是个明确的工程取舍：运行时&lt;strong&gt;不自动追踪上游更新&lt;/strong&gt;，用快照换可复现。README 把来源、许可和固定快照写进了 &lt;code&gt;THIRD_PARTY_NOTICES.md&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;三条精选样片（均为 1920×1080、30fps，Release 下载）：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;样片&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;时长&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;风格配置&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;《那条死于愤怒的蛇》&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;49 秒&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;淡彩叙事插画、毛笔手部、无底板字幕&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;《快乐囚禁你的方式》&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1 分 52 秒&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;冷色棱角插画、女性手部、连续女声旁白&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;《墨菲定律》&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;约 2 分 05 秒&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;淡彩速写、碎钻长甲手、笔杆文字；8 个画面、24 段口播&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;img alt="图：《快乐囚禁你的方式》封面" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.5616760.com/img/0053-004.jpg"&gt;&lt;img alt="图：《墨菲定律》封面，v1.0.0 历史样片" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.5616760.com/img/0053-005.jpg"&gt;&lt;/p&gt;&#10;&lt;h2 id="二它解决的问题手绘视频为什么难"&gt;二、它解决的问题：手绘视频为什么难&#10;&lt;/h2&gt;&lt;p&gt;要理解这个项目的设计选择，先得看清「让 AI 做手绘讲解视频」这件事难在哪。三条路线各有各的坑：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;路线&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;问题&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;图生视频模型（Sora / 可灵类）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;笔触是&amp;quot;抽&amp;quot;出来的，不可控、不可核对；画面时间轴对不上旁白；中文按笔顺书写基本无解&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;通用动画软件 + 手动 K 帧&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;一条两分钟视频要 K 几百个关键帧，改一句话全部重来&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;开源白板动画工具（VideoScribe 类）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;模板化、素材库封闭，做不了内容驱动的定制插画&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;这个项目的答案是把流水线&lt;strong&gt;切成两半&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; subgraph OLD["图生视频模型路线"]&#10; A1["文本提示词"] --&gt; A2["扩散模型&lt;br/&gt;整段生成"]&#10; A2 --&gt; A3["笔触不可控&lt;br/&gt;内容不可核对"]&#10; end&#10; subgraph NEW["sweety-handdraw-video"]&#10; B1["SKILL.md&lt;br/&gt;模型当导演"] --&gt; B2["口播稿 + 分镜 + 插画"]&#10; B2 --&gt; B3["Python 引擎&lt;br/&gt;逐笔确定性渲染"]&#10; B3 --&gt; B4["每笔可检查&lt;br/&gt;每帧可复现"]&#10; end&#10; style A3 fill:#fff1f0,stroke:#d9534f,color:#8a2b28&#10; style B4 fill:#f0f7ff,stroke:#2f6fb5,color:#1c4570&lt;/pre&gt;&lt;p&gt;关键在于分工边界：&lt;strong&gt;模型负责&amp;quot;画什么、讲多久、用什么风&amp;quot;，脚本负责&amp;quot;画得完画不完、运笔像不像人、字幕压没压图&amp;quot;&lt;/strong&gt;。SKILL.md 里有一句话把这份分工写得很直白：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;主体内容由模型设计；脚本只执行已确定的素材与时间线，并用客观指标拦截错误。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;翻译成工程语言：&lt;strong&gt;模型是创作者，脚本是护栏&lt;/strong&gt;。护栏不创作，只拦截——旁白没锁不给渲染、分镜没算预算不给生图、线稿门槛不过不给编排、检查记录过期不给交付。这套边界感是后面所有机制的前提。&lt;/p&gt;&#10;&lt;h2 id="三五步流水线从主题到成片"&gt;三、五步流水线：从主题到成片&#10;&lt;/h2&gt;&lt;p&gt;完整流程在 SKILL.md 里固化为六步，我按数据流重新画了一遍：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD&#10; S1["① 讲清因果&lt;br/&gt;受众 · 机制 · 反例 → design.json"] --&gt; S2["② 旁白先行&lt;br/&gt;完整口播稿 → 语义分段 → 逐段合成"]&#10; S2 --&gt; S3["③ 分镜算预算&lt;br/&gt;storyboard_lint.py --budget"]&#10; S3 --&gt; S4["④ 生图&lt;br/&gt;美术指导 + 缩略图/线稿门槛"]&#10; S4 --&gt; S5["⑤ 编排渲染&lt;br/&gt;job.json 时间线 → FFmpeg"]&#10; S5 --&gt; S6["⑥ 分层核对&lt;br/&gt;verify / review.json"]&#10; S3 -- 预算不足 --&gt; S3R["改分镜：减视觉 / 加 beat / 并板"]&#10; S3R --&gt; S3&#10; style S3 fill:#fff7e6,stroke:#d48806,color:#7a4d00&#10; style S6 fill:#f0f7ff,stroke:#2f6fb5,color:#1c4570&lt;/pre&gt;&lt;p&gt;两个反直觉的顺序值得注意：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;声音先于画面。&lt;/strong&gt; 不是先出图再配音，而是先写完整口播稿、逐段合成、拼成母带、生成 &lt;code&gt;alignment.json&lt;/code&gt; 逐句时间戳——然后&lt;strong&gt;用时间戳反推每幅画能画几秒&lt;/strong&gt;。这解决了手绘视频最经典的死局：画面画完了，旁白没说这么长。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;生图前先算账。&lt;/strong&gt; 分镜按旁白算出每个 visual 的绘制窗口和笔数上限，图按预算设计。约 3 倍人速画得完就停，笔忙占比受模式约束且不超过 70%。画不完的图不是渲染时压缩时间轴（那会变成&amp;quot;快进糊弄&amp;quot;），而是&lt;strong&gt;上游简化图片或把窗口跨句延长&lt;/strong&gt;——&lt;code&gt;storyboard_lint.py&lt;/code&gt; 里对&amp;quot;引擎超预算&amp;quot;是直接判 error 的：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; asset&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(&lt;span style="color:#e6db74"&gt;&amp;#39;time_compression&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.001&lt;/span&gt; &lt;span style="color:#f92672"&gt;or&lt;/span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt; speed_over_cap &lt;span style="color:#f92672"&gt;or&lt;/span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt; fill_over_cap:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; errors&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;label&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: the engine exceeded its drawing budget; simplify the image or extend its window across beats instead of compressing its strokes&amp;#39;&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="四预算制分镜先算画得完再生图"&gt;四、预算制分镜：先算画得完，再生图&#10;&lt;/h2&gt;&lt;p&gt;这是整个项目里我最欣赏的部分，也是它与&amp;quot;AI 生成视频&amp;quot;拉开本质差距的地方。核心问题一句话：&lt;strong&gt;给定一段真实时长的旁白，每幅图能画几秒、能画几笔？&lt;/strong&gt; &lt;code&gt;storyboard_lint.py&lt;/code&gt;（479 行）把这个问题做成了可执行的门禁。&lt;/p&gt;&#10;&lt;h3 id="41-绘制节奏的标定常数"&gt;4.1 绘制节奏的标定常数&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;STROKES_PER_SECOND &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3.5&lt;/span&gt; &lt;span style="color:#75715e"&gt;# measured draw-v2 pace at the cap: contour strokes, pen lifts and marker color included&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MAX_DRAWING_SHARE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;.7&lt;/span&gt; &lt;span style="color:#75715e"&gt;# the pen is busy at most this share of the narration&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3.5 笔/秒不是拍的脑袋——注释写明是 draw-v2 引擎实测节奏，且&lt;strong&gt;轮廓笔、抬笔移动、马克笔上色都算笔数&lt;/strong&gt;。70% 是笔忙占比上限：剩下的 30% 必须留给观众看完成图。这两个数决定了后面所有的分档和窗口计算。&lt;/p&gt;&#10;&lt;h3 id="42-按秒数分档的复杂度契约"&gt;4.2 按秒数分档的复杂度契约&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tier&lt;/span&gt;(seconds, hold):&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; strokes &lt;span style="color:#f92672"&gt;=&lt;/span&gt; max(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, int(seconds &lt;span style="color:#f92672"&gt;*&lt;/span&gt; STROKES_PER_SECOND))&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; seconds &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;label or tiny icon: at most ~&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;strokes&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; strokes&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; seconds &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;simple icon/silhouette: at most ~&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;strokes&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; strokes, flat fills&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; seconds &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; hold:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;one subject: at most ~&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;strokes&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; strokes, flat fills, no texture lines&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;at most ~&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;strokes&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; strokes: a scene with background ... or split into two visuals&amp;#39;&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一幅图能画几秒，就只允许几笔——不到 3 秒的窗口只配画个小图标或标签，超过单镜停留上限的要么画带背景的场景（靠部位分节拍撑时间），要么拆成两幅。&lt;strong&gt;复杂度不是美术喜好，是时间预算的函数。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="43-窗口与视觉数量两条硬公式"&gt;4.3 窗口与视觉数量：两条硬公式&#10;&lt;/h3&gt;&lt;p&gt;每个 visual 的绘制窗口这样算：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cursor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; start &lt;span style="color:#f92672"&gt;+&lt;/span&gt; LEAD &lt;span style="color:#75715e"&gt;# LEAD = 0.54&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;window &lt;span style="color:#f92672"&gt;=&lt;/span&gt; times[shot[&lt;span style="color:#e6db74"&gt;&amp;#39;beats&amp;#39;&lt;/span&gt;][&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]][&lt;span style="color:#e6db74"&gt;&amp;#39;end&amp;#39;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; HOLD &lt;span style="color:#f92672"&gt;-&lt;/span&gt; cursor &lt;span style="color:#f92672"&gt;-&lt;/span&gt; GAP &lt;span style="color:#f92672"&gt;*&lt;/span&gt; max(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, len(visuals) &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#75715e"&gt;# HOLD = 0.6, GAP = 0.08&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;seconds &lt;span style="color:#f92672"&gt;=&lt;/span&gt; window &lt;span style="color:#f92672"&gt;*&lt;/span&gt; weight &lt;span style="color:#f92672"&gt;/&lt;/span&gt; sum(weights)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;即：镜头内首 beat 起点 + 0.54 秒起笔，末 beat 终点前留 0.6 秒收尾，多个 visual 之间留 0.08 秒抬笔间隔，剩余时间按权重分配。窗口不足 0.5 秒直接报错：「only Xs to draw; give the shot more beats or fewer visuals」。&lt;/p&gt;&#10;&lt;p&gt;全片视觉数量也有下限：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;required &lt;span style="color:#f92672"&gt;=&lt;/span&gt; max(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, math&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ceil(narration &lt;span style="color:#f92672"&gt;/&lt;/span&gt; hold &lt;span style="color:#f92672"&gt;*&lt;/span&gt; rules[&lt;span style="color:#e6db74"&gt;&amp;#39;cadence_factor&amp;#39;&lt;/span&gt;]))&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;旁白总时长除以单镜停留上限再乘模式系数——&lt;strong&gt;信息密度不够会被拦&lt;/strong&gt;，而且报错信息直接告诉你该往哪加：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;3 planned visuals for 92.0s of narration; at least 12 are needed (a new visual every 8s).&#10;Add visuals to the sparsest shots: shot_07 (14.2s per visual), shot_03 (12.8s per visual) ...&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;插画占比也有要求：图片数少于 &lt;code&gt;0.8 × required&lt;/code&gt; 且没写 &lt;code&gt;text_only_reason&lt;/code&gt; 时判错；纯文字镜头超过 20% 时长同样拦。&lt;strong&gt;宿主没有生图能力时必须停下告诉用户，不允许静默降级成&amp;quot;文字滚动视频&amp;quot;&lt;/strong&gt;——这条写在了错误信息里。&lt;/p&gt;&#10;&lt;h3 id="44-成片后的三项节奏复核"&gt;4.4 成片后的三项节奏复核&#10;&lt;/h3&gt;&lt;p&gt;预算检查只是&amp;quot;计划&amp;quot;，渲染完还有&amp;quot;实测&amp;quot;三件套：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;指标&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;门槛&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;含义&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;pen_busy_share&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;≤ 70%（模式可更严）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;笔在画的时间占比，含抬笔；超了说明完成图留不出阅读时间&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;finished_picture_hold_share&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;≥ 30%&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;完成图的静态阅读时间占比；不含片头空白和结尾静音&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;最长静止段&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;≤ &lt;code&gt;max_hold_seconds&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;超过 hold 秒&amp;quot;什么都没画&amp;quot;直接报错，要求拆镜或加视觉&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;还有一条防偷懒的：&lt;strong&gt;同一张主图连续占超过 2 个 beat 会被拦&lt;/strong&gt;，除非该镜标注了 &lt;code&gt;callback&lt;/code&gt; 并写明理由。完成图停留时间的中位数低于模式要求会警告，单幅低于 1 秒也警告——注释里给了标定基准：「the first Codex film held only 0.56s on average, validated films hold 1.1-1.7s」。&lt;/p&gt;&#10;&lt;h3 id="45-镜头类型不是随便填的"&gt;4.5 镜头类型不是随便填的&#10;&lt;/h3&gt;&lt;p&gt;七种 shot type 各有结构化真值条件，编剧意图要过代码校验：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SHOT_TYPES &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;scene_with_background&amp;#39;&lt;/span&gt;: (&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; visuals: any(v&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(&lt;span style="color:#e6db74"&gt;&amp;#39;kind&amp;#39;&lt;/span&gt;)&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;illustration&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;and&lt;/span&gt; v&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(&lt;span style="color:#e6db74"&gt;&amp;#39;background&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; v &lt;span style="color:#f92672"&gt;in&lt;/span&gt; visuals)),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;comparison&amp;#39;&lt;/span&gt;: (&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; visuals: sum(v&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(&lt;span style="color:#e6db74"&gt;&amp;#39;kind&amp;#39;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;in&lt;/span&gt; PICTURES &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; v &lt;span style="color:#f92672"&gt;in&lt;/span&gt; visuals) &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;character_action&amp;#39;&lt;/span&gt;: (&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; visuals: any(v&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(&lt;span style="color:#e6db74"&gt;&amp;#39;kind&amp;#39;&lt;/span&gt;)&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;illustration&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;and&lt;/span&gt; v&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(&lt;span style="color:#e6db74"&gt;&amp;#39;characters&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; v &lt;span style="color:#f92672"&gt;in&lt;/span&gt; visuals)),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;声明了 &lt;code&gt;comparison&lt;/code&gt; 却只放了一幅图、声明了 &lt;code&gt;character_action&lt;/code&gt; 却没有登记角色——都会被拦。角色必须绑定&lt;strong&gt;锁定参考图 + SHA-256&lt;/strong&gt;，且绘制计划里要引用该参考图，防止跨画面角色漂移。&lt;/p&gt;&#10;&lt;h2 id="五六种导演密度模式"&gt;五、六种导演密度模式&#10;&lt;/h2&gt;&lt;p&gt;v1.4 引入了 &lt;code&gt;presentation.mode&lt;/code&gt;——&lt;strong&gt;这不是用户选项，是导演根据受众和内容推断的密度契约&lt;/strong&gt;，写在 &lt;code&gt;design.json&lt;/code&gt; 和 &lt;code&gt;storyboard.json&lt;/code&gt; 里，由 &lt;code&gt;storyboard_lint.py&lt;/code&gt; 强制执行。六种模式的参数差异很大：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;模式&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;密度&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;单镜停留上限&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;视觉节拍系数&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;每镜图片上限&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;每镜标签上限&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;板复用&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;笔忙占比&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;完成图中位停留&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;picture_book&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;稀疏&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;10s&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.35&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;否&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;55%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;≥ 2.0s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;focus_diagram&lt;/code&gt;（默认）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;中&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8s&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;否&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;70%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;≥ 1.2s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dense_infographic&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;密集&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;7s&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.9&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;12&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;是&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;70%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;≥ 0.9s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;accumulating_board&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;密集&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;12s&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.55&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;是&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;70%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;≥ 0.8s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;step_sequence&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;中&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8s&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.05&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;否&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;60%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;≥ 1.3s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;narrative_comic&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;中&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8s&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;否&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;60%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;≥ 1.4s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;几个设计细节：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;accumulating_board&lt;/code&gt;（黑板报模式）的 cadence_factor 只有 0.55&lt;/strong&gt;——同一块板跨 beat 累积，不需要每句重画整页，所以&amp;quot;每 hold 秒一幅新图&amp;quot;的要求减半。它还要求整页先规划 &lt;code&gt;boards&lt;/code&gt; 的区域位置，同一块板在一张物理页面上按阅读顺序逐项补齐，&lt;strong&gt;不每句话清场&lt;/strong&gt;。这是从&amp;quot;白板动画&amp;quot;向&amp;quot;课堂板书&amp;quot;的关键扩展。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;模式必须带 &lt;code&gt;reason&lt;/code&gt;&lt;/strong&gt;。&lt;code&gt;validate_presentation()&lt;/code&gt; 强制要求解释为什么这个模式适合受众和内容，density 字段还必须与模式内置值一致——想手动把 &lt;code&gt;picture_book&lt;/code&gt; 标成 dense 会被拒。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;模式是推断出来的，不是问出来的&lt;/strong&gt;。&lt;code&gt;infer_hints()&lt;/code&gt; 给模型的先验很直白：儿童叙事走绘本、单概念深挖走焦点图、清单对比走信息图、连续板书走黑板报、操作流程走步骤序列。用户不选，模型按内容定。&lt;/p&gt;&#10;&lt;h2 id="六像人一样画运笔的物理常数"&gt;六、像人一样画：运笔的物理常数&#10;&lt;/h2&gt;&lt;p&gt;如果说预算制分镜保证了&amp;quot;画得完&amp;quot;，&lt;code&gt;line_drawing.py&lt;/code&gt;（306 行）保证的就是&amp;quot;像人在画&amp;quot;。它的做法是把拟人感拆成一组可标定的物理常数：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;常数&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;值&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;含义&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;LINE_SPEED&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;420 px/s&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1080p 下人类描一条自信轮廓的笔速&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;SPEED_FACTOR&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;倍速标定：4–8 倍速的快手视频仍读作人类，&lt;strong&gt;前提顺序连贯&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;VIDEO_LAPSE&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;约 3 倍人速画完就停，&lt;strong&gt;绝不慢放填充窗口&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;FRAME_PX&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;80 px&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;描线笔尖单帧最大位移，超过就不像连续运动&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;TRAVEL_PX&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;120 px&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;抬笔移动的单帧峰值，防&amp;quot;瞬移&amp;quot;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;DETAIL_BOOST&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;细节和短标记允许比主笔快 1.6 倍&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;PART_PAUSE&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.18 s&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;语义部位之间的思考停顿（随倍速缩放）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;REVERSE_COST&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;250 px&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;右手偏好：宁可多绕 250 px，也不向左/向上画&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;这组常数撑起了几个具体的拟人机制：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;转弯自动减速。&lt;/strong&gt; 弧长计算不是欧氏长度，而是按曲率加权——&lt;code&gt;steps * (1 + 1.5 * clip(turn / (π/8), 0, 1))&lt;/code&gt;，转弯处弧长膨胀，笔尖在曲线和拐角自然放慢。转角用 ±6 px 窗口测量，防止骨架像素抖动被误判为弯曲。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;右手方向偏好。&lt;/strong&gt; &lt;code&gt;REVERSE_COST = 250&lt;/code&gt; 的注释写得很直白：「px of extra travel a right-hander accepts rather than draw a line upward or leftward」。路径规划时，向左或向上画一笔要计入 250 px 的额外代价——于是笔画方向整体呈现出右手绘制的顺手感。倍速顶上还有个 &lt;code&gt;HURRIED = REVERSE_COST / SPEED_FACTOR = 62.5&lt;/code&gt;：手快到顶上时，方向偏好让步于速度。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;两种速度剖面。&lt;/strong&gt; &lt;code&gt;stroke_profile()&lt;/code&gt; 按笔画长度和人速倍率切换：长笔画在倍速模式下用 plateau（两端缓入缓出、中间巡航），短笔画用 min-jerk。&lt;code&gt;lift_seconds()&lt;/code&gt; 算抬笔时间——人类节奏 80–150 ms，随墨迹同步倍速，2 帧保底，且要满足抬笔移动的帧内位移不超 &lt;code&gt;TRAVEL_PX&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;部位分级与停顿。&lt;/strong&gt; 笔画按 &lt;code&gt;SILHOUETTE / KEY / STRUCTURE / DETAIL / TEXTURE&lt;/code&gt; 五档归类（&lt;code&gt;KEY_PART&lt;/code&gt; 正则认 head/face/eye/mouth/nose/hand/finger/paw 这些关键部位），每个语义部分先轮廓后细节，部分之间停 0.18 秒——像人画完一个部分停下来想下一步。注释里给这部分的总纲是：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Order, time and render whole line strokes like a right-handed person: per part the silhouette first, then long interior structure, then details and short marks.&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;img alt="图：《那条死于愤怒的蛇》实际绘制过程节选（无声动图，v1.2）" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.5616760.com/img/0053-003.webp"&gt;&lt;/p&gt;&#10;&lt;h2 id="七渲染引擎与字幕硬门槛"&gt;七、渲染引擎与字幕硬门槛&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;video_renderer.py&lt;/code&gt;（529 行）负责把时间线渲染成帧：手部合成、路径文字、马克笔运动、水印。几个细节见功力：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;手腕倾角上限 7 度&lt;/strong&gt;（&lt;code&gt;MAX_TILT = 7&lt;/code&gt;）——手臂跟随时加一点手腕转动，但不许过，过了就是&amp;quot;橡皮手&amp;quot;。&lt;strong&gt;阴影方向统一为向右下&lt;/strong&gt;（&lt;code&gt;SHADOW_DIRECTION = (0.555, 0.832)&lt;/code&gt;，光源在左上），连笔杆阴影都按笔尖起算、随 barrel 距离漂移（&lt;code&gt;PEN_SHADOW_SLOPE = 0.2&lt;/code&gt;）。手臂进出场 0.45/0.5 秒、镜头停留 1 秒——短于 1 秒的抬笔间隔会让手&amp;quot;留在画面里抢戏&amp;quot;。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;每个像素都有语义归属。&lt;/strong&gt; 质量门禁要求每个插画像素归到具体部位，所有轮廓结束后才填色，且两个阶段按同一部位顺序。部位审查还要处理遮挡关系——「发丝间露出的伞面属于伞，手持物不属于手臂，包与腿相交处按实际前后关系分配」。程序只能验证给定归属的执行顺序，&lt;strong&gt;不能证明模型分区语义正确&lt;/strong&gt;——这句自我认知也写进了文档。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;字幕唯一性是交付硬门槛。&lt;/strong&gt; 同一句旁白同一时刻只允许一份字幕：画面烘焙、字幕事件、MP4 内嵌轨、网页 &lt;code&gt;&amp;lt;track&amp;gt;&lt;/code&gt;、播放器自动加载，五条路都不许叠加。build 时就检查字幕避让——插画像素不得压进字幕区（含边距），不等渲染后才发现。编辑用字幕只能放 &lt;code&gt;outputs/editing/&lt;/code&gt;。交付时检查成片无额外字幕轨、同目录无 SRT/ASS/VTT，并实际看解码画面的长句、换句和片尾。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;检查记录分三层，不许互相顶替。&lt;/strong&gt; &lt;code&gt;review.json&lt;/code&gt; 里工程检查（&lt;code&gt;verify&lt;/code&gt;）、观感检查（&lt;code&gt;visual&lt;/code&gt; / &lt;code&gt;motion&lt;/code&gt; / &lt;code&gt;content&lt;/code&gt;）、连续播放和实际听音分别记录。&lt;code&gt;continuous_playback&lt;/code&gt; 和 &lt;code&gt;listening&lt;/code&gt; 只能是 &lt;code&gt;pass&lt;/code&gt; 或 &lt;code&gt;not_done&lt;/code&gt;（写原因），&lt;strong&gt;做了 ASR 不等于听过&lt;/strong&gt;——文档原话：「若只检查了 ASR，不能写&amp;rsquo;已经完整听过&amp;rsquo;」。抽帧能验证字形和版面，不能单独证明全片运动流畅。用户拒绝成片有专门命令：&lt;code&gt;handdraw_video.py reject JOB --reason &amp;quot;用户原话&amp;quot;&lt;/code&gt;，回执改为&amp;quot;用户已拒绝，需要返工&amp;quot;，这一版不能再 finalize。&lt;/p&gt;&#10;&lt;h2 id="八配音旁白先行与语义分段门禁"&gt;八、配音：旁白先行与语义分段门禁&#10;&lt;/h2&gt;&lt;p&gt;声音在这条流水线里是&lt;strong&gt;时间轴的主锚&lt;/strong&gt;，所有画面节奏都由它倒推。管线设计：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; V1["完整口播稿"] --&gt; V2["语义分段&lt;br/&gt;每段 ≤100 字 · 只在句末切"]&#10; V2 --&gt; V3["逐段合成&lt;br/&gt;VoxCPM2 / VoiceStudio"]&#10; V3 --&gt; V4{"噪声门禁&lt;br/&gt;嗡声 · 底噪 · 削波"}&#10; V4 -- "不通过 → 换种子重试" --&gt; V3&#10; V4 -- 通过 --&gt; V5["拼接母带&lt;br/&gt;实测停顿 · 不一律删静音"]&#10; V5 --&gt; V6["alignment.json&lt;br/&gt;逐句时间戳"]&#10; V6 --&gt; V7["分镜预算 / 字幕 / 运笔&lt;br/&gt;全部由时间戳驱动"]&#10; style V4 fill:#fff7e6,stroke:#d48806,color:#7a4d00&lt;/pre&gt;&lt;p&gt;几个关键决策：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;按语义分段，每段不超过约 100 字，只在句末切。&lt;/strong&gt; 不按标点硬切、不跨句合并——保证每段的韵律完整，重读某句时只重新生成变化的语义段落。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;每段过噪声门禁才保留。&lt;/strong&gt; 嗡声、底噪、削波三项，不通过就换种子重试。这不是矫情——样片《那条死于愤怒的蛇》原版旁白带 235 Hz 嗡声，v1.3 门禁会直接拦截。拼接母带时用&lt;strong&gt;实测停顿&lt;/strong&gt;，禁止&amp;quot;一律删静音、缩短所有停顿或全片交叉淡化&amp;quot;来掩盖错误，真实换气和语义停顿要保留。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;四类配音后端，音色与后端分离：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;路径&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;说明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VoxCPM2 本地适配器&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Apple Silicon + MLX；项目用 VoxCPM2-8bit，权重约 &lt;strong&gt;3.23 GB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VoiceStudio 本机服务&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;默认 &lt;code&gt;http://127.0.0.1:3900&lt;/code&gt;，已对接 Qwen3-TTS-12Hz-1.7B-Base-bf16&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;现成整篇旁白&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;离线编排渲染，不重新合成&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;火山豆包 / Gemini TTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;用户自带密钥，非默认路径（只做过模拟 HTTP 测试）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;六款声音里四款随包合成（磁性解说男声为默认、儒雅青年、温柔知性女声、悬疑故事解说），逼真男声/女声沿用原片参考、需用户自行导入。随包合成声音由本机 VoxCPM2 &lt;strong&gt;仅凭文字描述设计&lt;/strong&gt;，未使用真人/主播/平台音色作参考；用户导入声音要声明授权（&lt;code&gt;consent: self&lt;/code&gt; / &lt;code&gt;consent: authorized&lt;/code&gt;），不克隆公众人物音色。作者本机环境是 M3 Max / 36GB——这是跑 3.23 GB 模型的家底，换个 8GB 的机器这条路直接不用考虑。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;改一句话不必全部重做。&lt;/strong&gt; 只改字幕/笔杆/水印/布局可复用图和声音；改口播正文只重新生成变化的语义段落。但改旁白后&lt;strong&gt;必须重算画面和字幕&lt;/strong&gt;——「不能让视频页面成为声音切口」。&lt;/p&gt;&#10;&lt;h2 id="九21-种画风与六款手臂"&gt;九、21 种画风与六款手臂&#10;&lt;/h2&gt;&lt;p&gt;画风库是 20 个编号风格 + 一个稳定变体，按绘制方式分两类：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;逐笔绘制&lt;/strong&gt;（先描线后上色）：编号 1、4、5、17、19、20——清晰墨线轮廓 + 平涂，这也是没有指定画风时模型默认挑选的范围。&#10;&lt;strong&gt;揭示模式&lt;/strong&gt;（笔带宽软笔刷按部位扫出成图）：其余画风——只能由用户明确接受（&lt;code&gt;reveal_accepted&lt;/code&gt;），因为&amp;quot;刷出来&amp;quot;和&amp;quot;画出来&amp;quot;是两种观感，不能替用户决定。纯黑白的 1 号要写明理由才用。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="图：四种画风预览（4 小豆人涂鸦信息图 / 8 水墨写意 / 17 墨线绘本 / 19 圆头红线极简童画）" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.5616760.com/img/0053-006.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;选择方式有四种：直接看预览选编号、库内自动匹配、模型独立设计（线条/颜色/明暗/材质/背景全自定义）、用户描述方向。风格选择器&lt;strong&gt;直接读包内预览，不访问网络&lt;/strong&gt;——这是 v1.3 把 21 张预览图随包分发的原因。&lt;/p&gt;&#10;&lt;p&gt;六款手臂预设按笔尖到手腕校准，裁切边留在画外：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="图：六款手臂预设总览" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.5616760.com/img/0053-002.jpg"&gt;&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;预设&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;标识&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;笔&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;深蓝袖马克笔&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;navy&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;马克笔&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;女性柔粉碎钻长甲&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;diamond-woman&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;同上笔型女性手&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;儿童彩铅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;child-pencil&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;彩铅&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;上官婉儿灵感毛笔&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;waner-brush&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;毛笔&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;白衬衫中性笔&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;teacher-pen&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;中性笔&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;针织袖钢笔&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;cardigan-fountain&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;钢笔&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;仅画笔（无手臂）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;pen-only&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;navy&lt;/code&gt; 同款笔去掉手臂&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;笔杆文字最多 16 个 Unicode 字符、水印最多 180 字符可换行——默认都不加。这两个选项本质是给做号的人留的商业化口子，作者没有默认塞广告。&lt;/p&gt;&#10;&lt;h2 id="十工程细节50mb-离线包与镜像修复"&gt;十、工程细节：50MB 离线包与镜像修复&#10;&lt;/h2&gt;&lt;p&gt;这个项目的工程质量不止在渲染管线，也在&lt;strong&gt;分发和资产完整性&lt;/strong&gt;上。几个机制值得单独看：&lt;/p&gt;&#10;&lt;h3 id="101-安装体积的硬预算"&gt;10.1 安装体积的硬预算&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;validate_package.py&lt;/code&gt; 把「二进制文件禁令」换成了更实用的预算制：&lt;strong&gt;安装包总量 ≤ 50 MB、单文件 ≤ 10 MB&lt;/strong&gt;，且包内预设必须与清单记录的哈希一致。v1.3 实测 843 个文件 / 49.4 MB 通过——贴着上限走，说明作者在主动管理体积。&lt;/p&gt;&#10;&lt;p&gt;同时按 &lt;code&gt;omitted_showcase_media&lt;/code&gt; 机制移除了 omniailab 导演依赖里的 &lt;code&gt;examples/motion&lt;/code&gt; 和 &lt;code&gt;examples/images&lt;/code&gt; 宣传示例（533 个文件），方法文档和运行代码保留。README 特意说明：&lt;strong&gt;减小代码包不等于清理 Git 历史，没有改写历史提交&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h3 id="102-资产修复四级回退与哈希校验"&gt;10.2 资产修复：四级回退与哈希校验&#10;&lt;/h3&gt;&lt;p&gt;手部、画风预览、试听共 30 个文件（约 8.8 MB）随包分发，&lt;code&gt;hosted-manifest.json&lt;/code&gt; 为每个文件记录字节数、SHA-256 和&lt;strong&gt;有序镜像地址&lt;/strong&gt;（jsDelivr CDN → Fastly → GitHub Release）。读取顺序：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD&#10; H1["包内副本&lt;br/&gt;大小 + SHA-256 校验"] -- "一致 → 使用" --&gt; H2["离线可用"]&#10; H1 -- "缺失 / 损坏" --&gt; H3["本地缓存&lt;br/&gt;~/.cache/sweety-handdraw-video/&amp;lt;sha256&amp;gt;/"]&#10; H3 -- "未命中" --&gt; H4["HANDDRAW_MIRROR&lt;br/&gt;自定义前缀（https:// 或 file://）"]&#10; H4 --&gt; H5["清单顺序逐个尝试&lt;br/&gt;每个地址 15 秒超时"]&#10; H5 -- "全部失败" --&gt; H6["报错列出每个 URL 及错误&lt;br/&gt;+ 手动放置路径"]&#10; H1 -. "HANDDRAW_OFFLINE=1" .-&gt; H6&#10; style H6 fill:#fff1f0,stroke:#d9534f,color:#8a2b28&lt;/pre&gt;&lt;p&gt;三个细节：&lt;strong&gt;只有大小和哈希都一致的内容才写入缓存&lt;/strong&gt;，不会&amp;quot;退回另一张图或另一种声音&amp;quot;；&lt;code&gt;HANDDRAW_OFFLINE=1&lt;/code&gt; 跳过联网直接说明缺失文件；&lt;code&gt;HANDDRAW_MIRROR&lt;/code&gt; 支持 &lt;code&gt;file://&lt;/code&gt; 前缀——内网/Gitee 镜像可以顶上去。&lt;/p&gt;&#10;&lt;h3 id="103-一次真实的图床迁移"&gt;10.3 一次真实的图床迁移&#10;&lt;/h3&gt;&lt;p&gt;README 记录了一次值得写进教科书的资产运维事故：内置画风库的参考图原托管在 Netlify，&lt;strong&gt;额度耗尽停用，75 个链接变死链&lt;/strong&gt;。修复方案是把链接整体迁到 jsDelivr 并&lt;strong&gt;固定到上游含图提交&lt;/strong&gt; &lt;code&gt;cdfd004c89164096c861ad06ebab2aa1527d1710&lt;/code&gt;，Release 附件作最后回退。还有个更细的处理：五张运行参考锚点里三张清理了来源与模拟相机字段（逐像素一致），jsDelivr 返回上游原字节时校验不符，会自动转用 Release 清理版——&lt;strong&gt;清单保留上游字节校验值以便追溯&lt;/strong&gt;。这种&amp;quot;清理过隐私的资产和上游原字节不一致&amp;quot;的边界情况，大多数项目到死都不会遇到。&lt;/p&gt;&#10;&lt;h3 id="104-纯-python-隐私清理"&gt;10.4 纯 Python 隐私清理&#10;&lt;/h3&gt;&lt;p&gt;图片隐私清理（&lt;code&gt;clean_image.py&lt;/code&gt;）从原来的 Bun + ExifTool 改成纯 Python 实现——少两个外部依赖，&lt;code&gt;setup.sh&lt;/code&gt; 也少两样要装的东西。所有生成图都要过这一步，元数据与来源属性分别报告，且文档明确：&lt;strong&gt;隐私处理不等于 AI 检测保证&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h3 id="105-测试与验证"&gt;10.5 测试与验证&#10;&lt;/h3&gt;&lt;p&gt;v1.3 记录：158 项回归通过（1 项平台用例跳过）、离线冒烟短片通过、安装包 843 文件 49.4 MB 通过核验。&lt;code&gt;scripts/&lt;/code&gt; 下 71 个文件里 &lt;code&gt;test_*.py&lt;/code&gt; 有 30 个——对一个 Skill 项目来说测试密度相当高，且 &lt;code&gt;smoke_test.py&lt;/code&gt; 可以离线跑通整条渲染链。&lt;/p&gt;&#10;&lt;h2 id="十一诚实的边界它自己写下的限制"&gt;十一、诚实的边界：它自己写下的限制&#10;&lt;/h2&gt;&lt;p&gt;这个项目的文档质量里最难得的，是&lt;strong&gt;把边界写在明面上&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;边界&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;原文口径&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;平台&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;macOS 与 Linux；&lt;strong&gt;Windows 暂不承诺&lt;/strong&gt;；宿主限 Codex 与 Claude Code&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;生图能力&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;宿主无法生成图片时&lt;strong&gt;必须停下说明&lt;/strong&gt;，不能交付只有文字的视频&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;稳定性&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;不承诺任意主题一次稳定生成&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;笔顺范围&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GB2312 范围内汉字按标准笔顺，其余字符按字形描线&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;耗时与费用&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;作者自述两分半样片&amp;quot;差不多 10 分钟&amp;quot;、200 美元订阅环境&amp;quot;不到 1%&amp;quot;——&lt;strong&gt;特定账号自述，非统一计量&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;橡皮擦转场&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;无交付证据，不列为现成功能&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AIGC 标识&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MP4 已写入隐式标识，&lt;strong&gt;发布时仍须按平台规则声明&amp;quot;AI 生成&amp;quot;&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;声音验收&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ASR 正确 ≠ 听感好；无听音工具时必须在交付说明里保留&amp;quot;主观听感未验收&amp;quot;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;系列批量&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;可固定画风配方和角色锚点，&lt;strong&gt;但仍可能漂移，每条都要检查&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;还有一条容易被忽略的：&lt;strong&gt;脚本不能替代观看&lt;/strong&gt;。文档反复强调「最终实际画面仍须检查，不能以程序检查替代观看」「工程能约束检查是否完成和证据是否对应当前图，不能自动理解&amp;rsquo;切断&amp;rsquo;」。叙事事实甚至要做进图里——《蛇》样片的&amp;quot;身体切断&amp;quot;必须在 drawing-plan 里列为 &lt;code&gt;narrative_requirements&lt;/code&gt;，要求两处可见空隙与断开的蛇段，看图时按相同 id 记录证据。&lt;strong&gt;把&amp;quot;剧情真实性&amp;quot;做成可勾验的契约&lt;/strong&gt;，这是我对这个项目印象最深的细节之一。&lt;/p&gt;&#10;&lt;h2 id="十二成熟度评估"&gt;十二、成熟度评估&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;维度&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;评价&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;依据&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;概念完整度&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;高&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;主题/文章/故事/定稿四类输入都有明确处理规则，修订可分层复用&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;工程严谨度&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;高&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;预算制分镜、拟人运笔常数、哈希资产校验、版本封板记录，都是踩过坑的正解&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;文档质量&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;很高&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SKILL.md + 14 份 references，限制和代价写在明面上，不营销&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;测试覆盖&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;中高&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;158 项回归 + 冒烟短片 + 打包核验；但完整制作实测仅来自 macOS + Codex&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;平台覆盖&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;中&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;明确不支持 Windows；Claude Code 侧&amp;quot;整片流程待实测&amp;quot;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;社区活跃度&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;高&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8 天 715 star / 136 fork / 76 提交，作者在 X 持续更新&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;API 稳定性&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;中&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自我标注 dev；本地 1.3/1.4/1.4.1 曾为未公开迭代号，公开标签后置对齐&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;主观质量保证&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;无&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;观感、听感、学习效果&lt;strong&gt;明确不承诺&lt;/strong&gt;，检查记录分层留痕&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;一句话：&lt;strong&gt;这是一个&amp;quot;作者自己天天在做片&amp;quot;的项目&lt;/strong&gt;。判断依据不是 star 数，而是那些只有真正做过片才会加的机制——3.5 笔/秒的标定（被画不完的图坑过）、235 Hz 嗡声门禁（被样片杂音坑过）、Netlify 死链迁移（被图床坑过）、字幕唯一性硬门槛（被双字幕坑过）、&amp;ldquo;做了 ASR 不等于听过&amp;rdquo;（被自己的验收记录坑过）。每一条都对应一次具体的翻车。&lt;/p&gt;&#10;&lt;h2 id="十三结语"&gt;十三、结语&#10;&lt;/h2&gt;&lt;p&gt;回到开头那个判断：&lt;strong&gt;它把&amp;quot;AI 做视频&amp;quot;从生成问题重构成了约束满足问题。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;图生视频模型的范式是&amp;quot;生成然后祈祷&amp;quot;——抽一笔、看结果、不对再抽。这个项目的范式是&amp;quot;先算账再动手&amp;quot;——旁白时长决定绘制窗口，窗口决定笔数上限，笔数决定图片复杂度，复杂度决定生图提示词。渲染引擎只执行已验证可画的计划，预算不够就在上游改分镜，绝不靠压缩时间轴糊弄。&lt;strong&gt;确定性不是从模型里榨出来的，是从流水线的结构里长出来的。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;但它真正值得学的地方，是那份贯穿所有文档的&lt;strong&gt;分工自觉&lt;/strong&gt;：模型该做的（理解、创作、判断）和脚本该做的（标定、拦截、核验）划得很清，而且双方都不越界——脚本不假装能审美，模型不假装能保证。放到更大的语境里，这其实是所有 Agent 产品都要回答的问题：&lt;strong&gt;当执行者是不可靠的智能体时，工程系统的价值就在于把&amp;quot;不可靠&amp;quot;约束在可验收的边界内。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;对普通读者，它的实用价值也很直接：有一条两分钟的知识讲解/寓言故事/产品原理要做口播视频，又不想出镜、不想 K 帧、不想学动画软件——装个 Skill，把文章丢给 Agent，喝杯咖啡回来审片。macOS 用户现在就能试；Windows 用户（比如我）只能等，或者去催作者。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;承认自己做不到什么，比宣称自己什么都能做，更能建立信任。&lt;/strong&gt; 这条在工程上和在别处一样成立。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;免责声明&lt;/strong&gt;：本文基于 &lt;strong&gt;2026-10-20&lt;/strong&gt; 的仓库快照（&lt;code&gt;main&lt;/code&gt; 分支、Release v1.4.1）与公开源码、SKILL.md、references 文档及 GitHub API 数据撰写，所有代码片段与常数均可在仓库 &lt;code&gt;skills/sweety-handdraw-video/scripts/&lt;/code&gt; 核对。文中「实测」指作者记录的 v1.3 验证结果（158 项回归、843 文件 49.4 MB 安装包等），非本文在本机复跑；本文未在 macOS 环境实际制作视频。项目仍在高速迭代，接口、默认值、支持平台均可能变化，使用前请以仓库最新 README 与 SKILL.md 为准。文中引样的星标、提交数等动态数据随时间变化。本项目涉及本地运行第三方 TTS 模型与声音素材，声音授权与平台 AIGC 声明规则请自行确认遵守。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item></channel></rss>