텍스트를 손글씨 노트로은(는) 무엇을 하나요?
당신은 콘텐츠를 손글씨처럼 보이는 페이지로 변환합니다. 렌더러는 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가 작성한 것처럼 보이는 장식은 추가하지 마세요: "팁:" 없음, 과도한 하이라이트 없음, 굵게 표시 없음. 사용자가 그렇게 할 경우에만 최종 결과에 밑줄을 긋거나!!로 표시합니다.
사용자의 언어를 유지합니다. 숫자, 이름, 수식은 정확하게 유지합니다.
마크업:
# 제목 ## 제목 ### 부제목 (밑줄)
- 글머리 기호 (2칸 들여쓰기 = 한 단계 더 깊게) 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 (별도 엔진: 깨끗한 페이지에 균일한 애플 펜슬 획으로 글자 재구성) |
--paper | squared (notebook) 또는 grid (ipad), lines, college, seyes, dots, blank |
--hand | default, 또는 build-hand나 learn으로 만든 폴더 |
--font | 손글씨 폰트 사용: caveat, kalam, patrick, gochi, indie, playpen |
--ink | blue (notebook) 또는 black (ipad), red, green, purple, pencil |
--page | a4, letter, ipad, ipad-landscape |
--seed N | 항상 같은 페이지 생성; 다른 버전을 원하면 N 변경 |
-o notes.png를 사용하면 PDF 대신 이미지(notes-1.png, notes-2.png, ...)를 얻을 수 있습니다.
4단계: 확인 후 전달
1페이지를 확인합니다(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이 명령은 크기와 잉크 강도를 정규화하고, 잘못 잘린 샘플을 제거하며, 작성자 자신의 획으로 누락된 문자를 만듭니다(u는 n에서, m은 n 두 개에서, w는 v 두 개에서, r, q). 악센트(é è à ê ç ë)는 기본 글자 위에 그려집니다. 어떤 글자가 여전히 폰트로 대체되었는지 출력합니다. -
렌더링 하나 확인합니다. 페이지를 보고 깨지거나 너무 희미한 글자를 확대합니다.
their-hand/hand.json에 나열된their-hand/glyphs파일에서 해당 샘플을 찾아 잘못된 레이블을 제거하고 다시 빌드합니다.
their-hand 폴더를 보관하세요: 그 사람의 손글씨입니다. 압축하여 다음에 재사용할 수 있도록 제안하세요.
템플릿 경로(template 다음 learn)도 있습니다: 사용자가 2페이지 분량의 박스 그리드를 채웁니다. 더 깔끔하지만 사용자에게 더 많은 작업이 필요하므로, 사용자가 선호하는 경우에만 제안하세요.