arXiv is now an independent nonprofit! Learn more
License: CC BY 4.0
arXiv:2607.00250v4 [cs.CL] 23 Jul 2026

[ BoldFont = lmroman10-bold.otf, ItalicFont = lmroman10-regular.otf, ItalicFeatures = FakeSlant=0.2 ]

LV-ROVER-MLT: Low-Resource Maltese OCR by Synthetic Fine-Tuning and Multi-Stream Arbitration

Adam Darmanin Independent Researcher adamdarmanin@hecatusresearch.com
Abstract.

Maltese has text corpora and pretrained language models, but no public, reusable paragraph-scale OCR training corpus beyond NOMOCRAT’s 57 annotated pages for paragraph recognisers. We built a synthetic training pipeline of rendered line crops, fine-tuned the Tesseract 5 LSTM on it, and combined five Tesseract streams per word under a Maltese lexicon membership gate in a LV-ROVER-style arbitration scheme adapted to this low-resource setting. On the DocEng 2026 Maltese OCR competition’s 422 paragraph development set, the organizers’ fine-tuned Tesseract baseline scores a CER of 0.0234. Our fine-tuned recognizer plus stream arbitration, under the same convention, reaches CER 0.01317, a 44 percent reduction. Synthetic fine-tuning provides the largest single gain, and arbitration contributes a further material reduction beyond the anchor. A further label convention normalisation chain, tuned on this same development set, brings the full pipeline to CER 0.00700. We additionally test the method’s portability: Luxembourgish improves significantly over our stock baseline, while Hungarian is inconclusive. We also release a 36,803-pair real-text Maltese OCR corpus built from EUR-Lex and Wikipedia. The held-out competition result remains under organizer embargo and is not reported. Code, model weights, and the released corpus are public.

OCR, low-resource, Maltese, synthetic data, character error rate
copyright: none

Working paper, not peer reviewed.

1. Introduction

Maltese is a Semitic language written in Latin script, spoken by approximately half a million native speakers. Decades of archival text in Maltese remain unsearchable because they have not been digitised at scale, and OCR is the prerequisite step.

The language’s script is a difficult OCR target: its 30-letter alphabet extends the standard Latin alphabet with Ċ ċ, Ġ ġ, Ħ ħ, Ż ż, and the digraphs Għ għ and Ie ie; fonts silently substitute the base letter for the diacritic form; and the definite article attaches to the following noun via a structural hyphen (il-kelb, id-dar, fis-seħħ) that shares the same glyph, -, with soft line-break hyphens. The only labelled real Maltese PDF data we are aware of comes from the NOMOCRAT annotation project (Tanti et al., 2026): 57 PDF pages, line- and paragraph-transcribed per the project’s own description. That is far below what training a paragraph-level recogniser needs.

This system faces three technical challenges. First, any tokeniser or font that silently substitutes c for ċ corrupts labels at the encoder or rendering stage; we treat the four diacritic pairs (ċ/c, ġ/g, ħ/h, ż/z) as canaries, tracked at every stage of the pipeline. Second, the soft-versus-structural hyphen distinction is not lexically decidable on the glyph alone: both surfaces use -, so resolution requires either a language model or a rule-based joiner with Maltese morphological knowledge (Borg and Gatt, 2017; Maltese Language Resource Server, 2025). Third, the benchmark’s label convention shapes which improvements look real: gold labels use curly quotes (‘ ’ “ ”) and an em-dash (), while Tesseract’s raw output uses straight ASCII. Normalising to that convention produces a CER drop that has nothing to do with recognition quality.

We report two numbers and keep them separate throughout: the pre-convention CER, measured before the final label-convention rules, and the full-pipeline CER after normalisation.

This paper describes the LV-ROVER-MLT system: five parallel Tesseract LSTM streams combined per word under a Maltese lexicon membership gate, followed by a label-normalisation chain and a rule-based line joiner. Sections 24 describe the competition system and its development-set results, produced under the harness constraints before the submission deadline. Section 5 is a post-submission study: the same method tested on Hungarian and Luxembourgish, and a real Maltese training corpus built and released once the competition’s real-data restriction no longer applied.

The DocEng 2026 competition fixes the evaluation environment (DocEng 2026 Organisers, 2026): no network access, a pinned disk budget, a runtime ceiling, and Python 3.9 on a Windows box with an 11GB RTX 2080 Ti. These constraints, and the absence of real training data at scale, are why the submission is an ensemble of small Tesseract models, rather than a large neural decoder (e.g. TrOCR (Li et al., 2023)).

The contributions are:

  • A Maltese paragraph synthesis pipeline: text from eleven korpus_malti domain-split configs filtered for diacritic retention, 68 fonts validated against the canary set, PDF-realistic augmentations, and per-sample tagging of hyphens.

  • A pre-convention-versus-convention reporting split that separates fine-tuning and arbitration gains from label-convention alignment gains, with an ablation checked against held-out synthetic CER for benchmark overfit (Section 4.5).

  • A 5-stream lexicon-gated plurality arbitration scheme adapted for low-resource OCR: an open-vocabulary-preserving lexicon membership gate, a diacritic-restoration gate, and diversity from language chain, model source, and image scale.

  • A released 36,803-pair real-text Maltese OCR corpus, built by a layout-anchored method that constructs automatically aligned paragraph labels without relying on the PDF’s Unicode text layer, which is unreliable for Maltese diacritics in these born-digital documents (Section 5.2).

2. Related Work

The Maltese Language Resource Server maintains Korpus Malti with POS, lemma, and morphological annotation (Micallef et al., 2022; Borg and Gatt, 2017), but a shortage of labelled OCR image-text data at paragraph scale remains. Prior work on Maltese OCR is limited to NOMOCRAT (Tanti et al., 2026), which surfaced the hyphen-joining and label convention challenges this system addresses.

