Each language is its own small model, 0.8M or 1.2M parameters at 4 bits, plus a list of its common words, and one 6.6 KB (compressed) JavaScript runner serves all of them. Everything a page loads for one language is under 1 MB, so it runs in the browser and nothing you type leaves your device.
On the Aksharantar test it is ahead of IndicXlit's model in all 12, by 4.2 points in Odia to 14.8 in Bengali. I think for a web page or an app the size matters a lot. The card has the full table, language by language.
Using it in your own page is a few lines, in the browser or in Node 18+:
import { Transliterator } from "./translit.js";
const tr = await Transliterator.load({
model: "tamil/model.q4.gz", json: "tamil/model.json.gz",
words: "tamil/words.bin.gz", rerank: "tamil/rerank.json",
});
tr.text("eppadi irukkeenga"); // எப்படி இருக்கீங்கApache-2.0 for the models and the runner. If you write one of these languages every day, try it and tell me which words it gets wrong.
Model: udgamlabs/Lekhani
Demo: udgamlabs/Lekhani
Write-up: https://udgamlabs.com/blog/lekhani-12