Skip to main content

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.
Timbre v2.5 is now the recommended TTS model. Migrate from Timbre v2.0 to continue receiving the latest improvements. Timbre v2.0 will be deprecated soon.
Passing numbers, IDs, dates, or currency as raw strings is now handled automatically. The guide below documents exactly what gets converted and how, so you can predict the output and catch edge cases.

Supported Languages

TN is active for all 10 supported languages. Select the language using the language 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:
auto cannot select a non-English profile for text that contains no Indic script. A message that’s entirely in Latin letters and digits (e.g. "42") always normalizes as English under auto, even when synthesized in a non-English voice. Pass the language hint explicitly (e.g. "kn") if you need native-language number reading for Latin-script input.

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
The words “point” (decimals) and “percent” stay in English when 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:
  1. Inline markup (pause or speed tags) is stripped from the spoken output.
  2. The target language profile is resolved from language, or auto-detected.
  3. Honorifics are expanded (Dr. → Doctor / डॉक्टर).
  4. Address and business abbreviations are expanded (Rd → Road, Ltd → Limited).
  5. 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).
  6. Common initialisms (OTP, GST, EMI, etc.) are spelled out letter-by-letter.
  7. 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, or Gate, 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, or PAN near 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.
Only English compresses repeated digits when spelling IDs (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 in DD/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

A bare with no unit letter (C/F) or compass direction (N/S/E/W) is not normalized. Always include the unit so temperatures and coordinates read correctly.

Roman Numerals

Roman numerals are only converted in two cases:
  1. The entire input is a roman numeral by itself (XIV → fourteen).
  2. A roman numeral immediately follows a trigger word: Chapter, Part, Section, Volume, Book, Class, Grade, King, Queen, Pope, Emperor, World War, Super Bowl, Article, or Appendix (e.g. “Chapter XIV” → “Chapter fourteenth”).
Ordinary words that happen to look like roman numerals (MIX, CIVIC, MD) are never converted in normal sentences.

Identifiers

Structured IDs are read with grouped digits/letters and natural pauses between groups.
Known identifier limitations:
  • 4-segment EPIC IDs (e.g. EPIC/WB/8821/4521) can misread — a fraction rule may claim the last two segments. Use the 3-segment form or a non-slash separator until fixed.
  • OTP/PIN digits may be read with “double/triple” compression for repeated digits (e.g. 448822 → “double four double eight double two”). Contact your Gnani representative if you need guaranteed uncompressed digit-by-digit OTP readout.
  • Very long reference numbers (14+ digits) are read as a raw digit string rather than being grouped. Add your own separators (spaces or hyphens) for a more natural readout.

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:
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
A smaller set is read as a word instead of being spelled out: 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.

Known Limitations