Multi-engine voting for OCR predates this paper. Consensus-sequence voting over aligned OCR outputs was established for text recognition in the 1990s (Lopresti and Zhou, 1997), and later work aligned and combined multiple full OCR systems directly (Lund and Ringger, 2009). Modern OCR engines fold voting inside the recogniser: Calamari votes across independently trained networks by per-character confidence (Wick et al., 2020), the engine-native form of the idea this system applies across Tesseract configurations. ROVER’s word-level voting across independent recogniser outputs (Fiscus, 1997) is the general mechanism this system adapts, and LV-ROVER’s lexicon-verified variant (Stuner et al., 2020) is the closer precedent: lexicon verification suits diacritic preservation. LV-ROVER was built for a high-resource setting with 11,328 labelled French handwriting training lines (RIMES), and its diversity came from a large cohort of BLSTM recognisers made diverse by random initialisation on that single dataset, not from independently-collected data.

Our contribution is the adaptation to a setting with no reusable OCR training corpus: diversity is engineered from language-chain and image-scale variation across a single fine-tuned recogniser, since no real corpus was available to train against repeatedly.

2.1. Adaptation of LV-ROVER

LV-ROVER-MLT changes the topology of the ROVER decision structure while retaining its core mechanism.

It keeps the two defining ROVER operations: aligning multiple recognizer outputs word-by-word, and arbitrating among competing hypotheses at corresponding positions.

Four adaptations distinguish it from canonical ROVER (Fiscus, 1997) and LV-ROVER (Stuner et al., 2020).

One anchor stream fixes the output structure and the other streams propose only substitutions at anchor-aligned positions; they cannot insert or delete to restructure the anchor, unlike ROVER’s symmetric confusion network. The lexicon is a membership eligibility gate not a frequency table or a closed vocabulary, so an out-of-vocabulary anchor word survives unless a candidate stream offers an eligible replacement.

A diacritic-restoration gate extends LV-ROVER’s lexicon verification to the Maltese setting, promoting a diacritic-richer in-lexicon candidate even over an already-valid anchor. Arbitration is plurality with no quorum: the most-voted eligible proposal wins, a single eligible distinct hypothesis can carry a position, and ties break by stream order, not majority.

Diversity comes from five structurally distinct recognizer configurations (language chain, training data, image scale), not from many stochastically-initialised instances of one architecture retrained on a single labelled dataset, as in LV-ROVER’s RIMES setup.

Each adaptation serves a specific purpose: deterministic inference, anchor preservation, open-vocabulary output, and resource efficiency under the competition’s constraints.

3. Method

3.1. System Overview

The system has a training side and an inference side.

The training side renders synthetic line crops from a text source and fine-tunes the Tesseract LSTM on them.

The inference side runs five parallel Tesseract streams over the image and arbitrates their outputs into a single paragraph string, shown in Figure 1.

The five-stream design aims for diversity without retraining: a stream fails on different characters than its siblings only if its inputs differ. Diversity here comes from language chain (Maltese alone, Maltese plus Italian, Maltese plus Italian and French), training data (fine-tuned versus stock recogniser), and image scale (native versus 2x-upscaled crop). Each axis shifts which characters the recogniser confuses, so combining streams can recover what any single stream loses; Section 4.2 measures whether this actually happens.

Refer to caption
Figure 1. LV-ROVER-MLT training (top) and five-stream inference with anchor-preserving arbitration (bottom).

Figure 1 reads top to bottom. Synthetic Maltese text yields three training artefacts: the fine-tuned Tesseract model, confusion table, and lexicon.

At inference, one paragraph image runs through five deterministic Tesseract configurations, each joined and normalised independently. mlt+ita is the default anchor, with a longest-stream fallback; the confusion corrector repairs eligible anchor words. Remaining distinct non-anchor hypotheses align to anchor positions, where lexicon and diacritic gates admit replacement proposals. Plurality arbitration selects an eligible proposal without restructuring the anchor; final punctuation and label-convention normalisation runs last.

Ghadha is the anchor. Two hypotheses produce Għadha, lexicon-valid and differing only by diacritic restoration. A third matches the anchor and casts no vote. Għada is rejected for shortening the alphabetic form. The eligible plurality selects Għadha. This example is illustrative, not a quoted development-set case.

3.2. Synthetic Data Pipeline

With no labelled real Maltese PDF data at usable scale, the synthesis pipeline is this project’s main dependency.

3.2.1. Text Source

Maltese text is pulled from korpus_malti v4.2 (MLRS, 2026; Micallef et al., 2022), about 470M tokens across 19 domain-split configs. We sampled from the domain-split configs, which preserve document-level sentence order; the global shuffled config reorders sentences across the corpus and breaks paragraph coherence, so we exclude it. We sampled eleven of the nineteen configs: parliament, wiki, government_gazzette, law_mt, nonfiction, theses, legal, speeches, blogs, umlib_oar, and web_general. We screen each config for the canary letters ċ ġ ħ ż to keep only diacritic-retaining sources: this dropped press_mt, a diacritic-stripped mirror whose canary density was about 0.01 against 0.12 to 0.20 for the rest. A fallback streamer pulls from Wikipedia mt and the Maltese Universal Dependencies treebank (both CC-BY-SA, ungated) when the primary corpus is unavailable. English code-switch material is mixed at 12 percent from a small clean fixture.

3.2.2. Synthetic Image Renderer

The renderer is a SynthTIGER compatible wrapper (Yim et al., 2021) using Pillow111https://python-pillow.org/ for paragraph layout. Each rendered sample emits an image, a label string, per-line label parts with a soft-hyphen marker (U+00AD, the invisible soft hyphen that renders only at an actual line break) at every line-break position, and metadata recording per-line bounding boxes, font, and hyphen kind.

Resolution calibration mattered most. Prior work documents synthetic-to-real domain gaps in scene text (Gupta et al., 2016; Baek et al., 2019); the gap here is specific to PDF crops. An early renderer produced images at 300 DPI without downscaling, while the real benchmark crops are roughly 150–200 DPI, so the renders were about twice too large and transfer to real images suffered. The corrected renderer applies a half-resolution Lanczos rescale and re-encodes at JPEG quality 72 to match the real crops.

PDF-realistic augmentations are applied as a fixed chain: rotation, blur, brightness/contrast jitter, optional ink bleed and column-edge crop, mild elastic distortion, salt-and-pepper noise, JPEG re-encoding, block noise, page-edge shadow, and subpixel blur. Scene-text operations (perspective warp, motion blur, glare) are disabled; they do not occur in PDF crops.

