OCR: what is the best way to extract data in JSON format from this old French book?
Posted by Wise_Stick9613@reddit | LocalLLaMA | View on Reddit | 35 comments
As some of you may have guessed, what we have here is an old Bible.
I would like to extract the following information from the page:
{
verse: number,
verse_content: string,
comment: string[]
}
I've played around with PaddleOCR a bit; I could probably make it work with that too, but I'm looking for something even simpler and more straightforward.
I don't think GLM-OCR will work because it doesn't support Latin (I need Latin, French, Spanish, Italian, and English).
I have an RTX 4060 with 12 GB of VRAM and 16 GB of RAM.
Thanks in advance.
Rude_Ambassador_6270@reddit
if you're not concerned with speed and don't require realtime processing of 10000 bibles at once, i'd suggest drop all "OCR" models and just use visually capable LLM like qwen of the latest versions. Starting from 9B you'll get decent results, and the higher ones will be even better. You may want to disable thinking to speed things up.
denoflore_ai_guy@reddit
Here ya go - tried to get this to you earlier in a series of posts but accidentally posted it in another sub, triggered their AI powered Ai filter and got banned. Worth it. Enjoy.
https://docs.google.com/document/d/1nupK7i21GmZ3gGQofUvNqknJ6F3Bf_k8X7UTSq0DVos/edit?usp=sharing
Pleasant-Regular6169@reddit
mistral ocr 3
Loud-Swim-2932@reddit
Since it is a french book it is calling for Mistral
Pleasant-Regular6169@reddit
no, I've actually tried many ocr options and mistral ocr 3 is one of the best (it will blow your mind with long-hand)
NoFaithlessness951@reddit
Use tesseract for that not an LLM.
dryadofelysium@reddit
I've dealt with Tesseract (including some of its forks, and including preparing it with OpenCV) and even the most scuffed Qwen3-VL 4B with some dodgy ass picture was outperforming Tesseract with a well aligned image it wasn't even funny
121531@reddit
The off-the-shelf Tesseract models I've tried are noticeably worse, even for languages like English, than an LLM.
satireplusplus@reddit
I would use an LLM not tesseract since he wants that structured output and generally vision LLMs are slowly getting really really good at OCR, esp. from more noisy scans of old books. But it needs to be bigger (27B+ params) and not something that fits in 12GB of VRAM and 16GB of RAM. Just rent a machine with 128 RAM and a 3090 from vast.ai for $0.20 to $0.30 per hour.
drunnells@reddit
I second this. They are pretty amazing. Depending on how much you are doing, even the Open AI API is fast, cheap and easy to implement with just a REST endpoint.. just say in plan english what you want to capture and the format that you need it in. I think part of the benefit is just the language model can piece together parts that are garbled better than any programmed logic can.
NoFaithlessness951@reddit
I think the type of "post processing" he wants is easy enough with just tesseract
guiopen@reddit
Tesseract is currently a bad OCR compared to the alternatives. I suggest paddle OCR.
tazztone@reddit
glm-ocr is also considered an LLM?
NoFaithlessness951@reddit
Yes
ClientGlobal4340@reddit
I think IBM granite-docling will do the job.
Loud-Swim-2932@reddit
Did not hear this before. Will give it a try!
PracticlySpeaking@reddit
What is it about granite-docling?
I have a similar project that needs json with chapter/verse labeling, but all English.
ClientGlobal4340@reddit
Granite Docling is perfect for this. Traditional OCR (like Tesseract or PaddleOCR) reads text linearly, meaning it will mix marginal comments right into the middle of your verses. Docling solves this because it understands layout geometry. It separates the structural elements of the page (verses vs. commentary blocks) and outputs clean Markdown. Natively optimized for Latin scripts (Latin, French, Spanish, Italian). Ultra-lightweight: At only ~258M parameters, it runs blazingly fast on your RTX 4070, leaving your 12GB VRAM free for the next step. The 2-Step Workflow Don't try to make a vision model output JSON directly from a raw image. Use a two-pass pipeline instead. First parse with Docling then convert to json.
PracticlySpeaking@reddit
thanks
it's the second part that I'm struggling with - identifying the "verses" to match and store the (chapter, verse) metadata. These docs also have commentary that is relevant, but needs to be separated from actual verse.
the source docs are actually PDF, happy to see granite does that too!
AdLongjumping6013@reddit
Open gemini.google.com
Paste the image.
Paste this:
OCR and extract the following information from the page:
{
verse: number,
verse_content: string,
comments: string[]
}
You get:
[
{
"verse": 20,
"verse_content": "Latin: 20. Intuens autem, quemadmodum oporteret accedere, patienter sustinens, destinavit non admittere illicita propter vitæ amorem.\nFrench: 20. Considérant ce qu'il lui faudrait souffrir en cette rencontre, et demeurant ferme dans la patience, il résolut de ne rien faire contre la loi par amour de la vie.",
"comments": [
"Le grec est entortillé et peu compréhensible, à moins de reconstituer la phrase en hébreu (1). Le voici mot à mot en latin : Expuens autem secundum quem oportebat modum accedere sustinentes puniri, quæ non licebat gustare propter vitæ amorem. C'est-à-dire, littéralement, mais selon la manière dont devaient se conduire ceux qui avaient la force de souffrir, il crachait ces choses qu'il ne lui était pas permis de goûter pour sauver sa vie. La phrase a une tournure hébraïque très accentuée."
]
},
{
"verse": 21,
"verse_content": "Latin: 21. Hi autem qui astabant, iniqua miseratione commoti, propter antiquam viri amicitiam, tollentes eum secreto, rogabant afferri carnes quibus vesci ei licebat, ut simularetur manducasse, sicut rex imperaverat, de sacrificii carnibus.\nFrench: 21. Ceux qui étaient présents, touchés d'une compassion impie, à cause de l'ancienne amitié qu'ils avaient pour lui, le prirent à part, et le supplièrent de trouver bon qu'on lui apportât des viandes dont il lui était permis de manger, afin qu'on pût feindre qu'il avait mangé des viandes du sacrifice, selon le commandement du roi,",
"comments": [
"Le grec (2) : Ceux qui étaient préposés à cet injuste festin, où l'on servait les entrailles des bêtes immolées aux idoles. Ce grand homme aime mieux souffrir la mort que de scandaliser les faibles par une action permise en elle-même, mais qui serait prise infailliblement pour une prévarication. Il suivait dès lors, dans la pratique, les règles de morale que Jésus-Christ (3), que saint Paul (4), que les martyrs (5), ont depuis, enseignées et pratiquées."
]
},
{
"verse": 22,
"verse_content": "Latin: 22. Ut, hoc facto, a morte liberaretur; et propter veterem viri amicitiam, hanc in eo faciebant humanitatem.\nFrench: 22. Et qu'on le sauvât ainsi de la mort : ils usaient donc de cette espèce d'humanité à son égard, par un effet de l'ancienne affection qu'ils lui portaient.",
"comments": []
},
{
"verse": 23,
"verse_content": "Latin: 23. At ille cogitare cœpit ætatis ac senectutis suæ eminentiam dignam, et ingenitæ nobilitatis canitiem, atque a puero optimæ conversationis actus; et secundum sanctæ et a Deo conditæ legis constituta, respondit cito, dicens, præmitti se velle in infernum.\nFrench: 23. Mais pour lui, il commença à considérer ce que demandaient de lui un âge et une vieillesse si vénérable, ces cheveux blancs qui accompagnaient la grandeur de cœur qui lui était naturelle, et cette vie innocente et sans tache qu'il avait menée depuis son enfance ; et il répondit aussitôt, selon les ordonnances de la loi sainte établie de Dieu, qu'il aimait mieux descendre dans le tombeau.",
"comments": []
},
{
"verse": 24,
"verse_content": "Latin: 24. Non enim ætati nostræ dignum est, inquit, fingere, ut multi adolescentium, arbitrantes Eleazarum nonaginta annorum transisse ad vitam alienigenarum,\nFrench: 24. Car il n'est pas digne de l'âge où nous sommes, leur dit-il, d'user de cette fiction, qui serait cause que plusieurs jeunes gens, s'imaginant qu'Éléazar, à l'âge de quatre-vingt-dix ans, aurait passé au paganisme,",
"comments": [
"Cette fiction n'aurait été digne d'aucun âge, puisque tous les hommes, de quelque âge qu'ils puissent être, sont obligés de donner aux autres l'exemple d'une foi sincère, et d'une piété sans déguisement. Mais le scandale que cause la chute d'un homme chargé d'années et consommé dans les exercices de la piété, est d'une autre conséquence sans comparaison, que celui que causerait la chute d'une personne ordinaire. La grande estime que l'on a conçue pour la vertu et pour la lumière du premier, donne un poids particulier à toutes ses actions. Il ne fait rien qui ne soit, non pas seulement un fruit, mais une semence de vie ou de mort pour plusieurs personnes, qui le regardent comme un modèle que l'on doit suivre. Ainsi Éléazar avait raison, quand il répondit à ceux qui voulaient lui inspirer cette fiction, qu'elle aurait été indigne de son grand âge : non qu'elle eût pu convenir à un âge moins avancé, mais parce que sa vieillesse aurait rendu son exemple plus dangereux pour plusieurs jeunes personnes qu'il aurait trompées par ce déguisement, et à qui il serait ainsi devenu un sujet de scandale. Il préféra donc, comme il le dit, laisser aux jeunes gens un exemple de fermeté, plutôt que de conserver un petit reste de cette vie corruptible, par une dissimulation si pernicieuse tant à son salut qu'à celui de ses frères."
]
},
{
"verse": 25,
"verse_content": "Latin: 25. Et ipsi, propter meam simulationem, et propter modicum corruptibilis vitæ tempus, decipiantur, et per hoc maculam, atque execrationem meæ senectuti conquiram.\nFrench: 25. Seraient eux-mêmes trompés par cette feinte, dont j'aurais usé pour conserver un petit reste de cette vie corruptible : et ainsi j'attirerais une tache honteuse sur moi, et l'exécration des hommes sur ma vieillesse.",
"comments": []
}
]
Writing this down needed longer than doing it!
AdvantageStatus4635@reddit
glm helped me with old church slavonic
Slight_Show_451@reddit
Marker
drunnells@reddit
I run llama.cpp server with Qwen3.6-35B-A3B on dual Nvidia Tesla P40s. I don't speak the language, but this feels close to what you are looking for.
I did this with curl and your sample image:
This was the result:
[{"verse": 20,"verse_content": "20. Considérant ce qu'il lui faudrait souffrir en cette rencontre, et demeurant ferme dans la patience, il résolut de ne rien faire contre la loi par amour de la vie.","comments": ["INTUENS AUTEM QUEMADMODUM OPORTERET ACCEDERE, PATIENTER SUSTINENS, DESTINAVIT NON ADMITTERE ILLICITA PROPTER VITÆ AMOREM. Le grec est entortillé et peu compréhensible, à moins de reconstituer la phrase en hébreu (1). Le voici mot à mot en latin : Expuens autem secundum quem oportebat modum accedere sustinentes puniri, quæ non licebat gustare propter vitæ amorem. C'est-à-dire, littéralement, mais selon la manière dont devaient se conduire ceux qui avaient la force de souffrir, il crachait ces choses qu'il ne lui était pas permis de goûter pour sauver sa vie. La phrase a une tournure hébraïque très accentuée."]},{"verse": 21,"verse_content": "21. Ceux qui étaient présents, touchés d'une compassion impie, à cause de l'ancienne amitié qu'ils avaient pour lui, le prirent à part, et le supplièrent de trouver bon qu'on lui apportât des viandes dont il lui était permis de manger, afin qu'on pût feindre qu'il avait mangé des viandes du sacrifice, selon le commandement du roi,","comments": ["V. 21. QUI ASTABANT INIQUA MISERATIONE COM-MOTI. Le grec (2) : Ceux qui étaient préposés à cet injuste festin, où l'on servait les entrailles des bêtes immolées aux idoles. Ce grand homme aime mieux souffrir la mort que de scandaliser les faibles par une action permise en elle-même, mais qui serait prise infailliblement pour une prévarication. Il suivait dès lors, dans la pratique, les règles de morale que Jésus-Christ (3), que saint Paul (4), que les martyrs (5), ont depuis, enseignées et pratiquées."]},{"verse": 22,"verse_content": "22. Et qu'on le sauvât ainsi de la mort : ils usaient donc de cette espèce d'humanité à son égard, par un effet de l'ancienne affection qu'ils lui portaient.","comments": []},{"verse": 23,"verse_content": "23. Mais pour lui, il commença à considérer ce que demandaient de lui un âge et une vieillesse si vénérable, ces cheveux blancs qui accompagnaient la grandeur de cœur qui lui était naturelle, et cette vie innocente et sans tache qu'il avait menée depuis son enfance ; et il répondit aussitôt, selon les ordonnances de la loi sainte établie de Dieu, qu'il aimait mieux descendre dans le tombeau.","comments": []},{"verse": 24,"verse_content": "24. Car il n'est pas digne de l'âge où nous sommes, leur dit-il, d'user de cette fiction, qui serait cause que plusieurs jeunes gens, s'imaginant qu'Éléazar, à l'âge de quatre-vingt-dix ans, aurait passé au paganisme,","comments": ["V. 24. NON ENIM AETATI NOSTRÆ DIGNUM EST, INQUIT, FINGERE. Cette fiction n'aurait été digne d'aucun âge, puisque tous les hommes, de quelque âge qu'ils puissent être, sont obligés de donner aux autres l'exemple d'une foi sincère, et d'une piété sans déguisement. Mais le scandale que cause la chute d'un homme chargé d'années et consumé dans les exercices de la piété, est d'une autre conséquence sans comparaison, que celui qui causerait la chute d'une personne ordinaire. La grande estime que l'on a conçue pour la vertu et pour la lumière du premier, donne un poids particulier à toutes ses actions. Il ne fait rien qui ne soit, non pas seulement un fruit, mais une semence de vie ou de mort pour plusieurs personnes, qui le regardent comme un modèle que l'on doit suivre. Ainsi Éléazar avait raison, quand il répondit à ceux qui voulaient lui inspirer cette fiction, qu'elle aurait été indigne de son grand âge : non qu'elle eût pu convenir à un âge moins avancé, mais parce que sa vieillesse aurait rendu son exemple plus dangereux pour plusieurs jeunes personnes qu'il aurait trompées par ce déguisement, et à qui il serait ainsi devenu un sujet de scandale."]},{"verse": 25,"verse_content": "25. Seraient eux-mêmes trompés par cette feinte, dont j'aurais usé pour conserver un petit reste de cette vie corruptible : et ainsi j'attirerais une tache honteuse sur moi, et l'exécration des hommes sur ma vieillesse.","comments": []}]HVACcontrolsGuru@reddit
I’m using 27B for this same type of work on PDFs. Extracts the text and images then feeds it into an agent that handles just that. Worked great for me! Checking out other models and the IBM ones I may see how they do. Large context window helps for the large PDFs I’m processing.
ekaknr@reddit
Try a VLM like Qwen3.6-9B or Ministral-3-8B. They will work better than generic OCR models for extracting information in a specific format.
CockBrother@reddit
I just had an argument with Qwen 3.5 about this.
It repeatedly insisted it could not see the image or text, said to type the text in for it, told me I must have done something differently in the past, use an OCR tool, all while identifying the page number, biblical context and identifying sections. And apologized profusely for the confusion about its abilities.
I don't know why but it responded with a perfect transcription after I said, "you can see the image, you described its contents perfectly". And then went on to perform an excellent translation.
I guess performing OCR tasks is something they trained it to decline. I guess it's too close to "piracy". The AI companies must reserve that for themselves when stealing content.
Tyrannas@reddit
You should check Churro OCR, it's a qwen 2 finetuned on old documents, works like a charm
Cergorach@reddit
Have you checked olmocr?
But to be honest the OCR software has never been perfect, adding LLM to the mix hasn't made it perfect either. I still read/check what's scanned for accuracy, so imho it's not a fire and forget solution, no matter what you use. But some people will accept the inaccuracies and the hallucinations.
exaknight21@reddit
I would use OCRMyPDF. It’s Tesseract with improved pipeline. I see personal gains.
ML-Future@reddit
GLM-OCR could make the OCR. But what kind of Json are you looking for?
Nubinu@reddit
Mineru does a good job.
totosse17@reddit
I think ministral 14b is your best bet
totosse17@reddit
Not sure why people didn't like the response, but I used both paddle and tesseract with my project on receipt parsing and they are much worse than llm based text recognition. Mistral has one of the best ocr behind API, but since autor wants to run it on 4070, not API, ministral is the best bet.
denoflore_ai_guy@reddit
Have done work like this before. Digging up my notes and code and updating it for May 2026 since better shit had come out since then and this is insanely good quality and your scans are hopefully higher res.
Terrible_Pianist8203@reddit
For pure image to text, have a look at lightonocr, works with very little vram. I think 1-2b parameters?