Normalize romanized Armenian
before it reaches your models.

Comments, reviews and chat logs written in Latin letters don’t match the Armenian script your embeddings, search and analytics were built for — and the same word arrives in three different spellings. Converting everything to canonical Armenian script collapses the variants before they fragment your dataset.

  1. 1The problemMixed script and spelling variants fragment vocabularies and defeat search.
  2. 2The requestPush text through the API in bulk, with use_llm: false.
  3. 3The responseOne canonical Armenian form — deterministically, with a confidence count.
  4. 4The resultCleaner corpora, reproducible pipelines, weak rows flagged for review.
The problem

Three spellings per word is three times the noise

A model — or a group-by — treats vonts, vonc and vontz as three different tokens. They are the same word.

A comment feed, as typed

@armine_k · review

Shaaat lav gorg e

@tiko_88 · comment

vonc karox e ayd lini

@gugarik · support chat

yes erku hat gorg em gnel

Why the data suffers

  • Script mismatch. Embeddings and language models trained on Armenian script score romanized text as out-of-vocabulary noise — sentiment, classification and RAG chunks all degrade.
  • Variant explosion. Stretched vowels (shaaat), alternative letters (vontz) and spelling habits (yes vs es) multiply every word’s surface forms.
  • Hand-written rules never keep up. User-generated text arrives faster than a maintainable replace-list. The engine’s dictionary already recognises 19,000+ word spellings.
The integration

A deterministic step in your pipeline

Turn the LLM layer off for normalization: the instant engine always maps the same input to the same output, which makes runs reproducible and results cacheable. Send up to 10,000 characters per request — line breaks and numbers are preserved.

Request · POST /api/v1/transliterate
curl -X POST https://armtranslit.com/api/v1/transliterate \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text": "Shaaat lav gorg e", "use_llm": false}'
Response · 200 OK
{
  "id": "019b6a43-c5d8-74a1-8e3b-97c1f0a4d682",
  "input": "Shaaat lav gorg e",
  "raw_transliteration": "Շատ լավ գորգ է",
  "refined_text": null,
  "tone": "casual",
  "used_llm": false,
  "matched_words": 2,
  "total_words": 4
}
Batch normalization · Python
def normalize(records: list[str]) -> list[str]:
    """Romanized comments -> Armenian script. Records: non-empty, one line each."""
    out = []
    for chunk in batched(records, 200):  # size chunks to fit 10,000 chars per call
        r = httpx.post(
            "https://armtranslit.com/api/v1/transliterate",
            headers={"X-API-Key": "YOUR_API_KEY"},
            json={"text": "\n".join(chunk), "use_llm": False},
        )
        body = r.json()
        if body["matched_words"] < 0.3 * body["total_words"]:  # tune on your data
            log.warning("weak batch: %d records need review", len(chunk))
        out += body["raw_transliteration"].split("\n")
    return out

Why it works on a pipeline

raw_transliteration
One canonical Eastern-Armenian form for every spelling variant. The same input always yields the same output — cache it freely.
use_llm: false
Skips the AI layer entirely: deterministic, consistent, and no third-party call on the batch path.
matched_words / total_words
A built-in quality signal. Rows with low confidence go to human review instead of silently polluting the dataset.
Structure preserved
Line breaks and numbers survive conversion, so one request can carry a batch of single-line records and split cleanly afterwards.

Variant spellings, one canonical form

As typedCanonical formWhat collapsed
vonts · vonc · vontzոնցthree letters for the same sound — “how”
shat · shaaatշատstretched vowels — “very”
es · yesեսspelling habits — “I”
bayc · baytzբայցvariant endings — “but”
Hima eli vonc?Հիմա էլի ո՞նցpunctuation lands where Armenian writes it
The business result

The same feed, after one deterministic step

Downstream, everything sees one script and one form per word — embeddings, keyword analytics, deduplication, topic clustering, and search.

Normalized corpus

@armine_k · review

Շատ լավ գորգ է

@tiko_88 · comment

ոնց կարող է այդ լինի

@gugarik · support chat

ես երկու հատ գորգ եմ գնել

  • Vocabulary collapses. Every spelling variant of a word maps to one Armenian form, so deduplication, frequency counts and keyword analytics stop undercounting.
  • Models see in-domain text. Romanized rows stop scoring as noise against Armenian-script embeddings and classifiers.
  • Runs are reproducible. No sampling and no model drift: the same input converts the same way, and output only changes when a reviewed dictionary fix lands — easy to cache and diff.
  • Quality is measurable. The per-request confidence count gives you an audit number for how much of the corpus converted cleanly — and what to review by hand.
FAQ

Pipeline questions

Anything else? Write to us and we’ll help.

Which Armenian does the API normalize to?

Eastern Armenian, the standard used in Armenia — the same variety across every request, so your corpus stays internally consistent.

Is the output really deterministic?

Yes, with use_llm: false. The dictionary and rule engine always convert the same text to the same Armenian output — no sampling, no model drift between runs. A word only changes when a reviewed fix is added to the dictionary.

What happens to words the dictionary doesn’t know?

They still convert, letter-by-letter by the rules — and the response’s matched_words / total_words count tells you how much of the text came from the dictionary. Low-confidence batches are your review queue.

More use cases

See it in another context

Run your messiest dataset through it

Get a key, paste a real batch into the playground, and check the confidence count on your own text before you commit a single pipeline change.