The renderer tags every hyphen it draws as soft (line-break split), structural (clitic-article surfaces such as il- and fis-), or compound (word-internal), which lets us measure joiner accuracy on soft hyphens alone without contamination from structural hyphens, which must be preserved rather than removed.

3.2.3. Font Catalogue

A font can silently substitute the base Latin letter for a Maltese diacritic at render time. We curated 68 faces (62 printed, 6 handwriting) under permissive licences (SIL Open Font License, GUST, Apache 2.0, DejaVu). Each candidate is checked for character-map presence of the canary glyphs Ċ ċ Ġ ġ Ħ ħ Ż ż à ì ò ù before entering the renderer pool; five candidates failed this check, missing one or more of Ċ ċ Ġ ġ Ħ ħ. This check catches a glyph that is absent outright; it does not verify that a present glyph renders visually distinct from its ASCII base, the specific risk noted in prior low-resource OCR work. This gap in the validator is open.

Three batches of synthetic paragraph data were generated for the joiner and for early training; Table 1 gives sizes and purposes. Batch 1 is a fixture used only to smoke-test the joiner. Batch 2 is the joiner’s round-trip accuracy set. The Tesseract LSTM fine-tune itself is trained on line crops cut from five separately rendered shards, 49,369 lines in total.

Table 1. Synthetic paragraph batches for joiner.
Batch Paragraphs Augmentation Hyphen tag Use
1 10,000 basic absent joiner fixture test
2 9,616 basic absent joiner round-trip set
3 10,001 full present held-out overfit check

3.3. Recogniser and Baseline Anchor

The recogniser is Tesseract 5 (Smith, 2007; Smith et al., 2009), fine-tuned on 49,369 synthetic line crops. With the rule-based joiner, it reaches CER 0.01605 on the development set by itself. This is our fine-tuned anchor, distinct from the organizers’ fine-tuned Tesseract baseline (CER 0.0234); we report every later candidate relative to both.

Canary diacritics and the two label-bearing dashes round-trip through a 117-character training inventory. Structural clitic-article hyphens (il-, is-, id-, fis-, and others) are never removed by the joiner’s line-break repair; the image-only en-dash (U+2013) is normalised to an em-dash (U+2014). Tesseract is deterministic; inference runs on CPU.

Fine-tuning starts from Tesseract’s stock Maltese model, warm-started onto a merged character set (stock plus the 117-character training inventory). Training runs 2,000 iterations at seed 42 over the 49,369 lines across five shards, mixed 70/30 augmented-to-clean, checkpointed every 100 iterations. Checkpoint selection is lowest dev-set CER on the full 422-paragraph development set, reusing the same set the headline CER is reported against, so the pick is not independent of that number. The selected checkpoint is iteration 1400 (dev CER 0.016053); CER is flat within 0.01605–0.01632 from iteration 400 onward.

We did not record a held-out validation split distinct from the dev set for this step.

3.4. Joining and Lexicon-Gated Arbitration

3.4.1. Joiner

The joiner resolves soft-versus-structural hyphens at decode time (Maltese Language Resource Server, 2025). A rule-based joiner with hyphenated-word repair runs first on each stream’s per-line output. Its result is then normalised: the soft-hyphen marker (U+00AD) is stripped and every en-dash (U+2013) is converted to an em-dash (U+2014); gold always uses the em-dash. A worked example: the image shows 0 – Għadha mhux fis- / seħħ, and gold reads 0 — Għadha mhux fis-seħħ. The image-rendered en-dash maps to an em-dash in the label; the structural fis- hyphen is preserved across the line wrap; the soft hyphen is removed and the word rejoined. The two label-bearing dashes, the ASCII hyphen and the em-dash, are never normalised against each other.

Run on our synthetic multi-line samples, the joiner round-trips 99.51 percent correctly, and 100 percent of soft-hyphen samples specifically; the remaining failures cluster on numbered-bullet line starts.

3.4.2. Anchor Selection and Confusion Correction

The default anchor is the mlt+ita fine-tuned stream. If it returns fewer than 0.6 times the longest stream’s length, the longest stream becomes the anchor instead. For paragraphs of 100 characters or more, a confusion corrector then takes each anchor word not in the lexicon and tries single-character swaps ranked by a character confusion table, P(truetess)P(\mathrm{true}\mid\mathrm{tess}), estimated from synthetic (rendered-character, recognised-character) pairs. It accepts a swap only when the result is itself a lexicon word, is within edit distance 2, and does not shorten the word’s letter or diacritic count. The lexicon is fixed throughout: the corrector maps a misread word onto an existing entry and never adds to the lexicon.

3.4.3. Lexicon-Gated Plurality Arbitration

The remaining distinct non-anchor hypotheses are aligned word-by-word against the anchor by edit distance and combined with an arbitration rule adapted from LV-ROVER (Stuner et al., 2020), itself an extension of ROVER (Fiscus, 1997). ROVER aligns the outputs of many recogniser instances into a confusion network and votes per position; LV-ROVER adds lexicon verification to that vote. Section 2.1 states the four adaptations made here; the two most consequential for arbitration itself are the lexicon gate and the diacritic-restoration gate, detailed next.

The lexicon gate is a membership eligibility check (Section 2.1). For each anchor word, every aligned candidate is checked against two gates in order.

The diacritic-restoration gate fires first: if a candidate’s diacritic-stripped form matches the anchor’s, the candidate carries strictly more canary diacritics, the candidate is itself lexicon-valid, and the two are within edit distance 2, that candidate is accepted as a diacritic-restoring proposal even when the anchor is already lexicon-valid. Only if this gate does not fire does the ordinary swap gate apply: an anchor word already in the lexicon is otherwise kept, and an out-of-lexicon anchor is replaced by a candidate only when that candidate is itself in the lexicon, is within edit distance 2, does not shorten the anchor’s alphabetic length or drop any of the four canary characters it carries, and does not shrink the anchor’s non-ASCII letter count. Each distinct surviving candidate that passes a gate casts one vote for its proposed word; the proposal with the most votes replaces the anchor, with ties broken by stream order.

