tetrak-easyocr-armenian
Armenian language support for EasyOCR — a trained recognition model, installable as a custom network.
Status: alpha, shipping v6 weights and a word list.
reader()downloads a trained model and works out of the box. v6 is v5 fine-tuned on 99,521 real crops cut from the scans of sixteen works: an encyclopedia, a medical encyclopedia, a bilingual dictionary, a scholarly history and literary editions in both dialects. Withfold_script()and the word list, it leads every Armenian engine we have measured on word recall on three of eight held-out registers, and is within a thousandth on a fourth. The numbers, and the registers it still trails on, are on the model card.Figures published for v5 and earlier used a character-similarity metric later found to be wrong (difflib's
autojunk) and are not comparable with v6's.Upgrading from v0 or v1? Do. Both were trained with 21% of their labels carrying quotation marks the images do not show, and with no class for the abbreviation dot
․(U+2024) at all. The model card records both.
Usage
pip install tetrak-easyocr-armenian
import tetrak_hy
reader = tetrak_hy.reader() # an easyocr.Reader, Armenian-ready
results = reader.readtext("scan.png")
reader() accepts everything easyocr.Reader does (gpu=, verbose=,
…) and handles the custom-network plumbing: the network config and weights
are materialised into ~/.tetrak_hy/ on first use, and the quirks of
EasyOCR's custom-model loading path (there are a few) stay our problem
rather than yours.
The weights live in the Hugging Face model repository, which is canonical for them, and each library version pins one immutable Hub revision — so the model you get is decided by the version of this package you installed, never by what happens to be current upstream.
Cached weights are verified against the release's SHA-256 every time they are loaded, not only when they are downloaded. A file that matches is used as it is — so a machine with no outbound access works once the weights are in place — and one that does not, because it was corrupted or because you have upgraded to a release carrying a new model, is replaced by a fresh verified download.
Set TETRAK_HY_HOME to put the cache somewhere other than your home
directory, or choose it per call:
reader = tetrak_hy.reader(cache_dir="/srv/models/tetrak_hy")
A local .pth passed as weights_path= is kept in a local/
subdirectory of the cache, so testing your own weights does not disturb
the released ones.
Folding cross-script homoglyphs
The recognition network has no language model, so inside an Armenian word
it sometimes emits the visually identical Latin twin of an Armenian
character instead — Latin h for հ, a colon for the Armenian full stop
։. fold_script() corrects these on already-recognised text, and is
worth applying to every result:
results = [
(bbox, tetrak_hy.fold_script(text), confidence)
for bbox, text, confidence in reader.readtext("scan.png")
]
It only touches a token that already contains an Armenian letter, so Latin or Cyrillic text sharing a page is left alone. See the function's docstring for the exact scope and what it deliberately does not fold.
Correcting words with the word list
The network reads one character at a time, so a word it misreads by one
letter comes out as written, even when the right word was its own second
choice. reader(lexicon=True) downloads the released word list (1.1
million Armenian word forms, verified and cached like the weights) and
corrects out-of-vocabulary words from the model's own alternatives:
reader = tetrak_hy.reader(lexicon=True)
results = [
(bbox, tetrak_hy.fold_script(text), confidence)
for bbox, text, confidence in reader.readtext("scan.png", decoder="beamsearch")
]
decoder="beamsearch" is how the model's probabilities reach the
correction; greedy calls are unchanged. A word is only replaced by a listed
reading the model itself found nearly as probable, and keeps its
punctuation. What it can break is what any word list breaks: proper nouns,
and classical or edition spellings the list does not know. On held-out
pages it fixed 465 words for every 13 it broke. To use your own list, pass
it to tetrak_hy.lexicon.use_lexicon(reader, tetrak_hy.lexicon.load_wordlist(path)).
What it is
EasyOCR does not ship Armenian. This package adds it as a custom recognition network: EasyOCR's own generation2 architecture (VGG + BiLSTM + CTC), trained for the Armenian script — the full alphabet, the և ligature, Armenian punctuation (՝ ՛ ՞ ՜ ։ ֊ « »), digits and basic Latin for mixed material. Detection is untouched: EasyOCR's CRAFT detector already finds Armenian text; reading it is what was missing.
The import name tetrak_hy is also the EasyOCR network name — EasyOCR
imports this package directly as the model architecture. If you prefer to
wire the Reader yourself:
import easyocr
reader = easyocr.Reader(
["en"], # see note below
recog_network="tetrak_hy",
user_network_directory="~/.tetrak_hy",
model_storage_directory="~/.tetrak_hy",
)
(["en"], not ["hy"]: EasyOCR looks up a per-language character file it
does not have for Armenian. The setting is decorative for custom models —
the model's own character list governs decoding — and reader() hides
this entirely.)
Provenance
The model is trained by tetrak-hy-trainer on synthetic line crops: text from human-proofread pages on Armenian Wikisource (CC BY-SA 3.0) — eleven volumes of the Armenian Soviet Encyclopedia plus the collected works of Otyan, Totovents, Baronian and Tumanyan, Faustus of Byzantium, a popular medical encyclopedia and an Armenian–English dictionary — rendered in fifteen Armenian faces at real scan sizes and degraded to look scanned. v5 added a fine-tune on real crops cut from human-proofread scans and labelled from their transcripts, mixed with the synthetic set so the model adapts to real print without forgetting the breadth it started with. v6 continues that fine-tune on 99,521 real crops from 862 scans of sixteen sources, including more volumes of the editions v5 read least well. The widened corpus is what taught it both dialects and several registers rather than one encyclopedia's typography; the real-crop fine-tune is what closed the gap on degraded letterpress that a cleanly rendered font cannot teach.
The word list counts words in the same proofread transcripts, with the
evaluation pages excluded, and adds every word form of the
Nayiri Armenian Lexicon
(© Serouj Ourishian, CC BY 4.0). It is published beside the weights as
wordlist.tsv.gz, under CC BY-SA 4.0 because of those sources, and is
downloaded only when reader(lexicon=True) or wordlist() asks for it.
Every weights release carries a provenance record — data recipe, fonts,
dataset revision, training config and checksums — published as
provenance.json beside the weights. The training data is published
too, as
tetrak/armenian-ocr-crops.
Built for Tetrak, a local-first transcription
pipeline for archival material, which consumes this package as its
easyocr-hy backend — but nothing here depends on Tetrak.
Licence
Apache License 2.0 — see LICENSE and NOTICE. The architecture re-exported here is EasyOCR's (Apache 2.0). The word list the package downloads on request is CC BY-SA 4.0, not Apache 2.0; see above.
Development
python3 -m venv .venv && source .venv/bin/activate
pip install -e '.[dev]'
pytest
ruff check src tests && ruff format --check src tests
Commits follow Conventional Commits,
enforced by the hook in .githooks/ (git config core.hooksPath .githooks
after cloning, or lefthook install). Releases and CHANGELOG.md are
generated from those commits automatically on every push to main.
See CONTRIBUTING.md for the full workflow — checks, the dependency lockfile, and what the automation expects — and SECURITY.md for how to report a vulnerability.
Metadata
Release files for tetrak-easyocr-armenian 0.8.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| tetrak_easyocr_armenian-0.8.0.tar.gz | 177.0 kB | With provenance | Details for tetrak_easyocr_armenian-0.8.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| tetrak_easyocr_armenian-0.8.0-py3-none-any.whl | Python 3 | none | any | Details for tetrak_easyocr_armenian-0.8.0-py3-none-any.whl |
Total release size: 201.0 kB
Release files / tetrak_easyocr_armenian-0.8.0.tar.gz
| Download URL | tetrak_easyocr_armenian-0.8.0.tar.gz |
|---|---|
| Size | 177.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6fb21989743a528e26878dafb142dc2f523589613a36cae80b7ef0e8d639baac
|
|
BLAKE2b-256 checksum How to use checksums |
178807d1276c335307ca2272886548daabb2b320ec1432a5d57c246d8568b84d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency logRelease files / tetrak_easyocr_armenian-0.8.0-py3-none-any.whl
| Download URL | tetrak_easyocr_armenian-0.8.0-py3-none-any.whl |
|---|---|
| Size | 24.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
59dfd20ede9bb2dc7bf2c77934dd985cb478540c82d32786a9b8d0c2265c2d8d
|
|
BLAKE2b-256 checksum How to use checksums |
6c87e013f805aa925fdebeb4661923c224a9b7b89a01b5429b28467f9035f6a7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency logSecurity for tetrak-easyocr-armenian 0.8.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for tetrak_easyocr_armenian-0.8.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.