Deep Learning the Pen: A Tutorial on Handwriting Synthesis and Robotic Automation
Overview of Robotic Handwriting Synthesis

Generating handwriting that bypasses the "uncanny valley" of mechanical replication requires more than just moving a pen along a path. Traditional digital fonts fail because they lack the natural variance and fluid connections inherent in human movement. This project accomplishes a high-fidelity forgery by combining physical Tormach ZA6 with Machine Learning models that predict pen trajectories based on previous strokes. By training a system on real-world handwriting data, we can move beyond static glyphs to dynamic, connected script that even a Ron Morris finds difficult to distinguish from human work.
Prerequisites and Conceptual Foundation
Before diving into the code, you should understand Recurrent Neural Networks (RNNs). Unlike standard feed-forward networks, RNNs are designed for sequential data. They process inputs by maintaining a hidden state that acts as a memory of what came before. For handwriting, this means the model understands that the end of a 't' stroke often leads into the start of an 'h' or 'e'. You will need a basic grasp of Python, Machine Learning training loops, and how to handle vector-based coordinate systems (X, Y, and Pen-Up/Pen-Down states).
Key Libraries and Tools
- Handwriting Synthesis Code: An open-source implementation by Sean Vasquez based on the Alex Graves paper.
- Onshape: A cloud-based CAD platform used to design the mechanical interfaces, such as the vacuum plate and card feeder.
- Tormach ZA6: The industrial robot arm used for card tending and material handling.
- SVG/G-Code Converters: Essential for translating digital pen strokes into instructions the hardware can execute.
Code Walkthrough: The Dual Predictor Model
The most effective approach uses two distinct predictors working in tandem to ensure the output remains legible while maintaining organic flow.
# Pseudocode representing the dual-prediction loop
for letter in target_text:
# Predict the next coordinate based on the current stroke shape
pen_position = pen_predictor.predict(current_sequence)
# Check if the stroke aligns with the intended character
alignment = letter_predictor.verify(pen_position, letter)
if alignment > threshold:
execute_stroke(pen_position)
update_sequence(pen_position)
The first predictor looks at the current geometric shape and suggests where a pen would naturally move next. The second predictor acts as a guide, ensuring the pen doesn't wander off into nonsense. By feeding the predicted point back into the model as the new "start" point, the system creates a continuous, connected loop of script. This iterative feedback is what allows for natural ligatures between letters.
Syntax and Implementation Notes
When implementing Alex Graves' method, the output isn't just a single X,Y coordinate. Instead, the model outputs parameters for a Mixture Density Network. This creates a probability distribution of where the next point might be. By sampling from this distribution, we introduce the "human" wobble and variation. If you simply pick the most likely point every time, the writing becomes too perfect and looks robotic. Sampling adds the soul back into the machine.
Practical Examples and Hardware Integration
Beyond simple digital images, the real magic happens when the code drives hardware. The Tormach ZA6 handles the repetitive task of feeding cards into a AxiDraw. To keep the cards stable without human intervention, we use a custom-designed vacuum manifold. This plate uses suction to lock the card in place, resisting the friction of the pen. A spring-loaded card feeder ensures that even as the stack of cards diminishes, the top card remains at a fixed Z-height for the robot to grab.
Tips and Gotchas
Training is slow and prone to "garbage-in, garbage-out" errors. If your input data contains messy strokes or inconsistent pen-up signals, the robot will likely draw aggressive, nonsensical lines. Always normalize your coordinate data before training. Another common pitfall is ignoring the mechanical slack in the robot arm. Ensure your plotter is rigid; any vibration will be amplified by the machine learning model's fine-grained movements, turning a heartfelt message into a shaky mess.
- Tormach ZA6
- 23%· products
- Alex Graves
- 15%· people
- Machine Learning
- 15%· concepts
- AxiDraw
- 8%· products
- Handwriting Synthesis Code
- 8%· products
- Other topics
- 31%

I sent robot forgeries to a handwriting expert
WatchStuff Made Here // 23:39
I've been building things for as long as I can remember. It all started when my dad exposed me to plastic model building and soldering when I was around 4 years old. That set me on a path to building increasingly complex things and becoming an engineer. My goal is to do the same for as many people as possible by exposing them to the joy of engineering, fabricating and creating things out of nothing. If I'm lucky a few people may become engineers, which would be great for the world. Engineering is awesome. If you're interested in sending me something: P.O. Box 78470 Charlotte, NC 28271