This is a plurality rule: a single distinct hypothesis’s eligible proposal can replace the anchor when no other stream proposes a competing alternative. We call this scheme lexicon-gated plurality arbitration rather than majority voting, since no quorum is required. This gate restores diacritics the anchor lost: it promotes a lexicon-valid candidate that is the anchor word with canary diacritics added (e.g. zwieg\rightarrowżwieġ), even when the anchor is itself lexicon-valid. It is separate from the ordinary swap gate’s non-ASCII guard, which independently blocks a candidate from reducing an existing ħ to h; the two act in opposite directions. The restoration gate is the Maltese-specific extension of LV-ROVER’s lexicon verification named in Section 2.1.

Identical complete non-anchor hypotheses are collapsed before alignment, so arbitration operates over distinct candidate hypotheses.

Second, the arbitration runs over five structurally different recogniser configurations rather than many instances of one engine, since diversity here comes from language chain and image scale rather than from training-data resampling, which is unavailable in this setting.

Algorithm A and the released implementation specify the same inference procedure.

3.5. Label-Convention Post-Processing

After arbitration, a three-pass chain converts Tesseract’s output to the gold label convention: a leading clause-marker rule (digit, dash, and space around an em-dash at paragraph start), an apostrophe-curling rule, and a positional double-quote rule that curls opening and closing double quotes in a single pass. The diacritic-restoration step is not part of this chain; it runs inside arbitration (Section 3.4), before these passes. These rules are development decisions frozen into the shipped code, not runtime configuration.

4. Development-Set Evaluation

Everything in this section was produced under the DocEng harness constraints before the submission deadline and scored on the competition’s 422-paragraph development set. The held-out competition result is under organizer embargo and is not reported here; every number below is a development-set result.

4.1. Pre-Convention versus Label-Convention Gains

Scored under the same label convention as the organizers’ fine-tuned Tesseract baseline (CER 0.0234), the five-stream pipeline before the final v16–v20 label-convention rules, the pre-convention pipeline CER, reaches 0.01317 on the frozen submission artifact, a 44 percent reduction. This stage already includes the rule-based joiner, en-dash normalisation, and the confusion corrector; it is output before the final quote- and dash-convention rules, not recognition in isolation. The frozen 0.01317 predates the diacritic-restoration gate, introduced later (v19, Table 3); the fresh replay (0.01220) does include the gate, one source of the frozen-versus-replay gap.

Table 2 separates two artifacts that must not be combined. The frozen row is the submitted pipeline; the replay row is a fresh reconstruction of the same five streams, used only to attach a confidence interval, since the frozen artifact was not re-run under the bootstrap harness. The frozen anchor-to-pipeline arithmetic (0.01605 to 0.01317) is a point estimate, 0.00288, with no interval. The replay lands at a nearby but distinct 0.01220, and its anchor-to-ensemble delta, 0.00386, is what the checks below characterise; that interval belongs to the replay number only.

Table 2. Frozen submission artifact versus replay.
Artifact Anchor Pre-conv. CER Delta / CI
Frozen submission 0.01605 0.01317 0.00288 (no CI)
Fresh replay 0.01605 0.01220 0.00386, 95% CI [0.00266, 0.00517]

This replay delta is positive under paired resampling (95% CI excluding zero, permutation p<0.0001p<0.0001; the add-one correction behind that bound is discussed in Section 4.4).

The full pipeline, including the label-convention chain (Section 3.5), reaches CER 0.00700 on the frozen submission artifact, a 70 percent reduction from the same baseline. The frozen post-processing delta is 0.00617 (0.01317 to 0.00700); the same fresh replay used above measures a delta of approximately 0.00503 for the equivalent stages. Both are point estimates from their respective artifacts; only the combined post-processing delta as a block is bootstrap- and permutation-confirmed (Section 4.4), and that confirmation was run against the replay reconstruction, not the frozen numbers.

Table 3 traces the frozen chain in the order these decisions were made during development, not runtime order: the diacritic-restoration gate runs inside arbitration at inference time (Section 3.4) and its row appears late only because that behavior was introduced late in development. In this ordered sequence, synthetic fine-tuning provides the largest single gain, about 72 percent of the 0.0234-to-0.01317 reduction, with arbitration contributing the remaining 28 percent. This split is path-dependent and descriptive rather than causal: fine-tuning alone was not isolated under otherwise identical conditions.

Table 3. Cumulative development-version sequence.
Stage Type CER
3-stream arbitration recognition 0.01441
5-stream arbitration recognition 0.01317
Lead-marker norm. convention 0.01294
Apostrophe norm. convention 0.00810
Opening-quote rule convention 0.00776
Diacritic-restore gate recognition 0.00741
Closing-quote norm. convention 0.00700

Audited as a whole (0.01605 to the replay’s 0.01220), not the marginal 3-to-5-stream step (point estimate only). Post-processing stages are confirmed as a block. Listed in version-introduction order; the gate itself runs inside arbitration, not as a later runtime stage.

4.2. Ensemble Construction

The shipped pipeline is built incrementally from the fine-tuned anchor at CER 0.01605: a 3-stream arbitration step reaches 0.01441, expansion to five streams reaches 0.01317, and the label-convention chain brings the full pipeline to 0.00700. The anchor-to-five-stream delta as a whole is the only quantity that cleared the full audit gate (Section 4.4); the 3-to-5-stream expansion has only a point estimate, not its own confidence interval.

Arbitration helps only if the streams fail on different words. The mean pairwise word-disagreement rate is 4.0 percent, and a per-paragraph oracle stream selector (always picking whichever stream is closest to gold) reaches CER 0.01118, better than the best fixed stream (mlt+ita+fra, 0.01432). This oracle bounds stream selection specifically, not every word-level fusion method, since a word-level combiner can in principle beat picking one stream per paragraph. The fresh-replay five-stream result (0.01220) lands 0.00102 from that oracle, indicating that the configurations fail on complementary words and that arbitration recovers most of what a per-paragraph selector could.

4.3. CER Computation and Stratification

CER is computed with the jiwer library (Vaessen, 2025) on NFC-normalised reference and hypothesis text, aggregated as a sum of edit distances over a sum of reference lengths across paragraphs pp:

