Overview
Text normalization (TN) is an automatic step that runs on every synthesis request before audio is generated. It converts written text — numbers, currency, dates, abbreviations, IDs, and more — into the natural spoken form that gets sent to the voice. You don’t need to pre-format most input. Write text naturally and TN handles it.Supported Languages
TN is active for all 10 supported languages. Select the language using thelanguage parameter, or pass auto to detect it from the input script.
English, Hindi, Marathi, and Tamil have the deepest coverage, including irregular number forms and compound constructions. The other six languages are fully supported — number and currency word choices are under continuous refinement, so occasional word-choice updates may arrive over time even though sentence structure is always correct.
hinglish is not a valid language value. It appears only as an internal outcome of auto detection on code-mixed Devanagari + Latin text. Passing language: "hinglish" in a request is rejected.How auto detection works
When language is auto, the dominant script in your input determines the normalization profile:
English words that always stay in English
Regardless of the resolved language, these are always read in English — matching how they’re spoken even in fluent Indic speech:- Units of measurement (
kg,km,°C,GB, etc.) AM/PM- URLs and email addresses
language is auto. When you set a language explicitly, they localize — Hindi uses the formal register (दशमलव / प्रतिशत); all other languages use the colloquial loanword form (e.g. Kannada ಪಾಯಿಂಟ್ / ಪರ್ಸೆಂಟ್).
How Normalization Works
Every synthesis request passes through the same ordered pipeline:- Inline markup (pause or speed tags) is stripped from the spoken output.
- The target language profile is resolved from
language, or auto-detected. - Honorifics are expanded (
Dr.→ Doctor / डॉक्टर). - Address and business abbreviations are expanded (
Rd→ Road,Ltd→ Limited). - Numbers, currency, dates, times, and identifiers are normalized in a fixed rule order — more specific patterns (like a PAN number) are always claimed before general ones (like a bare digit run).
- Common initialisms (
OTP,GST,EMI, etc.) are spelled out letter-by-letter. - Natural pause commas are inserted for dense ID and phone patterns.
Numbers
Cardinal numbers vs. digit-by-digit IDs
A bare number isn’t always read as a quantity — context decides:- Quantity — if the number follows a word like
iPhone,Class,Sector,Seat,Row, orGate, it’s always read as a number (e.g. “iPhone fifteen”, “Sector eleven”). - Digit-by-digit — triggered by context words like
account,OTP,card,PIN,Aadhaar, orPANnear the number, or a run of 6+ digits, or exactly 4/6/10/12/16 digits. - Duration words (
minutes,hours,days) always force a quantity reading, even for digit runs that would otherwise look ID-like.
880044 → “double eight double zero double four”). Every other language spells each digit individually.
Numeric ranges
An en-dash (–) between two numbers is read as “to”:Currency
The rupee word localizes per language (रुपये in Hindi/Marathi, ரூபாய் in Tamil, etc.). Any currency symbol (
$, £, ¥, €, ¢) is always expanded to a word — raw symbols never appear in the spoken output.
Percentages
Dates
Dates inDD/MM/YYYY, DD-MM-YYYY, and written-month formats (25 Jun 2026) are read in full and localized per language.
Financial year and quarter references
A two-part number like
23/06 is read as a fraction, not a date. Include the year (23/06/2026) if you mean a date.Time
Non-English languages use their own natural time phrasing rather than a direct translation of the English pattern.
Math Symbols
When
×, x, or * is immediately followed by a unit (inches, cm, ft), it reads as “by” instead of “multiplied by” — 5x7 inches → “five by seven inches.” The fixed idiom 24x7, 24×7, and 24/7 always reads as “twenty four seven.”Fractions
A bare<number>/<number> that isn’t part of a recognized date reads as a fraction:
Only Hindi and Marathi have a confirmed native connector word (“बटा” / “भागिले”). The other seven languages use the English loanword “by.”
Units & Measurements
Roman Numerals
Roman numerals are only converted in two cases:- The entire input is a roman numeral by itself (
XIV→ fourteen). - A roman numeral immediately follows a trigger word:
Chapter,Part,Section,Volume,Book,Class,Grade,King,Queen,Pope,Emperor,World War,Super Bowl,Article, orAppendix(e.g. “Chapter XIV” → “Chapter fourteenth”).
MIX, CIVIC, MD) are never converted in normal sentences.
Identifiers
Structured IDs are read with grouped digits/letters and natural pauses between groups.URLs, Emails & UPI Handles
URLs and emails are always read in English regardless of the target language. Digits inside them use English digit words even in non-English speech.
Honorifics
Every supported language has its own honorific table (e.g. Tamil
Mr. → திரு, Telugu Dr. → డాక్టర్).
Km. and Ms. also look like unit abbreviations (kilometres, milliseconds). When a number directly precedes them (10 km, 200 ms), they read as the unit, not the honorific. This is a deliberate trade-off — real-world text essentially never has a number immediately before a name.Address & Business Abbreviations
These are always read in English, since they’re conventionally spoken as English loanwords even in Indic-language speech.Brand & Product Name Pronunciation
Some brand names don’t have a reliable pronunciation from their spelling. As an example, Gnani is rendered natively per language rather than read literally:
This only applies to the standalone word — “Gnani” inside an email address is read as a normal email, not substituted.
If a brand or product name in your content consistently misreads, contact your Gnani point of contact — custom pronunciation entries can be added.
Common Abbreviations
These initialisms are always spelled letter-by-letter:Full list of letter-by-letter abbreviations
Full list of letter-by-letter abbreviations
OTP, EMI, UPI, NEFT, RTGS, NACH, IMPS, ATM, KYC, GST, GSTIN, IFSC, SMS, IVR, API, URL, AI, ML, GPU, CPU, VPN, HTML, CSS, XML, OCR, QR, SDK, GB, MB, TB, CV, FY, MD, SBI, FD, PDF, IIT, IIM, NIT, HDFC, ICICI, NRI, JEE, NEET, OTT, GDP, FIR, TAN, TIN, DIN, COO, USB, LED, LCD, TV, DNA, CVV, UAN, EPF, NGO, CEO, CFO, CTO, AIIMS, UPSC, IAS, IPS, RTO, PPF, NPS, DTH, NOC, HSN
PIN, SIM, RAM, ROM, AIDS, SEBI, TRAI, CIBIL, RERA, AMFI. Govt expands to “Government.” Aadhaar is always kept as-is.
Devanagari-spelled Latin abbreviations are recognized the same way — e.g. केवाईसी expands to “के वाई सी” (KYC).
Telecom Generation
Scoped to 2G–5G so it’s never misread as a measurement (e.g. “five grams”).
Duration Phrases
Abbreviated units expand to their full word (
hrs → “hours”, min → “minutes”, sec → “seconds”). Numbers near a duration word are always read as a quantity, even if they’d otherwise look like an ID.
The singular
hr (e.g. “1 hr later”) is not covered — HR is reserved for “Human Resources.” Use the full word hour or the plural hrs for duration.Natural Pauses
Beyond punctuation already in your text, pause commas are automatically inserted for dense identifier patterns — PAN numbers, Aadhaar, OTPs near long digit runs, IFSC near a bank code, or international phone numbers with+91. This prevents multiple codes from running together.
Outside these specific patterns, extra commas are not added. Simpler sentences also have excess commas trimmed so the readout doesn’t sound choppy.