I built a system to read early printed books for Skyrule, a personal project. These were not modern texts. They were 170 scanned books, 22,700 pages in all, printed from the 1480s to the 1850s. The pages included Latin, early-modern English with old spelling, gothic type, and a few in Hebrew, Persian and Greek. There were multi-column layouts, footnotes, tables, diagrams, woodcuts, and poor microfilm scans. The text layers that came with the archive scans had destroyed every astrological symbol, so the pages had to be read again from the images.
OCR engines and vision models struggle with historical text. I tested seven OCR and vision models against professional reference transcriptions before choosing. I measured character error, word accuracy, speed, and how often each model ran into repeated or invented text. The best engine had about 3% character error. The traditional open-source OCR baseline had about 20% character error. But even the best model invented fluent Latin that was not on the page when it met the oldest type. No single model could be trusted alone.
The pipeline sorts every page by type first. Each page is read by more than one independent model. Their disagreement becomes a per-page quality score. Pages where the readers disagree go to stronger readers. The hardest go to a review queue that keeps the best reading so far. Combining several readers was more accurate than the best single model. Every page keeps a record of its source, which models read it, how much they agreed, and which reading was kept. The production run read 6,910 pages from 45 books in about 7.6 GPU-hours.
I built a system that finds and tags illustrations in early printed books using classical computer vision and a local vision model. From 7,070 pages, the system extracted about 2,200 picture crops in five minutes on a CPU. Duplicate detection helped avoid redundant work across different scans of the same book. Each image is tagged and linked to its source record and license. The goal is to make the visual content of historical books accessible without publishing anything without provenance.
A vision model that read symbols from the page confidently misread planet symbols, and a second pass by the same model did not catch the error. This showed that model confidence is not always aligned with accuracy. A second model or method was needed to check the work.
Letting a language model clean old spelling changed the meaning of words without breaking structural checks. To preserve accuracy, I now store text exactly as read and only normalise spelling at search time.
About 850 pages were briefly lost when pages sent for review were flagged as empty. A recovery step restored them. The lesson was to keep the best reading at every stage and to count pages as part of every step.
Numeric tables are handled separately from the rest of the page. I found that OCR alone could not be trusted on them.
Next steps include a layout model to split columns, tables and figures before reading, and a system to zoom in on symbols and numbers for more accurate reads.
Done for Skyrule, my self-funded personal project, built outside my employment.