CER=pedit(refp,hypp)plen(refp).\mathrm{CER}=\frac{\sum_{p}\mathrm{edit}(ref_{p},hyp_{p})}{\sum_{p}\mathrm{len}(ref_{p})}.

This matches jiwer’s default aggregation and the organizers’ scoring script.

We stratify the development set across five axes: length quartile; language tag (Maltese, English, or other, from a wordlist heuristic); presence of the clitic-article prefix family; presence of a line-break hyphen; and presence of an em-dash. Buckets with fewer than 20 paragraphs are flagged as small and excluded from the regression gate, though still reported.

4.4. Statistical Method and Audit Harness

For ensemble-level decisions we use four checks, applied to the anchor-to-five-stream delta as a whole rather than the marginal three-to-five-stream expansion step in isolation.

First, a paired percentile bootstrap over per-paragraph edit-distance pairs (Efron and Tibshirani, 1993; Koehn, 2004), 1,000 resamples, sorting resampled deltas and reading off the 2.5th/97.5th-percentile endpoints without a bias-correction or acceleration step (a plain percentile interval, not BCa); a positive interval excluding zero means the CER delta is positive under paired resampling.

Second, a two-sided permutation test at 10,000 label-swap draws, run identically for the ensemble delta, the combined post-processing delta, and the two cross-language margins, using an add-one (Laplace) correction, p=(n+1)/(N+1)p=(n_{\geq}+1)/(N+1), so a draw with no permuted resample reaching the observed magnitude reports as a finite-resolution bound (e.g. p<0.0001p<0.0001 at 10,000 permutations) rather than the misleading p=0p=0.

Third, five-fold evaluation on held-out synthetic data provides a stability check under the renderer distribution; it does not estimate uncertainty on real benchmark data.

Fourth, a per-character paired bootstrap over the canary set, with BH-FDR correction at α=0.05\alpha=0.05 across the character family (Benjamini and Hochberg, 1995), so promoting a stage never silently trades a diacritic regression for a CER gain.

A variant is significant only when the global confidence interval excludes zero improvement and no non-small bucket regresses by more than 0.005 absolute. All resampling is seeded (seed 42). This paper reports the bootstrap and permutation outcomes; the cross-validation noise band and the per-character FDR checks acted as development-time gates and are not individually reported here.

The smaller deterministic post-processing rules get a lighter check: a single CER delta from removing the rule, cross-checked against held-out synthetic data (Section 4.5). Chaining five bootstrap procedures over the same sequential decisions would itself need a multiple-comparisons correction we have not run (Section 6). Only the anchor-to-five-stream delta passed the full setup.

4.5. Post-Processing Rule Audit

Every rule in the normalisation chain was tuned with the development set in view, so each is a candidate case of overfitting. We test each rule by removing it and checking whether development-set CER drops while held-out synthetic CER rises, which would indicate the rule fits development-set idiosyncrasy rather than a real pattern. This does not establish that a rule’s gain is itself statistically significant, since the held-out set is generated by the same synthetic pipeline as training data and cannot stand in for an independent real-world sample (Section 6). Table 4 reports the point-estimate CER change from each rule, positive meaning the rule helps, on the development set and on two held-out synthetic sets, see Section 4.4.

Table 4. Leave-one-out post-processing ablation.
Rule Dev set Synth A Synth B Regression?
Lead-marker norm. +0.00022 +0.00000 +0.00000 none observed
Apostrophe norm. +0.00496 art. art. not assessable
Opening-quote pos. +0.00025 +0.00000 +0.00000 none observed
Diacritic-restore gate +0.00037 +0.00074 +0.00063 none observed
Closing-quote norm. +0.00000 art. art. not assessable

art. = synth gold uses ASCII quotes, invalidating these rows; shown for completeness.

The synthetic labels use ASCII quotes rather than the benchmark gold’s curly-quote convention, so the apostrophe and closing-quote rules read as errors against synthetic gold, a label-convention artefact rather than a regression; we do not read those two columns as evidence either way. Re-scoring both under the curly convention collapses their measured deltas to zero and drops full-pipeline CER on the larger held-out set from 0.05695 to 0.04700. The remaining three rules show a non-negative delta across all three sets; the closing-quote rule’s development-set delta reads 0.00041 cumulatively (Table 3) but is inert (0.00000) in this fresh leave-one-out re-run, the more robust per-rule measure, and cannot be assessed against the synthetic labels because their quote convention differs; it is kept to hold the curly convention on real gold.

5. Additional Evidence

Two tests were run outside the harness, without the disk, runtime, network, or Python-version limits of Section 4: portability to Hungarian and Luxembourgish (Section 5.1), and a real Maltese training corpus released once competition rules no longer restricted real labelled data (Section 5.2). The audit protocol is unchanged: every CER below uses the same paired-bootstrap and permutation gate as the development-set numbers (Section 4.4).

5.1. Cross-Language Portability

We evaluated portability of the same fine-tuning-plus-arbitration protocol to two other languages, n=200n=200 paragraphs per language: Hungarian (HuCCPDF (Li et al., 2025)) and Luxembourgish (19th-century newspaper print). Neither shares Maltese’s canary diacritics or clitic-hyphen morphology; Hungarian needed no morphological joiner, and the Luxembourgish domain differs from either synthetic-Maltese or synthetic-Hungarian training data.

Table 5 gives the headline numbers under the same paired-bootstrap and permutation audit used for the Maltese results. Hungarian is inconclusive, not a clean null result: the stock-to-full-pipeline margin is not significant (95% CI [-0.00371, 0.00543], p=0.656p=0.656). Luxembourgish improves against our own stock-Tesseract configuration (95% CI [0.07623, 0.09642], p<0.0001p<0.0001) but does not beat a published comparator on the same corpus (12.12% CER over a 976-paragraph set) (Agbeti-Messan et al., 2026): ours uses a smaller, differently sampled n=200n=200 set, and our self-measured stock baseline (25.52%) is roughly double that comparator’s reported figure, so part of the margin may reflect our weaker baseline rather than a stronger method.

