SHILIU · 创作资源
公众号视觉导演 · 创作技能
为公众号文章设计品牌一致的分镜与配图:默认电影感镜头加一张认知草图,输出可直接生图的画面说明。
这个技能解决什么问题
为公众号文章设计品牌一致的分镜与配图:默认电影感镜头加一张认知草图,输出可直接生图的画面说明。
来源与使用
作者 DavidLam;许可 MIT。已核对来源与包结构,未据此宣称完成运行实测。
机器可读详情 · 读取 SKILL.md · 下载完整技能包
技能说明全文
---
name: wechat-director
version: 2.5.1
description: 视觉导演 Skill,负责为文章设计品牌一致的分镜与配图。包含默认电影感镜头与认知草图第二镜头,输出 Storyboard.md 并可调用绘图脚本。
triggers:
- /draw
- /visual
- /配图
parameters:
- name: input_file
type: string
required: true
description: 文章草稿文件路径 (Draft) 或已归档文章路径
---
# 视觉导演系统 (WeChat Director)
**核心使命**: 为文章赋予**品牌一致的视觉叙事**。封面保持电影感,正文图可以在默认电影感镜头与认知草图第二镜头之间自动切换。
> **Tip**: 建议在 **归档前** (Stage 3) 运行本 Skill,默认将图片保存在项目 `zpicture.assets/` 目录。若在归档后运行,请务必指定 `--output-dir` 以免路径错误。
> **运行环境**:
> - 脚本需要 **Python 3.10+**;图片拼接与尺寸验收需要 **Pillow**。
> - `--brief` / `--draft` 等 CLI 路径相对**当前调用目录**;技能资源(`assets/`、`providers/`)以**技能自身目录**为基准解析,不使用机器绝对路径,macOS / Windows / Linux 通用。
> - 文章工作区根(`conductor/api_keys.json` 的基准)由 `scripts/workspace.py` 解析:**`--workspace` 显式 > `WECHAT_WORKSPACE` 环境变量 > 当前目录结构标记 > `--brief` 向上结构标记 > 报错**。定位不明时请显式传 `--workspace`。
## 🎭 核心角色: 张艺谋 (Visual Director)
* **风格**: Flat Vector Illustration with Sticker Style (扁平矢量插画 + 贴纸风格)
* **IP 形象**:
* **描述**: A bald Asian male (early 30s), wearing **signature bright red round-framed glasses**, neat goatee beard on chin. Character has **thick white outlines** around the entire silhouette (sticker style).
* **一致性**: 红色圆框眼镜、光头、山羊胡、白色描边必须保持一致。
* **参考图**: `assets/IP_Reference.png`(相对**技能根目录**;脚本以技能目录向上解析,技能被复制到任意位置仍正确,不使用机器绝对路径)。
## 🎥 双镜头系统 (Visual Lenses)
### 1. 默认电影感镜头 (Default Cinematic)
* **适用**: 主视觉封面、个人故事、情绪转折、复盘感悟、需要氛围与场景的段落。
* **气质**: 电影构图、温暖技术感、扁平矢量贴纸、场景化叙事。
* **规则**: Part A 主视觉与 Part B 侧边栏默认使用本镜头,保持读者熟悉的品牌门面。
### 2. 认知草图第二镜头 (Cognitive Sketch)
* **适用**: 教程、方法论、插件介绍、工作流、常见坑、判断标准、抽象概念解释。
* **气质**: 原风格内的白板解释视角,而不是换画师。保留红眼镜 IP、扁平插画、白色贴纸描边和 3:4 正文尺寸。
* **画法**: 一张图只讲一个核心动作或结构。少背景、少道具、短中文标注,用一个低科技隐喻解释复杂概念。
* **IP 要求**: IP 必须承担核心动作,例如拉线、分拣、修补、搭桥、称重、守门、拆包、把内容塞进一个怪装置;不能只是站在角落里摆 pose。
* **禁止**: 不要切换成其它 IP、黑色小怪物、纯手绘线稿或 PPT 信息图。
### 自动判断与手动覆盖
* **默认策略**: 自动判断正文图镜头。封面保持默认电影感,正文图根据文章内容选择。
* **优先认知草图**: 安装/配置/排错/步骤教程、功能解释、流程闭环、常见坑、方法分层、抽象概念可视化。
* **优先默认电影感**: 人物情绪、生活场景、故事推进、感悟复盘、需要氛围留白的段落。
* **手动覆盖**: 若用户指定"正文图用认知草图模式"、"保持默认视觉"、"插图 2 和 3 用认知草图",必须优先服从用户指定。
## 🚀 工作流程
### Step 1: 分镜设计 (Storyboard)
阅读输入文章,根据**文章篇幅**、**情绪节奏**与**认知锚点**,设计**适量**的插图位置,并为每张图判断视觉镜头。
* **数量原则**: **跟随情绪,不设限**。不要刻意计算字数。在每个需要"视觉呼吸"的**留白处**或**情绪转折点** (Emotional Twist) 插入。对于 1500-2000 字的文章,通常 4-6 张为宜。
* **核心目标**: 用画面去承接文字无法表达的留白;教程/方法论内容则优先把关键判断、流程、状态或隐喻画成一个清晰动作。
**输出交付物**: `Storyboard.md`。
> ⚠️ **重要**: 输出格式必须严格遵循 `references/io_schema.md` 中定义的 Markdown 结构与 Regex 规则。
**设计要求**:
1. **IP 标记**: 每个 Code Block 前必须根据内容判断是否需要 IP 形象 (`(IP形象: 是/否)`)。
* **重要**: 若标记为 `(IP形象: 是)`,则生成的 Prompt **必须包含**上方定义的完整 IP 形象描述 (A bald Asian male...)。
2. **视觉模式标记**: Part C 每张内文配图建议在 IP 标记后增加 `(视觉模式: 默认电影感)` 或 `(视觉模式: 认知草图)`。
* **自动判断**: 未手动指定时,根据文章类型与段落内容自动选择。
* **品牌一致性**: 认知草图仍必须保留红眼镜 IP 与扁平贴纸体系,不得换成其它角色或完全不同画风。
3. **尺寸规范 (Aspect Ratio)**:
* **Part A (主视觉)**: 必须在开头标明 `movie composition, 2.35:1 aspect ratio`,并在结尾使用 `--ar 2.35:1`。**禁止提供 Context 字段** (No Context needed)。
* **Part B (侧边栏)**: 纯色背景 (需提取主视觉主色),必须标明 `1:1 aspect ratio`。**禁止提供 Context 字段** (No Context needed)。
* **Part C (配图)**: 必须在开头标明 `portrait composition, 3:4 aspect ratio`。这是手机阅读最佳比例。
* **Context (锚点)**: 每一张**内文配图 (Part C)** 都必须提供 `Context` 字段。
* **定义**: 该图片应插入位置的**上一段落的最后一句话**。
* **要求**: 必须是原文中的原句,确保唯一性。
* **格式**: `> Context: "原文句子..."`
4. **侧边栏内容 (Part B)**: 纯色背景 + **必须使用中文** (Must use Chinese characters)。
* **字数限制**: 总共 **4-6个汉字**的核心短语 (e.g., "AI编程 / 一次过")。
* **排版**: 必须按语义拆分为 **上下两行** 进行排版 (Split into two lines)。
* **禁止**: 绝对禁止出现英文单词 (No English allowed)。
### Step 2: 出图前决策 (Check) —— 强制确认,不可跳过
**禁止**因为"只有一个可用 provider"就自动选默认值。每次运行 `/draw` 都必须重新读取 `conductor/api_keys.json` 并重新向用户展示渠道列表,等待用户显式选择后再执行。
**流程**:
1. 运行 `scripts/config_check.py` 或 `scripts/visualize.py --list-providers` 展示当前可用渠道(只读,不生成、不收费)。
2. 向用户展示选项与影响,等待选择:
- 当前 Agent / 平台内置生图工具
- 已保存的第三方 API(来自 `conductor/api_keys.json`)
- 输入新的第三方 API(只需 provider / base_url / model / api_key)
- 手动填入图片 URL
3. 用户确认"立即生成 / 只保留分镜 / 暂不执行"后再进入 Step 3。
新增 API 建议先核对官方文档;能力不明确时,先询问是否进行可能收费的最小生成测试。
### Step 3: 执行 (Execution) - Optional
调用 `scripts/visualize.py` 脚本批量生成图片。
* **全流程自动化**: 推荐同时传入 `--draft` 参数,脚本将自动完成 "生成 -> 压缩 -> 上传COS -> 插入正文" 的完整闭环。
* **纯上传模式 (`--upload-only`)**: 当配图已通过原生生图能力(如 Antigravity / 本地生成)生成完毕并存放在 `zpicture.assets/` 时,传入 `--upload-only` 可跳过 API 生图,直接复用本地图执行压缩、上传腾讯云 COS 并自动将 COS 在线链接注入正文。
* **Provider 选择**: `--provider` 可选 `auto`(默认)/ `gemini-web` / `gemini` / `gpt-image2`。
`auto` 的候选顺序固定为 **`gpt-image2` → `gemini`**,逐个尝试、失败自动回退。
vendored **`gemini-web` 不会进入 `auto`**,必须显式 `--provider gemini-web` 才会使用。
* **gemini-web 前置条件**: 需要技能目录下的 `vendor/baoyu-danger-gemini-web` 与本机 `bun`,缺任一项会在运行时明确报错。它按图逐次调用,**没有「单次会话批量生图」**。
* **SiliconFlow**: `providers/siliconflow.py` 仍存在,但当前**没有任何路径能选中它**(不在 `--provider` 候选,也不在 `auto` 解析里)。
* **退出码**: `0` = 全部任务产出成功;`1` = 运行期失败(配置/文件/无任务/有任务未产出);`2` = 用法错误。
* **首次登录**: 首次使用 `gemini-web` 前,先运行 `python3 skills/wechat-director/scripts/visualize.py --gemini-web-login` 完成独立登录初始化。
* **隔离原则**: `gemini-web` 默认使用**用户主目录**下 `.gemini/wechat-director/gemini-web/` 的独立 runtime,不复用日常 Chrome Profile(可用 `api_keys.json` 的 `gemini_web.runtime_dir` 覆盖)。
* **IP 增强**: 脚本会自动识别 Storyboard 中的 `(IP形象: 是)` 标记。若启用,将自动读取技能目录下 `assets/IP_Reference.png` 作为 Gemini Web / Gemini API 的参考图输入。
### Step 4: 图片交付验收(Agent / 平台出图时必做)
若图片不是由 `visualize.py` 生成(例如用当前 Agent 或平台工具出图),在注入正文、交给 writer 发布之前,先跑一次验收:
```bash
python3 skills/wechat-director/scripts/validate_images.py <项目>/zpicture.assets --brief <项目>/Storyboard.md
```
对照分镜确认齐图,并检查尺寸 / 比例 / 可读性(缺图、图片损坏、尺寸不足、比例错误、缺少 Pillow 都会失败)。验收通过后再注入正文。
## 🛠️ 脚本工具箱
> 2026-10-05 按职责拆分:`visualize.py` 由 1127 行降为 534 行,
> 其余按「基础设施 / 解析 / 桥接 / 生图适配器」分模块。
> **调用方式完全不变**(仍是从 `scripts/visualize.py` 进入);
> `tests/` 中的表征测试在拆分前后逐条比对行为(现有 **32 条**)。
> 同日另修:补齐 `gemini-web` 分发分支、退出码改为「非 0 表示有任务未产出」。
> 2026-10-06:工作区解析改为跨平台结构标记(`scripts/workspace.py`),
> 新增 `--workspace` / `--list-providers`,输出目录统一为 `zpicture.assets/`。
| 脚本 | 功能 | I/O 规范 |
|:---|:---|:---|
| `scripts/visualize.py` | **CLI 入口** + 编排(`VisualPipeline`:生图/压缩/上传/注入) | 读取 `Storyboard.md` 中的 Prompt 代码块 |
| `scripts/director_core.py` | 基础设施:日志、常量表、路径解析、配置加载、文本工具 | 被其他模块 import;无兄弟依赖 |
| `scripts/brief_parser.py` | Storyboard 解析器(含 Context 提取) | 输入 `Storyboard.md` → `(title, tasks)` |
| `scripts/obsidian_bridge.py` | Obsidian CLI 桥接(写属性 / 打开预览) | 需要本机 `obsidian` CLI |
| `scripts/workspace.py` | 工作区根解析(显式 > 环境变量 > 结构标记) | 被同目录脚本 import |
| `scripts/config_check.py` | 环境与渠道检测(Python / Pillow / Obsidian CLI / 已配置 provider) | 只读,不生成、不收费 |
| `scripts/validate_images.py` | Agent/平台生图后的独立齐图与规格验收 | `image_validation.py` 为规格单一来源 |
| `scripts/image_validation.py` | 图片交付规格(尺寸取自 `director_core.ASPECT_RATIOS`) | 被 `validate_images.py` import |
| `scripts/providers/gemini.py` | Gemini 生图适配器(API 与 Web 两条通道) | — |
| `scripts/providers/gpt_image2.py` | GPT-Image-2 生图适配器 | — |
| `scripts/providers/siliconflow.py` | SiliconFlow 生图适配器(⚠️ **当前未接入任何选中路径**) | — |
| `tests/test_visualize.py` | 行为护栏(32 条:纯函数 / 解析快照 / 编排 / CLI 退出码 / IP 路径) | `cd tests && python3 -m unittest test_visualize` |
技能是任务材料,不会自动授予账户权限、付费授权或其他系统权限。请让 Agent 按说明核对依赖,再在授权范围内使用。