| name | aphorism-card |
| description | 从一段文字或一张照片提炼出一句克制的中文金句,并生成中式怀旧质感的图文卡片(1:1 / 3:4 / 4:3)。当用户说「做张金句卡片」「把这段话做成图」「这张照片配句话」「提炼金句」「生成怀旧卡片」「做张有质感的图文」时使用。同一主题可沿变体轴无限生成不同画面。不用于:表情包、营销海报、含人脸的写真、需要可读品牌字样的设计。 |
| license | MIT |
金句卡片(Aphorism Card)
把「一段话」或「一张照片」变成一张中式怀旧质感的图文卡片:一句克制的金句 + 一幅承载它的画面。
这套方法来自一款关系记录 App 的真实生产实践,60 张卡片、60 句金句。
这个 skill 交付的不是一套规格,是一套判断力。 那 60 张统一的从来不是参数——实测题字带 21%~39%、字号 1.7%~4.1%、纸色冷暖跨度极大、6 张甚至没有题字带。它们成组好看,是因为每一张的处理都是跟着那张画面走的。所以本 skill 里的数字全是默认值和参考区间,references/ 里给的是「看到 A 选 B」的判断依据。
〇、与用户怎么打交道
每一步都给选择,不给问卷。 不要问「你想要什么风格」「几比几」「什么色调」——用户不知道,也不该由他来想。
比例:用户没说就 1:1;用户说了 3:4 或 4:3 就按他的。无论哪个比例,变体与多样性照旧。
用户给一段话 → 两轮
生图每张要两三分钟,而金句确认是秒级的。更重要的是金句是根,画面从金句反推——先用便宜的一步锁住最有杠杆的决策。
第 1 轮:直接给三句,不问。 每句附一句画面构思。
从这段话里,我听到三句:
①「缝纫机踩过的夜晚,你没见过。」
→ 老式脚踏缝纫机一角,台灯昏黄,深夜
②「她熬到半夜的样子,你只听说过。」
→ 昏黄灯下一堆待缝的衣物,窗外已黑
③「那台机器,比你年长。」
→ 踏板特写,漆面磨亮,晨光斜照
用哪句?也可以自己改一句。
第 2 轮:定稿后一次给三个不同处理,不是一张。
①「缝纫机踩过的夜晚,你没见过。」三种处理:
A 暖米纸 · 暖褐字 · 窄留白 22% 紧凑,机器占主导
B 象牙纸 · 深墨字 · 宽留白 35% 安静,像扉页题词
C 无带,字直接落在台灯照亮的桌面 整,照片和字是一体的
用户给自己的照片 → 一轮
照片已经定了,不用反推画面,合成又是毫秒级。直接出三张不同处理的成品让他挑。
用户自己写好了金句 → 跳过第 1 轮
每次都说明为什么这样处理
「这张底部是浅色纸面,所以字直接落上去,不加带子」——用户感到的是判断力,不是抽奖。这是这个 skill 与「随便找个模型生成」之间最直观的差别。
〇之二、拿不准时的最短路
后面几节全是「跟着画面走」的判断。判断是为了上限——但如果你拿不准,照这套来,保证出合格品:
| 默认 |
|---|
| 比例 | 1:1 |
| 金句 | 用句式 A「陈述一个空缺」(见 references/voice.md) |
| 场景 | 「旧物件」族,具体到器物细节 |
| 题字带 | 30% · 字号 2.8% · 字距 22% |
| 纸色 / 字色 | 象牙白 / 深墨 |
| 题字气质 | 「笔画细瘦的中文宋体,横细竖粗,像旧书扉页的印刷体」 |
这套是 60 张实测的中位数,不会惊艳,但不会错。先出一张给用户看,再问要不要换个方向——比在参数上纠结半天强。
一批图不要全用这套,那就回到「60 种味道剩 1 种」的老问题上了。
一、先判断:这活儿该不该接
适合:一段感想/一段对话/一件旧物的照片 → 想要一张能发朋友圈、能当空态图、能印出来的图文卡片。
不适合,直接说明并停手:
- 要求生成可辨认的真人面孔(这套风格的前提就是不见人脸)
- 要求画面里出现可读的品牌名/logo/门店招牌(生图模型必然写坏,且涉及商标)
- 要求「励志鸡汤」「爆款文案」「催单话术」——与本 skill 的调性规则正面冲突,换个 skill
- 医疗、法律、金融等需要事实准确性的内容
二、五步流程(按顺序做,不要跳)
① 提炼金句 → ② 反推画面 → ③ 出生图 prompt
↓
④ 出图(环境自适应) → ⑤ 验收
步骤 ① 提炼金句
读 references/voice.md(调性规则与正反例),然后:
-
从输入里找具体的锚点——一个物件、一个年份、一个动作、一句原话。抽象感受写不出好金句
-
按调性规则写 3 句候选,不是 1 句
-
用禁语脚本自检:
python3 scripts/check_voice.py "你的候选句"
报错的当场重写,不要辩解
-
定稿前逐句问这两遍——脚本查不了,而这两问就是「打中」与「没打中」的分界:
- 「这句话会让人感到内疚吗?」 会 → 重写。内疚会让人躲开,不会让人靠近
- 「去掉这句话,画面还成立吗?」 成立 → 说明这句是废话,重写。好句子会让画面变成另一个意思
-
把 3 句给用户挑;用户没指定就用第 1 句并说明理由
硬规则(违反即重写):短(建议 ≤20 字)· 平实 · 无感叹号 · 不煽情 · 不催促不制造欠账(「趁现在」「还来得及」「别等」全禁)· 不说教。
金句是这个 skill 里最要紧的一环。 画面可以重出,句子不对整张就废了——所以宁可在这一步多花两分钟。
步骤 ② 反推画面
读 references/scenes.md(六大场景族 + 变体轴)。
金句 → 「什么东西能承载这句话」。关键经验:越具体越好。
- ✗「一个杯子」
- ✓「一只用了多年、边缘掉了瓷的白底红字搪瓷缸」
器物名词必须带材质和工艺,否则模型会给你现代同名物。 实测「一双旧棉鞋」出来的是现代家居懒人鞋;写「老式手工布面棉鞋,鞋口一圈毛边,千层底」才对。
补救办法是给足语境词(灶膛、补丁、矮凳),但不如一开始就写具体。
要「同一主题无限变体」,就沿七条变体轴走(光线 / 视角 / 季节 / 媒介质感 / 留白方位与比例 / 器物年代 / 题字气质),而不是让模型随机。轴的取值见 references/scenes.md。
步骤 ③ 出生图 prompt
用 references/prompt-template.md 的模板,不要自由发挥。模板里有几条踩坑换来的硬约束,少一条就掉质量:
- 不见人脸(可以有背影、手部特写)
- 器物/书页/票据上的字迹必须模糊不可辨(否则模型生成鬼画符)
- 明确留白的方位和大致比例,但每张换一个值——「下方约五分之一」「下方约三分之一」「顶部约四分之一」。写死成同一句「底部约 1/4」,一批图就全长一个样(参考区间见
references/layout.md)
- 明确「除这句话外不得出现任何其他文字、水印、签名」
- 明确「真实摄影质感,不要卡通/插画/水彩」
步骤 ④ 出图 —— 环境自适应三档
按顺序探测,用第一个可用的:
python3 scripts/detect_backend.py
| 档 | 条件 | 做法 |
|---|
| A | 当前就在 Codex 里 | 直接用自带 image gen 生成 |
| B | 其他 Agent(Claude Code 等)且本地有 codex CLI | codex exec --skip-git-repo-check --sandbox workspace-write - < prompt.md(不需要 API key)。prompt 开头必须写「立刻调用内置 image_gen 工具,不要读任何 skill 文档」,否则它会把预算耗在读自己的文档上、退出码 0 却不出图。出图后必须 [ -f 文件 ] 校验产物 |
| C | 都没有 | 只输出 prompt,不硬做。见下方交付格式 |
开始生图前先告诉用户要等多久。 实测 tier B 串行每张 3~4 分钟;三个变体并行跑约 4~5 分钟(并行度 ≤6)。不说的话用户会以为卡住了。
C 档的交付格式——把提示词给足,别只丢一段文字:
本机没有可用的生图后端,我给你现成的提示词,复制到你惯用的生图工具就能出图
(即梦 / 通义万相 / Midjourney / ChatGPT 等都可以)。
<完整 prompt,含所有硬约束,一字不落>
出图后请自己核对三件事:
· 金句逐字准确(生图模型写中文经常错字,这是最常见的失败)
· 除金句外没有其他文字、水印、签名
· 画面里不出现人脸
不要假装生成了,也不要只给半截 prompt 让用户自己补硬约束——那些约束正是这个 skill 的价值所在。
另一条路:用用户的原图做排版(输入是照片且用户想保留原图时):
python3 scripts/compose_card.py --image 原图.jpg --quote "金句" --ratio 3:4 --out 卡片.png
这条路是图像合成不是生成:色调映射 → 纸纹 → 题字带 → 宋体渲染。离线可跑,不需要任何模型。
步骤 ⑤ 验收(不做这步等于开盲盒)
生图模型写中文经常出错。每张必须过:
python3 scripts/verify_card.py 卡片.png --quote "金句原文"
python3 scripts/verify_card.py "out/*.png" --against out
脚本查的客观项:尺寸比例 · 非空白 · 题字区有没有墨迹(抓「模型漏写了金句」)· 与已有图是否雷同(抓「十张长得都一样」)。阈值由 60 张已知合格成品标定,不是拍脑袋设的。
以下必须你亲眼看图确认:
任何一条不过 → 重生成,不要将就。 把不合格的图交付给用户,比多花两分钟重来糟糕得多。
三、成组交付:不要把版式统一掉
看到一组图带子高矮不一、纸色深浅不同,第一反应往往是「应该统一」。别。
60 张实测:题字带 21%~39%(四分位 27/30/33)、字号 1.7%~4.1%(中位 2.8%)、纸色冷暖跨度极大、6 张根本没有题字带。这是它耐看的原因,不是缺陷。
真正必须统一的只有三样:
| 必须统一 | 每张跟着内容变 |
|---|
| 调性(克制、平实、不催促、不煽情) | 有带 / 无带 |
| 硬约束(不见人脸、无杂字、字迹不可辨) | 带高、纸色、字色、字号、字距、字体 |
| 「字要小、距要疏」 | 留白方位 |
判断依据见 references/layout.md——那份文档里没有规格,只有「什么画面配什么处理」。
python3 scripts/compose_card.py -i 老照片.jpg -q "金句" --paper aged --color sepia --band 0.28
python3 scripts/compose_card.py -i 雪景.jpg -q "金句" --paper cool --color slate --band 0.39
python3 scripts/compose_card.py -i 纸面.jpg -q "金句" --band 0
批量模式:一次出一整组
把 60 张那次实践变成可复现的能力。核心不是「套同一个模板」,恰恰相反——保证一批里带高、纸色、字色、字号互相错开。
清单只要 image + quote,其余自动定;写了的以你写的为准:
[
{"image": "01.jpg", "quote": "第一张全家福,拍在哪一年。", "paper": "aged", "color": "sepia"},
{"image": "02.jpg", "quote": "第一场雪那天,他们在哪儿。"}
]
python3 scripts/batch.py 清单.json --outdir out --dry-run
python3 scripts/batch.py 清单.json --outdir out
自动只判像素判得了的:冷暖 → 纸色/字色 · 底部浅不浅 → 有带/无带 · 批内序号 → 带高与字号打散(非线性,避免第一张永远最窄)。
这三项脚本判不出来,必须你看图后写进清单:
- 画面含老照片 / 旧信 / 泛黄纸张 →
"paper": "aged"
- 画面含墨绿布面 / 深绿器物 →
"color": "green"
- 童年 / 书信 / 家常口吻宜用楷体,年代 / 档案宜用仿宋 →
"font": "<路径>"
--dry-run 会把每张的处理和「自动 / 手写」来源列出来,先看再出图。
四、比例与排版
比例默认 1:1。 用户没说就用 1:1;用户要 3:4 或 4:3 就按用户的来。无论哪个比例,变体与多样性照旧——比例是用户定的,处理是跟着画面定的。
下表是默认值,不是规格(详见 references/layout.md):
| 比例 | 用途 | 题字带默认 / 区间 | 字号默认 / 区间 |
|---|
| 1:1(默认) | 通用、App 空态、社交方图 | 30% / 21%~39% | 2.8% / 2.0%~3.6% |
| 3:4 | 竖屏、手机壁纸、印刷 | 25% / 17%~33% | 2.9% / 2.1%~3.7% |
| 4:3 | 横屏、封面、幻灯 | 32% / 23%~42% | 2.5% / 1.8%~3.3% |
1:1 那行是 60 张的实测(四分位 27/30/33,字号四分位 2.3/2.8/3.0);3:4 与 4:3 按构图关系推——竖构图本身高所以带更矮,横构图矮所以带更高、字更小。
唯一不能动的是「小」这件事。 字号上限 3.6%、字距取字号的 20%~24%——支点是「题字像扉页题词,不是海报标题」。初版按感觉设成 3.6%~4.0% 全都太大,出图一比才发现。排版参数必须出图对比,不能凭感觉设。
其余全部跟着画面走:有带/无带 · 纸色(象牙/旧纸/冷灰/暖米)· 字色(深墨/墨绿/暖褐/青灰)· 字体。
字体也是变体轴
生图路线上题字是模型直接画的,所以「用什么字体」落在 prompt 的描述词上:
| 气质 | prompt 里怎么写(照抄,别简化) | 配什么 |
|---|
| 宋体 / 明朝 | 「笔画细瘦的中文宋体,横细竖粗,像旧书扉页的印刷体」 | 通用基准。旧物、记录、街巷 |
| 楷体 | 「毛笔手写的楷书,每一笔都有起笔的顿和收笔的提……绝对不是印刷体、不是宋体」 | 童年、书信、母亲的话 |
| 仿宋 | 「仿宋体,笔画均匀清瘦、粗细几乎一致……不要横细竖粗的宋体」 | 年代、档案、正式的回忆 |
描述必须到笔画层面 + 带否定项。 实测只说「手写楷体」出来的仍是宋体感,加上「每一笔都有起笔的顿和收笔的提,绝对不是印刷体」才真的出楷体。完整取值见 references/prompt-template.md。
离线合成路线才是选本地字体文件:
python3 scripts/list_fonts.py --json
python3 scripts/compose_card.py -i 图.jpg -q "金句" --font "Songti.ttc#4"
唯一的忌讳是黑体 / 无衬线 / 圆体。 合成路线缺字会在渲染前被拦下(日文明朝缺简体字这类只缺一两个字的情况也能抓到),不会出豆腐块。详见 references/fonts.md。
五、常见失败与对策
| 现象 | 原因 | 对策 |
|---|
| 金句字有错别字/多字 | 生图模型中文渲染不稳 | 重生成;或改走 compose_card.py(文字由本地字体渲染,100% 准确) |
| 画面出现鬼画符 | 场景里有书页/招牌/票据 | prompt 里明确「字迹模糊不可辨」 |
| 人脸诡异 | 画面含正面人物 | 改背影、手部特写、或无人场景 |
| 十张长得都一样 | 没沿变体轴走 | 按 references/scenes.md 的轴显式指定光线/视角/季节 |
| 太「中国风」油腻 | 落入符号堆砌 | 禁止:红灯笼、水墨渐变、祥云、书法飞白。要的是生活质感不是文化符号 |
六、参考文件
references/voice.md —— 金句调性规则、正反例、为什么这么定
references/scenes.md —— 六大场景族 + 变体轴取值表
references/prompt-template.md —— 生图 prompt 模板(中英双语)
references/layout.md —— 什么画面配什么处理(判断依据,不是规格)
references/fonts.md —— 字体气质对照 + 本机探测 + 可装的开源字体
scripts/list_fonts.py —— 探测本机可用中文字体,按调性标注
scripts/check_voice.py —— 金句禁语校验
scripts/detect_backend.py —— 生图后端三档探测
scripts/compose_card.py —— 原图离线合成,文字 100% 准确
scripts/batch.py —— 批量出一整组,自动错开处理 + 成组核验
scripts/verify_card.py —— 成品客观项核验
showcase/ —— 9 张风格基准(生图原始产出,每张排版都不同)
七、出处
方法论来自一次真实的生产实践:一批 60 张的怀旧图文卡片,60 句金句,逐张核验交付。
调性规则里「不催促、不制造欠账」原本是那次实践的红线——记录家人故事这件事,一旦被「趁现在」「还来得及」推着走,人感到的就是内疚而不是珍惜。实践下来这条对「怀旧 / 记录 / 亲情」这一整类题材普遍成立,故一并开源。