Table 5. Cross-language portability results.
Language Stage CER 95% CI of delta pp
Hungarian stock Tesseract 0.13543
Hungarian 5-stream arb. (pre-conv., point est.) 0.13441
Hungarian full pipeline 0.13438 [0.00371,0.00543][-0.00371,0.00543] 0.6560.656
Luxembourgish stock Tesseract 0.25520
Luxembourgish 5-stream arb. (pre-conv., point est.) 0.17413
Luxembourgish full pipeline 0.16927 [0.07623,0.09642][0.07623,0.09642] <0.0001<0.0001

Taken together, the two cases show that portability depends on calibration and on the quality of the baseline being improved upon, rather than on the target language alone.

5.2. A Released Maltese OCR Corpus

We are aware of no public, reusable paragraph-scale Maltese OCR training corpus beyond NOMOCRAT’s 57 pages (Tanti et al., 2026) and the competition’s own resources. We built and released one: 36,803 paragraph-level (image, text) pairs, 94 from EUR-Lex legal documents and 36,709 from Maltese Wikipedia222https://huggingface.co/datasets/radmada/maltese-ocr-corpus, with per-sample source and licence provenance. It was used only for post-competition experiments and did not contribute to the competition result. Pages are rendered at 150 DPI; paragraph regions come from PyMuPDF’s333https://pymupdf.readthedocs.io/ text-block segmentation of the PDF’s own layout, not its Unicode text layer, whose ToUnicode maps are unreliable for Maltese diacritics in these born-digital documents. Each crop’s label is instead aligned against an alternate representation of the same content, EUR-Lex’s Formex XML or Wikipedia’s plaintext-extract API, and kept only when word-level substring coverage against that source reaches 0.7 (per-pair score shipped in the metadata); the two sources are alternate renderings of the same document, not independent authorities on its correctness.

The register is skewed: 99.7 percent of pairs are encyclopedic Wikipedia prose, so legal and administrative Maltese is underrepresented. And every page is a digital-born render with no scanner noise: real-text and real-layout, but not scanned-document data. This corpus did not establish the competition result in Section 4; it is a post-submission contribution released alongside it to further stress test it.

6. Limitations

The synthetic-to-real gap is the largest source of uncertainty between predicted and observed performance. Held-out synthetic data is drawn from the same distribution as synthetic training data, biasing its per-bucket estimates optimistically. The same circularity applies to Section 4.5: a rule with no regression on held-out synthetic data is confirmed only against our own renderer, not an independent real-world sample.

The post-processing chain was tuned through five sequential decisions on the same development set without a multiple-comparisons correction across that sequence; the BH-FDR correction in Section 4.4 applies within the canary-character family only. The combined gain is confirmed as a block, but no individual stage has its own confidence interval (Table 3).

The arbitration lexicon and language-model streams are built from korpus_malti, whose domains include the development set’s own government-gazette and legal registers, raising the risk that development-set paragraphs are duplicated inside the training text and inflate the score through memorisation. A 5-gram Jaccard check against the 422 development-set source texts flags zero pairs at the 0.5 threshold (maximum 0.029) across ten of the eleven pulled domains; web_general was not re-streamed in time. Development-gold OOV against the lexicon is 13.6 percent of word types. A document-level test cannot exclude isolated word memorisation.

The diacritic canary monitor tracks the four sentinel pairs (ċ ġ ħ ż) but not the digraph; digraph splitting or merging is a plausible error class we do not separately measure. Stratification cutoffs and the English-bucket size are derived from this development set and are not guaranteed to hold on a differently-distributed set. Because the submitted system runs CPU-only Tesseract under the harness’s disk and runtime budget, the findings characterise that regime, not OCR under unconstrained compute.

AI disclosures

Claude Code assisted with CI/CD, code review, literature and citation organization, and proofreading. The author directed the research and accepts full responsibility for the results.

7. Conclusion

LV-ROVER-MLT combines synthetic fine-tuning of a Tesseract LSTM, controlled stream diversity across language chains, an anchor-preserving alignment with lexicon-gating, and a Maltese-specific diacritic-restoration gate. Under a single label convention it reduces development set CER from 0.0234 to 0.01317.

Synthetic fine-tuning provides the largest single gain, reaching CER 0.01605; arbitration contributes a further material reduction to 0.01220 in replay, supported by paired resampling (95% CI [0.00266, 0.00517]). The anchor supplies a stable output structure and the remaining streams supply recoverable alternatives per word position, failing on complementary words (Section 4.2).

We report the full-pipeline CER 0.00700 separately, since label-convention normalisation improves agreement with the benchmark’s quote and dash conventions rather than visual recognition. The held-out competition result remains under organizer embargo and is not reported.

Portability depends on baseline quality: Luxembourgish is a positive result against our stock configuration (95% CI [0.07623, 0.09642], p<0.0001p<0.0001); Hungarian was not significant. The released 36,803-pair corpus (Section 5.2) is a separate contribution, a public paragraph-level Maltese OCR resource not previously available at this scale; it supported post-competition experiments only.

Synthetic fine-tuning and constrained multi-stream arbitration are complementary tools for low-resource OCR under limited resources.

8. Availability

The inference code444https://github.com/adamd1985/lv-rover-mlt is Apache 2.0. The weights555https://huggingface.co/radmada/lv-rover-mlt train on korpus_malti text (CC BY-NC-SA 4.0, access-gated); whether those terms propagate to weights trained on rendered text is unsettled, so treat the weights as carrying that restriction. The corpus (Section 5.2) is per-sample licensed: EUR-Lex under Commission Decision 2011/833/EU, Wikipedia text under CC BY-SA 4.0.

