Texto a notas escritas a mano
Conviertes contenido en páginas con apariencia manuscrita. El renderizador es scripts/handnotes.py. Solo necesita Python con Pillow y numpy, que ya están presentes en los entornos de ChatGPT y Claude.
Resultado predeterminado: una foto de teléfono de una página de cuaderno en papel cuadriculado, tinta azul, escrita con la letra predeterminada incluida. Si el usuario no pide nada especial, entrégale eso.
Paso 0: ¿de quién es la letra?
Pregunta una vez, brevemente: "Envíame tantas fotos de tu propia escritura como puedas (cualquier página que ya hayas escrito: notas, tareas). De lo contrario, usaré la letra predeterminada."
- Sin fotos: usa la letra predeterminada. No preguntes de nuevo.
- Con fotos: apréndelas primero (ver Aprendizaje de una escritura a partir de fotos más abajo), luego renderiza con
--hand su-letra. Más páginas dan más muestras por letra y un resultado más natural. De 3 a 6 páginas es adecuado.
Paso 1: leer la entrada
- PDF: extrae el texto con pypdf, pdftotext o tu propio lector. Para un PDF escaneado, examina las imágenes de las páginas.
- Foto, captura de pantalla, pizarra: léelo tú mismo con visión. No ejecutes bibliotecas OCR.
- Texto, una solución, una página web: úsalo tal cual.
Paso 2: escribir la página
Hay dos casos.
- Notas de una lección: escribe lo que un buen estudiante escribe. Líneas cortas, palabras clave, la estructura de la fuente, entre un 15 y un 30 % de su extensión.
- Una solución o tarea que el usuario proporciona: conserva cada paso y cada número. Escríbelo como lo haría un estudiante en papel: etiquetas
1/,a)yb), una ecuación por línea,=>entre pasos. No añadas decoraciones que parezcan de IA: sin "Consejo:", sin resaltados por todas partes, sin negrita. Subraya o pon!!solo en un resultado final si el usuario lo haría.
Conserva el idioma del usuario. Mantén números, nombres y fórmulas exactas.
Formato:
# Título ## Encabezado ### Subencabezado (subrayado)
- viñeta (2 espacios = un nivel más profundo) 1. numerado
-> línea de flecha !! LÍNEA IMPORTANTE (rojo) > nota al margen (tinta de acento)
[ ] por hacer [x] hecho (marcado) --- separador línea en blanco = saltar una línea
en línea: ==resaltado== **negrita** __subrayado__ ~~tachado~~ {rojo}tinta de color{/} -> (flecha dibujada)
\$ = un signo de dólar $...$ matemáticas en línea $$...$$ solo en una línea = fórmula mostrada
Matemáticas. Pon cada fórmula entre $...$, incluso una corta como $x^2$ o $E_2$. Compatible:
\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, letras griegas, \in \subset \cup \cap \emptyset \forall \exists \leq \geq \neq \approx \pm \times \cdot \infty \to \implies \iff, y espacios \, \; \quad.
Escribe los decimales como en la fuente (0,81 o 0.81), y los números grandes como 50\,000 dentro de las matemáticas. Escribe los intervalos como se leen: $[0, 1[$. Pon las fórmulas grandes en su propia línea $$...$$. Una fórmula demasiado ancha para la página se reduce para que quepa, pero dividir una larga en = en dos líneas se ve más natural.
Guarda la página como notes.md.
Paso 3: renderizar
python scripts/handnotes.py render notes.md -o notes.pdf
Esto da el resultado predeterminado: una foto de cuaderno, papel cuadriculado, tinta azul, letra predeterminada. Cambia solo lo que el usuario pidió:
| opción | valores |
|---|---|
--style | notebook (foto de teléfono de una página real: luz desigual, líneas que se desvían hacia abajo, hoja inclinada, tinta de bolígrafo) · ipad (motor separado: letras repasadas como trazos sólidos, trazos uniformes de Apple Pencil sobre una página limpia) |
--paper | squared (cuaderno) o grid (ipad), lines, college, seyes, dots, blank |
--hand | default, o una carpeta creada por build-hand o learn |
--font | usar una fuente manuscrita en su lugar: caveat, kalam, patrick, gochi, indie, playpen |
--ink | blue (cuaderno) o black (ipad), red, green, purple, pencil |
--page | a4, letter, ipad, ipad-landscape |
--seed N | la misma página cada vez; cambia N para otra versión |
Usa -o notes.png para obtener imágenes (notes-1.png, notes-2.png, etc.) en lugar de un PDF.
Paso 4: verificar y luego entregar
Mira la página 1 (renderiza un PNG si no puedes ver PDF). Verifica que ninguna línea se salga de la página o se superponga a otra, y que cada número coincida con la fuente. Luego entrega el archivo.
Aprendizaje de una escritura a partir de fotos
Esto funciona con cualquier página que la persona ya haya escrito. No necesitan rellenar nada.
-
Segmentar:
python scripts/handnotes.py segment p1.jpg p2.jpg p3.jpg -o hand-workEsto elimina las líneas impresas del cuaderno, corta cada trozo de tinta y escribe hojas numeradashand-work/sheet-pageN-K.png. -
Etiquetar: mira cada hoja. Sabes lo que dicen las páginas porque puedes leer las fotos originales. Escribe
hand-work/labels.json(los números de página siguen el orden de las fotos):{"1": {"12": "a", "13": "(", "40": "the", "41": "7"}, "2": {"5": "é", "9": "dy"}}- Etiqueta solo las piezas de las que estés seguro. Omite cualquier cosa poco clara, cortada por la mitad, pegada a otra, tachada o solo un fragmento de línea.
- Una pieza que contiene varias letras unidas se puede etiquetar como esa palabra o par ("the", "le", "qu"). Se reutiliza cada vez que aparece esa secuencia, lo que se ve muy natural.
- Apunta al menos a 2 o 3 muestras de cada letra minúscula y cada dígito.
-
Construir:
python scripts/handnotes.py build-hand hand-work hand-work/labels.json -o su-letraEsto normaliza tamaños y fuerza de la tinta, descarta muestras mal cortadas y construye letras faltantes a partir de los propios trazos del escritor (u a partir de n, m a partir de dos n, w a partir de dos v, r, q). Los acentos (é è à ê ç ë) se dibujan sobre su propia letra simple. Imprime las letras que una fuente aún representa. -
Verificar un renderizado. Mira una página y haz zoom en cualquier letra que parezca rota o demasiado tenue. Encuentra sus muestras en los archivos
su-letra/glyphslistados ensu-letra/hand.json, elimina la etiqueta mala y vuelve a construir.
Conserva la carpeta su-letra: es su escritura. Ofrece comprimirla para que puedan reutilizarla la próxima vez.
También existe una ruta de plantilla (template, luego learn): la persona rellena una cuadrícula de casillas de 2 páginas. Es más limpia pero requiere más trabajo de su parte, así que ofrécela solo si la prefieren.