Transliterating Punjabi Names From Gurmukhi to Latin Script
10 min read · updated August 11, 2026
Run ਢਿੱਲੋਂ through a model three times and you may get Dhillon, Dhilon and Dhillo. Every one of those appears on real documents. There is no authority that prefers one, and that absence — not the model — is what you are looking at.
Why there is nothing to converge on
For Chinese there is GB/T 16159, for Korean there is Revised Romanization, for Ukrainian there is a Cabinet resolution. For Punjabi names in Latin script there is no equivalent in daily use. ISO 15919 covers Gurmukhi as part of its Indic coverage and produces a precise diacritic form, but essentially nobody writes their name that way; the spellings in circulation come from a century of individual choices made on immigration forms.
Punjabi also has two scripts, which is the first thing to establish before anything else. Gurmukhi is used in Indian Punjab; Shahmukhi, a Perso-Arabic script, is used in Pakistani Punjab. They write the same language and romanise differently, because the Shahmukhi problem inherits the abjad vowel ambiguity described in transliterating an unvocalised script and the Gurmukhi problem does not. A prompt that says “Punjabi” without saying which script is under-specified.
Given a model sampling over spellings it has seen, with no standard to pull it back, variance is the expected behaviour rather than a defect. The fix is not a better prompt asking for correctness; it is a prompt that asks for a specific, defined form, plus a separate field for the conventional one.
The letters with no Latin equivalent
- The retroflex series. ਟ ਠ ਡ ਢ ਣ are retroflex; ਤ ਥ ਦ ਧ ਨ are dental. ISO 15919 marks the first set with a dot below —
ṭ ṭh ḍ ḍh ṇ— and ordinary Latin spelling collapses both sets intot,dandn. - ੜ, the retroflex flap. No English sound is close. It appears as
r,rh,dor nothing at all, so ਸੜਕ can besarak,sarhakorsadak. - The tonal consonants. ਘ ਝ ਢ ਧ ਭ historically represented voiced aspirates and in modern Punjabi are realised as a tone on the syllable rather than as aspiration. So ਘੋੜਾ is
ghoraif you transliterate the letter and something closer tokorawith a low tone if you transcribe the sound. Punjabi is the tonal language of the Indic group, and the Latin alphabet records none of it. - Adhak, the gemination mark. The small mark ੱ doubles the following consonant. It is why
Dhillonhas twols. It is frequently dropped in casual spelling, which is whereDhiloncomes from. - Tippi and bindi. ੰ and ਂ mark nasality. The realisation depends on the following consonant, so ਸਿੰਘ gives
ngbefore a velar, and a word-final bindi may be renderednor omitted. - The bindi-modified consonants. ਸ਼
sh, ਖ਼kh, ਗ਼gh, ਜ਼z, ਫ਼f, ਲ਼l. The subscript dot is often omitted in typed Punjabi even where the word requires it, so the source itself is inconsistent before you start.
One name, labelled grapheme by grapheme
Take ਗੁਰਪ੍ਰੀਤ ਸਿੰਘ ਢਿੱਲੋਂ and take it apart.
ਢਿੱਲੋਂ
ਢ retroflex, aspirate ISO 15919: ḍh common: dh
ਿ short i common: i
ੱ adhak — doubles the next consonant
ਲ l (doubled by adhak) common: ll
ੋ o common: o
ਂ bindi — nasalisation ISO 15919: ṁ common: n or nothing
ISO 15919 Ḍhillōṁ
in use Dhillon, Dhilon, Dhillo, Dhillan
ਸਿੰਘ
ਸ s ਿ i ੰ tippi (nasal) ਘ gh (tonal)
ISO 15919 Siṅgh
in use Singh (effectively invariant — a religious name with
a fixed conventional spelling)
ਗੁਰਪ੍ਰੀਤ
ਗ g ੁ u ਰ r ਪ੍ਰ conjunct pr ੀ long i ਤ t
ISO 15919 Gurprīt
in use Gurpreet, GurpritThree graphemes account for all the variance in that name: the adhak (kept or dropped, giving ll or l), the final bindi (rendered n or omitted), and the long ī (written ee or i). Each has two accepted answers, which is eight combinations, and the model is choosing among them with nothing to prefer.
ਸਿੰਘ is the instructive counterexample. It has the same kinds of ambiguity — a nasal and a tonal consonant — and it does not vary, because Singh is a conventionally fixed spelling that the model has seen a very large number of times. Variance is not a property of the letters; it is a property of how settled the particular name is. Common names are stable and unusual ones are not, which is the opposite of the pattern people expect.
A prompt that produces two fields
Ask for the reversible form and the conventional form separately, because they answer different questions and merging them is what makes the output feel arbitrary.
SYSTEM
You transliterate Punjabi names written in Gurmukhi into Latin script.
Return two fields for every input.
1. "iso15919": strict ISO 15919. Full diacritics. Mark retroflexes with
a dot below, long vowels with a macron, the anusvara as m-dot.
Preserve gemination from adhak. This field must be reversible.
2. "common": the spelling most frequently used by Punjabi speakers
writing their own names in English. ASCII only.
- Keep gemination from adhak as a doubled consonant (Dhillon).
- Render a word-final bindi as n.
- Render long i as "ee" (Gurpreet, not Gurprit).
- Retroflex and dental both map to t / d / n.
- Keep conventional fixed spellings: Singh, Kaur, Sandhu, Gill.
If a name has an established English spelling you recognise, use it in
"common" and set "conventional": true so a reviewer can see which rows
were recalled rather than derived.
Output JSON: [ { "gurmukhi": "...", "iso15919": "...",
"common": "...", "conventional": true } ]- Set temperature to 0. This does not make the mapping correct, but it removes the sampler as a source of difference so that two runs on the same input agree, which is what “varies run to run” usually means in practice.
- Run a batch containing a name with adhak, a name with a final bindi, and a name with ੜ. Those three cover the ambiguity surface.
- Assert that
commonis ASCII and thatiso15919is not. If they are both ASCII the model produced one answer twice. - Group by
iso15919and check thatcommonis constant within each group. A group with two spellings is the exact defect this page is about, and it is now visible in a query rather than in a support ticket. - Store the Gurmukhi. Both Latin fields are derived, and the ISO 15919 one is the only one you can regenerate the original from.
Reducing run-to-run variance
Temperature handles the sampler. The remaining variance comes from the prompt leaving a decision open, and the way to close it is to enumerate the graphemes rather than to ask for consistency — an instruction to “be consistent” gives the model nothing to be consistent with, since it cannot see its own previous outputs.
For a fixed population of names, the strongest option is not a prompt at all. Generate the mapping once, review it, store it as a table, and look names up afterwards. The model is doing a job it is genuinely good at — recalling how Punjabi speakers actually spell these names, which no rule-based transliterator can do — and that job only needs doing once per distinct name. Calling it per request converts a solved lookup back into a sampling problem.
If you are also budgeting for this text rather than only spelling it, Gurmukhi tokenises poorly against English-centric vocabularies — what Punjabi costs in tokens covers why a short name can consume a surprising number of them.