文字转手写笔记 是做什么的?
你可以将内容转换为看起来像手写的页面。渲染脚本是 scripts/handnotes.py。它只需要 Python 环境,以及 Pillow 和 numpy 库,这些库在 ChatGPT 和 Claude 的代码沙箱中已经预装。
默认结果: 手机拍摄的方格纸笔记本页面照片,蓝色墨水,使用内置的默认手写体。如果用户没有特别要求,就以此为准。
步骤 0:确定使用谁的笔迹
简单询问一次:“请尽可能多地发送您自己手写的照片(任何您已经写过的页面:笔记、作业均可)。否则,我将使用默认的手写体。”
- 没有照片: 使用默认手写体。无需再次询问。
- 有照片: 首先学习它们(请参阅下方的 从照片学习笔迹 部分),然后使用
--hand their-hand参数进行渲染。提供的照片越多,每个字母的样本就越多,最终效果也越自然。3 到 6 页是比较合适的数量。
步骤 1:读取输入内容
- PDF: 使用 pypdf、pdftotext 或你自己的阅读器提取文本。如果是扫描版 PDF,请查看页面图像。
- 照片、截屏、白板: 请利用你的视觉能力自行读取内容。不要运行 OCR 库。
- 文本、解题过程、网页: 直接使用原始内容。
步骤 2:编写页面内容
分为两种情况。
- 课堂笔记: 写出一个好学生应记的内容。使用简短的句子、关键词,保留原文的结构,篇幅约为原文的 15% 到 30%。
- 用户给出的解题过程或作业: 保留每一个步骤和每一个数字。按照学生在纸上书写的方式书写:使用
1/、a)和b)作为标签,每个公式占一行,步骤之间用=>连接。不要添加 AI 风格的装饰:不要出现“提示:”,不要到处高亮,不要加粗。只有当用户会这样做时,才在最终结果下划下划线或加上!!。
保留用户原有的语言。确保数字、名称和公式完全准确。
书写标记语法:
# 标题 ## 主标题 ### 副标题(下划线)
- 项目符号(缩进两个空格表示更深一级) 1. 编号列表
-> 箭头行 !! 重要行(红色) > 边注(强调墨水颜色)
[ ] 待办事项 [x] 已完成(打勾) --- 分隔符 空行 = 跳过一行
行内:==高亮== **加粗** __下划线__ ~~删除线~~ {red}彩色墨水{/} -> (绘制箭头)
\$ = 美元符号 $...$ 行内公式 $$...$$ 单独一行 = 独立公式
数学公式。 将每个公式都放在 $...$ 内,即使是像 $x^2$ 或 $E_2$ 这样的短公式。支持的语法包括:
\frac{a}{b},\sum_{k=1}^{n},\prod,\int_a^b,\lim_{n \to +\infty},\sqrt{x},\sqrt[3]{x},x^{n+1},x_i,\left( ... \right),\binom{n}{k},\vec{u},\bar{x},\mathbb{R},\text{...},\mid,希腊字母,\in \subset \cup \cap \emptyset \forall \exists \leq \geq \neq \approx \pm \times \cdot \infty \to \implies \iff,以及空格 \, \; \quad。
数字的写法应与原始内容一致(如 0,81 或 0.81),大数字在公式中应写为 50\,000。区间的写法应与阅读习惯一致:如 $[0, 1[$。将较大的公式单独放在 $$...$$ 行。如果公式在页面上过宽,会自动缩小以适应,但如果将长公式在 = 处拆分成两行,看起来会更自然。
将页面保存为 notes.md。
步骤 3:渲染
python scripts/handnotes.py render notes.md -o notes.pdf
这将生成默认效果:笔记本照片风格,方格纸,蓝色墨水,默认手写体。仅在用户有特定要求时才修改以下选项:
| 选项 | 取值 |
|---|---|
--style | notebook(手机拍摄的真实页面照片:不均匀光线,条线轻微偏移,纸张倾斜,圆珠笔油墨) · ipad(独立引擎:字母笔触实心平滑,类似 Apple Pencil 在干净页面上的效果) |
--paper | squared(笔记本风格)或 grid(iPad 风格),横线(lines),college,Seyès,点阵(dots),空白(blank) |
--hand | default,或由 build-hand 或 learn 命令生成的文件夹路径 |
--font | 使用手写字体替代:caveat, kalam, patrick, gochi, indie, playpen |
--ink | blue(笔记本风格)或 black(iPad 风格),red, green, purple, pencil |
--page | a4, letter, ipad, ipad-landscape |
--seed N | 每次渲染使用相同的随机种子;更改 N 值可获得不同的随机效果 |
使用 -o notes.png 可以输出图片(notes-1.png、notes-2.png 等),而不是 PDF。
步骤 4:检查,然后交付
查看第一页(如果你无法浏览 PDF,可以渲染成 PNG 格式)。确保没有行超出页面边界或重叠在一起,并且每个数字都与原始内容一致。确认无误后,将文件交给用户。
从照片学习笔迹
此功能适用于用户已写好的任何页面。他们不需要填写任何额外的内容。
-
切割:
python scripts/handnotes.py segment p1.jpg p2.jpg p3.jpg -o hand-work此命令会移除笔记本的印刷线条,切割出每个墨迹片段,并将它们保存为按顺序编号的子页hand-work/sheet-pageN-K.png。 -
标注: 查看每个子页。你能够阅读原始照片的内容,因此你知道这些页面上写了什么。编写
hand-work/labels.json文件(页码按照照片的顺序排列):{"1": {"12": "a", "13": "(", "40": "the", "41": "7"}, "2": {"5": "é", "9": "dy"}}- 只标注你有把握的片段。跳过任何不清晰的、被切一半的、与相邻片段粘连的、被划掉的,或仅仅是线条片段的子页。
- 一个包含多个连接字母的片段可以标注为对应的单词或字母组合(如 "the"、"le"、"qu")。当该序列再次出现时,会重新使用这个片段,这样看起来非常自然。
- 目标是为每个小写字母和每个数字至少提供 2 到 3 个样本。
-
构建:
python scripts/handnotes.py build-hand hand-work hand-work/labels.json -o their-hand此命令会规范化大小和墨水浓度,丢弃切割不佳的样本,并从书写者自己的笔画中(例如从 n 生成 u,从两个 n 生成 m,从两个 v 生成 w,以及 r、q)构建缺失的字母。重音符号(é è à ê ç ë)会绘制在相应的无重音字母上。它将打印出字体仍然代表的字母。 -
检查一次渲染效果。 查看一个页面,并放大任何看起来变形或太淡的字母。在
their-hand/glyphs目录(记录在their-hand/hand.json中)中找到该字母的样本,删除对应子页的错误标注,然后重新构建。
请保留 their-hand 文件夹:这是用户的笔迹。你可以将其打包成 zip 文件,方便用户下次重复使用。
另有一个模板路径(先运行 template,再运行 learn):用户会填写一片 2 页的方框网格。这样得到的效果更干净,但对用户来说工作量更大,所以仅在用户更喜欢这种方式时提供。