References

  • (1)
  • Agbeti-Messan et al. (2026) Merveilles Agbeti-Messan, Pierrick Tranouez, Stéphane Nicolas, Clément Chatelain, and Thierry Paquet. 2026. A Benchmark of State-Space Models vs. Transformers and BiLSTM-based Models for Historical Newspaper OCR. arXiv:2604.00725. arXiv:2604.00725
  • Baek et al. (2019) Jeonghun Baek, Geewook Kim, Junyeop Lee, Sungrae Park, Dongyoon Han, Sangdoo Yun, Seong Joon Oh, and Hwalsuk Lee. 2019. What Is Wrong With Scene Text Recognition Model Comparisons? Dataset and Model Analysis. In Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV). IEEE, Seoul, Korea (South), 4715–4723. doi:10.1109/ICCV.2019.00481
  • Benjamini and Hochberg (1995) Yoav Benjamini and Yosef Hochberg. 1995. Controlling the False Discovery Rate: A Practical and Powerful Approach to Multiple Testing. Journal of the Royal Statistical Society: Series B (Methodological) 57, 1 (1995), 289–300. doi:10.1111/j.2517-6161.1995.tb02031.x
  • Borg and Gatt (2017) Claudia Borg and Albert Gatt. 2017. Morphological Analysis for the Maltese Language: The Challenges of a Hybrid System. In Proceedings of the Third Arabic Natural Language Processing Workshop (WANLP). Association for Computational Linguistics, Valencia, Spain, 25–34. doi:10.18653/v1/W17-1304
  • DocEng 2026 Organisers (2026) DocEng 2026 Organisers. 2026. DocEng 2026 Competition on Maltese Paragraph OCR. ACM Symposium on Document Engineering. Competition task description and baselines.
  • Efron and Tibshirani (1993) Bradley Efron and Robert J. Tibshirani. 1993. An Introduction to the Bootstrap. Number 57 in Monographs on Statistics and Applied Probability. Chapman and Hall/CRC, New York. doi:10.1201/9780429246593
  • Fiscus (1997) Jonathan G. Fiscus. 1997. A Post-Processing System to Yield Reduced Word Error Rates: Recognizer Output Voting Error Reduction (ROVER). In Proceedings of the IEEE Workshop on Automatic Speech Recognition and Understanding (ASRU). IEEE, Santa Barbara, CA, 347–354. doi:10.1109/ASRU.1997.659110
  • Gupta et al. (2016) Ankush Gupta, Andrea Vedaldi, and Andrew Zisserman. 2016. Synthetic Data for Text Localisation in Natural Images. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR). IEEE, Las Vegas, NV, 2315–2324. doi:10.1109/CVPR.2016.254
  • Koehn (2004) Philipp Koehn. 2004. Statistical Significance Tests for Machine Translation Evaluation. In Proceedings of the Conference on Empirical Methods in Natural Language Processing (EMNLP). Association for Computational Linguistics, Barcelona, Spain, 388–395. ACL Anthology has not assigned a DOI to this paper. https://aclanthology.org/W04-3250
  • Li et al. (2025) Jonathan Li, Zoltan Csaki, Nidhi Hiremath, Etash Guha, Fenglu Hong, Edward Ma, and Urmish Thakker. 2025. Synthetic Document Question Answering in Hungarian. arXiv:2505.23008. arXiv:2505.23008
  • Li et al. (2023) Minghao Li, Tengchao Lv, Jingye Chen, Lei Cui, Yijuan Lu, Dinei Florencio, Cha Zhang, Zhoujun Li, and Furu Wei. 2023. TrOCR: Transformer-based Optical Character Recognition with Pre-trained Models. In AAAI Conference on Artificial Intelligence.
  • Lopresti and Zhou (1997) Daniel Lopresti and Jiangying Zhou. 1997. Using Consensus Sequence Voting to Correct OCR Errors. Computer Vision and Image Understanding 67, 1 (1997), 39–47.
  • Lund and Ringger (2009) William B. Lund and Eric K. Ringger. 2009. Improving Optical Character Recognition through Efficient Multiple System Alignment. In Proceedings of the 9th ACM/IEEE-CS Joint Conference on Digital Libraries (JCDL). ACM, 231–240.
  • Maltese Language Resource Server (2025) Maltese Language Resource Server. 2025. malti: A Python library for processing text in the Maltese language. https://github.com/MLRS/malti. Accessed 2026-07-02.
  • Micallef et al. (2022) Kurt Micallef, Albert Gatt, Marc Tanti, Lonneke van der Plas, and Claudia Borg. 2022. Pre-training Data Quality and Quantity for a Low-Resource Language: New Corpus and BERT Models for Maltese. In Proceedings of the Third Workshop on Deep Learning for Low-Resourced Natural Language Processing (DeepLo). Association for Computational Linguistics, Dublin, Ireland, 90–101. doi:10.18653/v1/2022.deeplo-1.10
  • MLRS (2026) MLRS. 2026. MLRS/korpus_malti: General Maltese corpus, version 4.2. https://huggingface.co/datasets/MLRS/korpus_malti. HuggingFace dataset card. Accessed 2026-07-02.
  • Smith (2007) Ray Smith. 2007. An Overview of the Tesseract OCR Engine. In Proceedings of the Ninth International Conference on Document Analysis and Recognition (ICDAR). IEEE, Curitiba, Brazil, 629–633. doi:10.1109/ICDAR.2007.4376991
  • Smith et al. (2009) Ray Smith, Daria Antonova, and Dar-Shyang Lee. 2009. Adapting the Tesseract Open Source OCR Engine for Multilingual OCR. In Proceedings of the International Workshop on Multilingual OCR. ACM, Barcelona, Spain, 1–8. doi:10.1145/1577802.1577804
  • Stuner et al. (2020) Bruno Stuner, Clément Chatelain, and Thierry Paquet. 2020. LV-ROVER: Lexicon Verified Recognizer Output Voting Error Reduction. International Journal on Document Analysis and Recognition (IJDAR) 23, 1 (2020), 1–13. doi:10.1007/s10032-019-00344-9
  • Tanti et al. (2026) Marc Tanti, Alexandra Bonnici, and Stefania Cristina. 2026. NOMOCRAT: New Open Maltese OCR Annotated Text. https://www.systemsandcontrol.com/post/nomocrat-new-open-maltese-ocr-annotated-text. University of Malta project, Xjenza Malta grant REP-2024-057; project post, no formal proceedings venue. Post undated; the grant number reflects the award year, not the post’s date. The post itself references the then-upcoming DocEng 2026 competition, indicating 2026 authorship. Accessed 2026-07-04.
  • Vaessen (2025) Nik Vaessen. 2025. jiwer: Evaluate automatic speech recognition systems. https://github.com/jitsi/jiwer. v4.0.0, Python package for CER/WER computation. Accessed 2026-07-02.
  • Wick et al. (2020) Christoph Wick, Christian Reul, and Frank Puppe. 2020. Calamari - A High-Performance TensorFlow-based Deep Learning Package for Optical Character Recognition. Digital Humanities Quarterly 14, 2 (2020). http://www.digitalhumanities.org/dhq/vol/14/2/000451/000451.html
  • Yim et al. (2021) Moonbin Yim, Yoonsik Kim, Han-Cheol Cho, and Sungrae Park. 2021. SynthTIGER: Synthetic Text Image Generator Towards Better Text Recognition Models. In Proceedings of the International Conference on Document Analysis and Recognition (ICDAR). Springer, Cham, 109–124. doi:10.1007/978-3-030-86337-1_8

