火柴人漫画制作技能
> "The only AI that speaks fluent stickman."
> AI 漫画赛道已经卷日漫和写实风格了,而火柴人漫画是一片无人区。
> Stickman Comic 选择极简路线 — 不追求像素级精细(反正精细也卷不过专业画师),
> 而是追求 100% 稳定输出、段子转漫画的 0 秒延迟、以及让每个人都敢把心里话画出来的低门槛。
作者:Marvis Team / stickman-comic contributors
版本:1.5.0
许可证:MIT
仓库:README.md | CHANGELOG.md | LICENSE
根据用户输入自动生成火柴人风格漫画。混合架构:LLM 负责意图解析和单格渲染,
Python 引擎负责排版、角色管理和质量校验。
快速开始
触发后工作流
- 解析意图 → 将用户输入转为分镜描述 JSON
- 计算布局 → 分格尺寸、气泡位置、角色注册
- 逐格渲染 → LLM 生成 SVG + 后处理校验
- 组装输出 → 按格式导出最终文件
分镜描述 JSON 规范
意图层将用户输入解析为以下 JSON 结构:
{
"title": "漫画标题",
"style": "classic | expression | fullbody",
"hand_drawn": 0.5,
"characters": [
{
"id": "char_1",
"name": "角色名",
"appearance": {
"style": "classic",
"head": "circle",
"body_color": "#333333",
"accessories": ["cap_red"],
"height": "normal"
}
}
],
"panels": [
{
"index": 1,
"layout": "full | half | third | quarter",
"background": "场景背景描述",
"scene": "画面中的动作和内容",
"dialogues": [
{"speaker": "角色名", "text": "对话内容", "type": "speech | thought | narration"}
],
"camera": "远景 | 中景 | 近景 | 特写"
}
],
"output": {"format": "svg | png | html", "layout": "vertical_scroll | grid | paged"}
}
关键字段说明
- style: classic(极简线条)、expression(带表情)、fullbody(有形体配饰)
- hand_drawn: 手绘度参数(0~1),控制五大手绘维度。0=矢量风,0.5=适中,1=强手绘感。默认 0.5
- dynamism: 动态线参数(0~1),控制脊柱弯曲和肢体弧线。默认 0.5
- proportion_profile: 比例配置(v8 新增)— cartoon(4.5头身)/ academic(5.0头身)/ heroic(5.5头身)。默认 cartoon
- panels[].layout: full 全宽 / half 半宽 / third 1/3 / quarter 1/4
- dialogues[].type: speech 对话气泡 / thought 思考气泡 / narration 旁白框
- output.layout: vertical_scroll 纵向滚动 / grid 网格 / paged 分页
三种风格速览
| 风格 | 特点 | 适用 |
|---|---|---|
| expression | 圆点眼 + 弧线嘴,有手部表情,默认风格 | 需要情绪表现的故事 |
| classic | 圆头单线四肢,无五官,极简 | 快速出图、纯动作表达 |
| fullbody | 四肢粗细、配饰、颜色区分角色 | 多角色长篇故事 |
详细视觉规范见 stickman-style-guide.md。
使用脚本
本技能提供 5 个 Python 模块,存放在 scripts/ 目录:
| 模块 | 功能 | 关键函数 |
|---|---|---|
intent_layer.py |
解析用户输入为分镜 JSON | build_intent_prompt(), parse_llm_response(), validate_manifest() |
layout_engine.py |
计算分格布局和气泡位置 | build_panel_instructions(), compute_panel_grid(), compute_bubble_positions() |
render_engine.py |
逐格生成 SVG + 后处理 | build_render_prompt(), generate_panel_svg(), post_process_svg() |
output_layer.py |
组装多格,导出 SVG/PNG/HTML | assemble_svg(), export_comic(), build_html() |
utils.py |
颜色解析、SVG 校验等工具 | is_valid_svg(), color_in_range(), bubble_overlap() |
标准执行流程
Step 1: 解析意图
使用 intent_layer 的 prompt 引导 LLM 将用户输入转为分镜 JSON:
from scripts.intent_layer import build_intent_prompt, parse_llm_response, validate_manifest
prompt = build_intent_prompt(user_input)
# 将 prompt 发送给 LLM,获取 response
manifest = parse_llm_response(llm_response)
valid, errors = validate_manifest(manifest)
if not valid:
# 修正后再继续
pass
将 manifest JSON 保存到工作目录(如 manifest.json)。
Step 2: 构建渲染指令
from scripts.layout_engine import build_panel_instructions
instructions = build_panel_instructions(manifest)
# instructions 是每个格子的完整渲染参数
Step 3: 逐格生成
对每个 instruction 调用 LLM 生成 SVG:
from scripts.render_engine import build_render_prompt, generate_panel_svg
def llm_generate(prompt: str) -> str:
"""封装 LLM 调用,将 prompt 发送给大模型并返回文本。"""
# 在此处调用可用的 LLM 工具
pass
panel_svgs = []
quality_reports = []
for inst in instructions:
svg, report = generate_panel_svg(inst, generate_fn=llm_generate)
# 教学风模式:generate_panel_svg(inst, generate_fn=llm_generate, textbook=True)
# 教学风移除关节圆点/弧过渡/端点标记,缩头至躯干 1/6,纯直线骨架
if svg:
panel_svgs.append(svg)
quality_reports.append(report)
Step 4: 组装输出
from scripts.output_layer import export_comic
result = export_comic(panel_svgs, instructions, manifest, output_dir)
# result: {"svg": "/path/to/file.svg", "png": "..."}
将结果文件路径告知用户。
后处理与容错
- 每个格子最多重试 2 次(校验失败时自动修正 prompt 重生成)
- 气泡位置问题由 Python 自动修正,不触发重试
- 角色颜色偏差超过 5% 触发重试
- 2 次重试后仍未通过:保留结果但标记警告,继续下一格
- 最终汇总所有警告告知用户
输出偏好
- 默认输出 SVG 格式,纵向滚动布局
- 用户未指定输出目录时,输出到当前工作空间
- PNG 输出需要 cairosvg 库,未安装时提示:
pip install cairosvg
参考文件
references/stickman-style-guide.md:三种风格的精确视觉规范、角色比例、动作角度、配饰系统、对话气泡规格- 渲染每格时,
build_render_prompt()会自动注入风格规范,无需手动加载参考文件