Texte en notes manuscrites
Vous transformez un contenu en pages qui ressemblent à des notes écrites à la main. Le moteur de rendu est scripts/handnotes.py. Il nécessite uniquement Python avec Pillow et numpy, déjà présents dans les environnements d'exécution ChatGPT et Claude.
Résultat par défaut : une photo de téléphone d'une page de cahier à papier quadrillé, à l'encre bleue, dans l'écriture manuscrite par défaut. Si l'utilisateur ne demande rien de spécial, donnez-lui cela.
Étape 0 : quelle écriture ?
Demandez une fois, brièvement : "Envoyez-moi autant de photos de votre propre écriture que possible (toutes les pages que vous avez déjà écrites : notes, devoirs). Sinon, j'utiliserai l'écriture par défaut."
- Pas de photos : utilisez l'écriture par défaut. Ne demandez pas à nouveau.
- Photos : apprenez-les d'abord (voir Apprendre une écriture à partir de photos ci-dessous), puis rendez avec
--hand leur-main. Plus de pages donnent plus d'échantillons par lettre et un résultat plus naturel. 3 à 6 pages sont bien.
Étape 1 : lire l'entrée
- PDF : extrayez le texte avec pypdf, pdftotext ou votre propre lecteur. Pour un PDF scanné, regardez les images des pages.
- Photo, capture d'écran, tableau blanc : lisez-le vous-même avec la vision. N'utilisez pas de bibliothèques OCR.
- Texte, solution, page web : utilisez-le tel quel.
Étape 2 : écrire la page
Il y a deux cas.
- Notes d'un cours : écrivez ce qu'un bon élève écrirait. Lignes courtes, mots-clés, structure de la source, 15 à 30 % de sa longueur.
- Solution ou devoir donné par l'utilisateur : gardez chaque étape et chaque nombre. Écrivez-le comme un élève écrit sur papier :
1/,a)etb)comme étiquettes, une équation par ligne,=>entre les étapes. N'ajoutez pas de décorations qui ressemblent à de l'IA : pas de "Conseil :", pas de surlignage partout, pas de gras. Soulignez ou mettez!!sur un résultat final uniquement si l'utilisateur le ferait.
Gardez la langue de l'utilisateur. Gardez les nombres, les noms et les formules exacts.
Balises :
# Titre ## Titre de section ### Sous-titre (souligné)
- puce (2 espaces = un niveau plus profond) 1. numéroté
-> flèche !! LIGNE IMPORTANTE (rouge) > note marginale (encre d'accent)
[ ] à faire [x] fait (coché) --- séparateur ligne vide = sauter une ligne
en ligne : ==surbrillance== **gras** __souligné__ ~~barré~~ {rouge}encre colorée{/} -> (flèche dessinée)
\$ = un signe dollar $...$ maths en ligne $$...$$ seul sur une ligne = formule affichée
Maths. Mettez chaque formule dans $...$, même une courte comme $x^2$ ou $E_2$. Pris en charge :
\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, lettres grecques, \in \subset \cup \cap \emptyset \forall \exists \leq \geq \neq \approx \pm \times \cdot \infty \to \implies \iff, et les espaces \, \; \quad.
Écrivez les décimales comme dans la source (0,81 ou 0.81), et les grands nombres comme 50\,000 dans les maths. Écrivez les intervalles tels qu'ils sont lus : $[0, 1[$. Mettez les grandes formules sur leur propre ligne $$...$$. Une formule trop large pour la page est réduite pour tenir, mais diviser une longue formule au = sur deux lignes semble plus naturel.
Enregistrez la page sous notes.md.
Étape 3 : rendu
python scripts/handnotes.py render notes.md -o notes.pdf
Cela donne le résultat par défaut : une photo de cahier, papier quadrillé, encre bleue, écriture par défaut. Modifiez uniquement ce que l'utilisateur a demandé :
| option | valeurs |
|---|---|
--style | notebook (photo de téléphone d'une vraie page : lumière inégale, lignes qui dérivent vers le bas, feuille inclinée, encre bille) · ipad (moteur séparé : lettres retracées en traits pleins, traits Apple Pencil réguliers sur une page propre) |
--paper | squared (cahier) ou grid (ipad), lines, college, seyes, dots, blank |
--hand | default, ou un dossier créé par build-hand ou learn |
--font | utiliser une police d'écriture manuscrite à la place : caveat, kalam, patrick, gochi, indie, playpen |
--ink | blue (cahier) ou black (ipad), red, green, purple, pencil |
--page | a4, letter, ipad, ipad-landscape |
--seed N | la même page à chaque fois ; changez N pour une autre version |
Utilisez -o notes.png pour obtenir des images (notes-1.png, notes-2.png, etc.) au lieu d'un PDF.
Étape 4 : vérifier, puis livrer
Regardez la page 1 (rendez en PNG si vous ne pouvez pas visualiser les PDF). Vérifiez qu'aucune ligne ne dépasse de la page ou ne chevauche une autre, et que chaque nombre correspond à la source. Donnez ensuite le fichier.
Apprendre une écriture à partir de photos
Cela fonctionne à partir de toutes les pages que la personne a déjà écrites. Il n'est pas nécessaire qu'elle remplisse quoi que ce soit.
-
Découper :
python scripts/handnotes.py segment p1.jpg p2.jpg p3.jpg -o hand-workCela supprime les lignes imprimées du cahier, découpe chaque morceau d'encre et écrit des feuilles numérotéeshand-work/sheet-pageN-K.png. -
Étiqueter : regardez chaque feuille. Vous savez ce que disent les pages, car vous pouvez lire les photos originales. Écrivez
hand-work/labels.json(les numéros de page suivent l'ordre des photos) :{"1": {"12": "a", "13": "(", "40": "the", "41": "7"}, "2": {"5": "é", "9": "dy"}}- Étiquetez uniquement les morceaux dont vous êtes sûr. Ignorez tout ce qui n'est pas clair, coupé en deux, collé à un voisin, barré, ou qui n'est qu'un fragment de ligne.
- Un morceau contenant plusieurs lettres jointes peut être étiqueté comme ce mot ou cette paire ("the", "le", "qu"). Il sera réutilisé chaque fois que cette séquence apparaît, ce qui semble très naturel.
- Visez au moins 2 ou 3 échantillons de chaque lettre minuscule et de chaque chiffre.
-
Construire :
python scripts/handnotes.py build-hand hand-work hand-work/labels.json -o leur-mainCela normalise les tailles et la force de l'encre, supprime les échantillons mal coupés et construit les lettres manquantes à partir des propres tracés de l'auteur (u à partir de n, m à partir de deux n, w à partir de deux v, r, q). Les accents (é è à ê ç ë) sont dessinés sur leur propre lettre simple. Cela imprime les lettres qu'une police représente encore. -
Vérifiez un rendu. Regardez une page et zoomez sur toute lettre qui semble cassée ou trop pâle. Trouvez ses échantillons dans les fichiers
leur-main/glyphslistés dansleur-main/hand.json, supprimez la mauvaise étiquette, et reconstruisez.
Conservez le dossier leur-main : c'est leur écriture. Proposez de le zipper afin qu'ils puissent le réutiliser la prochaine fois.
Il existe également une route par modèle (template, puis learn) : la personne remplit une grille de boîtes sur 2 pages. C'est plus propre mais demande plus de travail pour elle, donc proposez-la uniquement si elle préfère.