Appendix A LV-ROVER-MLT Inference Algorithm

Algorithm A matches the shipped inference code. PjP_{j} is the joined, normalised paragraph from stream jj and WjW_{j} its word-tokenised form; LL is the Maltese lexicon; ed\mathrm{ed} is Levenshtein distance; alpha\mathrm{alpha}, nonascii\mathrm{nonascii} and diac\mathrm{diac} count alphabetic, non-ASCII alphabetic, and Maltese canary characters (ċ ġ ħ ż and capitals) respectively.

 

Algorithm 1 LV-ROVER-MLT per-image inference.

 

Input: image II, lexicon LL  Output: paragraph string ss

for j{1,,5}j\in\{1,\ldots,5\} do   (recognise, join, normalise)
IjUpscale(I,2×)I_{j}\leftarrow\textsc{Upscale}(I,2{\times}) if j=5j{=}5 else II
PjJoin(Tesseract(Ij,configj))P_{j}\leftarrow\textsc{Join}(\textsc{Tesseract}(I_{j},\mathrm{config}_{j})), hyphen-repaired, NFC
end for
PP2P^{*}\leftarrow P_{2}; if |P|<0.6maxj|Pj||P^{*}|<0.6\max_{j}|P_{j}| then Pargmaxj|Pj|P^{*}\leftarrow\arg\max_{j}|P_{j}|
if |P|100|P^{*}|\geq 100: for each wLw\notin L with |w|3|w|\geq 3,
rank single-character substitutions by P(truetess)P(\mathrm{true}\mid\mathrm{tess}) descending;
accept the first cLc\in L with alpha(c)alpha(w)\mathrm{alpha}(c)\geq\mathrm{alpha}(w),
nonascii(c)nonascii(w)\mathrm{nonascii}(c)\geq\mathrm{nonascii}(w), ||c||w||1\big||c|{-}|w|\big|\leq 1, ed(w,c)2\mathrm{ed}(w,c)\leq 2
Candidates \leftarrow the non-anchor streams, identical complete paragraphs
collapsed; align each distinct candidate’s WjW_{j} to anchor WW^{*};
unmatched candidate insertions are discarded (anchor structure kept)
for each anchor word aa at position pp do
for each aligned candidate cc, in stream order do
if strip_diac(a)=strip_diac(c)\mathrm{strip\_diac}(a){=}\mathrm{strip\_diac}(c), diac(c)>diac(a)\mathrm{diac}(c)>\mathrm{diac}(a),
cLc\in L, ed(a,c)2\mathrm{ed}(a,c)\leq 2 then propose cc   (restoration gate)
else if aLa\notin L, cLc\in L, alpha(c)alpha(a)3\mathrm{alpha}(c)\geq\mathrm{alpha}(a)\geq 3,
|c||a|1|c|\geq|a|{-}1, ||a||c||2\big||a|{-}|c|\big|\leq 2, nonascii(c)nonascii(a)\mathrm{nonascii}(c)\geq\mathrm{nonascii}(a),
1ed(a,c)21\leq\mathrm{ed}(a,c)\leq 2 then propose cc   (ordinary swap gate)
end for
W^[p]\hat{W}[p]\leftarrow the proposal with the most votes, ties broken by the
    fixed candidate iteration order; else aa if no proposal
end for
sCurlDoubleQuote(CurlApostrophe(FixLeadMarker(Join(W^))))s\leftarrow\textsc{CurlDoubleQuote}(\textsc{CurlApostrophe}(\textsc{FixLeadMarker}(\textsc{Join}(\hat{W}))))
return ss
 

Appendix B Synthetic Data Generation Algorithm

Algorithm B gives the per-sample rendering procedure that produces the training shards (Table 1) and the fine-tuning data described in Section 3.3.

 

Algorithm 2 Synthetic paragraph generation, per sample.

 

Input: corpus paragraph text tt, validated 68-face font pool FF (62 printed, 6 handwriting), augmentation config   Output: image II, label \ell

Stage 1: layout
font \leftarrow sample(FF); pt \leftarrow uniform(8, 14);
width \leftarrow uniform(400px, 1200px)
lines \leftarrow greedy word-wrap(tt, font, width)
if lines[1][-1] ends mid-compound then rewrap before the
    dash, not after   (open-class compounds, not clitics)
Stage 2: hyphenation and dash tagging
for each line break, with probability 0.060.06 do
split trailing word; tag U+00AD at the label join point
classify the printed hyphen: soft / structural / compound
end for
with probability 0.300.30, redraw a printed em-dash as an
    image-only en-dash (label keeps U+2014 regardless)
Stage 3: render
draw lines onto a white canvas at the corrected DPI
    (half-resolution Lanczos rescale, Section 3.2.2)
justify with probability 0.450.45; vary line spacing,
    padding, and leading-bullet markers
Stage 4: augment
apply, in order: rotation (±1.5\pm 1.5^{\circ}), Gaussian blur,
    brightness/contrast jitter, ink bleed, column-edge crop,
    mild elastic distortion, salt-and-pepper, JPEG re-encode
    (quality 65–80 jitter around the 72 calibration target,
    matching real-crop compression)
return augmented image II, label \ell (soft hyphens as
    U+00AD, structural hyphens as literal -)
 

Fine-tuning (Section 3.3) is not part of this per-sample procedure: rendered lines from Algorithm B accumulate into shards, which warm-start Tesseract’s stock Maltese model onto the merged character set and train it at a fixed seed, checkpointing on development-set CER.