> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rumik.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# numbers, IDs & dates

> how to write text so silk speaks numbers, money, dates, and IDs correctly.

silk normalizes the `text` you send before it synthesizes, so numbers, money, dates,
and IDs come out right. `Rs 2,45,600` is read as "two lakh forty five thousand six
hundred rupees", and `09/03/2025` as "ninth March two thousand twenty five". you write
text the normal way.

there is one thing you decide: which digits should be read one at a time. wrap those in
double quotes. write everything else plainly.

normalization runs by default. set `"normalization": false` on a request to send your
text through untouched.

## the one rule

a run of digits can be read two ways, and only you know which you mean.

| you want it read as                                                                    | how to write it                | silk speaks                                          |
| -------------------------------------------------------------------------------------- | ------------------------------ | ---------------------------------------------------- |
| a digit-by-digit id (OTP, phone, account, card, PAN, GSTIN, vehicle, coupon, tracking) | wrap it in double quotes `"…"` | `"482093"` reads as *four eight two zero nine three* |
| a quantity (prices, counts, years, scores)                                             | write it plainly               | `3400` reads as *three thousand four hundred*        |

currency symbols, `%`, dates, and times are picked up on their own. write them the
natural way.

<Note>
  **why quotes?** a bare `8123456789` could be a phone number or a very large count.
  rather than guess, silk spells out what you put in quotes and reads everything else
  as a number. quoting is how you tell it which one you meant.
</Note>

here it is in one request:

```bash theme={null}
curl -X POST https://silk-api.rumik.ai/v1/tts \
  -H "Authorization: Bearer rk_live_•••••••••" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "muga",
    "text": "[neutral] Aapka OTP \"482093\" hai. Rs 2,45,600 debit hue 09/03/2025 ko."
  }' --output out.wav
# speaks: "…OTP four eight two zero nine three hai. two lakh forty five thousand six
#          hundred rupees debit hue ninth March two thousand twenty five ko."
```

## quick reference

| data             | write it as                     | spoken                                                               |
| ---------------- | ------------------------------- | -------------------------------------------------------------------- |
| amount (INR)     | `Rs 2,45,600`                   | two lakh forty five thousand six hundred rupees                      |
| amount + paise   | `Rs 89.75`                      | eighty nine rupees and seventy five paise                            |
| foreign currency | `$45` · `€60` · `£12` · `¥5000` | forty five dollars · sixty euros · twelve pounds · five thousand yen |
| percentage       | `25%` · `7.5%`                  | twenty five percent · seven point five percent                       |
| decimal          | `3.2`                           | three point two                                                      |
| plain number     | `3400`                          | three thousand four hundred                                          |
| date             | `09/03/2025`                    | ninth March two thousand twenty five                                 |
| time (24h)       | `18:45` · `07:15`               | six forty five PM · seven fifteen AM                                 |
| OTP / PIN        | `"482093"` · `"0071"`           | four eight two zero nine three · zero zero seven one                 |
| phone            | `"8123456789"`                  | eight one two three four five six seven eight nine                   |
| phone (+91)      | `plus "918123456789"`           | plus nine one eight one two three…                                   |
| account          | `"000723145589"`                | zero zero zero seven two three…                                      |
| card ending      | `ending "6042"`                 | ending six zero four two                                             |
| PAN              | `"FGHIJ5678K"`                  | F G H I J five six seven eight K                                     |
| GSTIN            | `"27FGHIJ5678K1Z3"`             | two seven F G H I J … one Z three                                    |
| vehicle          | `"MH12AB4567"`                  | M H one two A B four five six seven                                  |
| pincode          | `"411045"`                      | four one one zero four five                                          |
| coupon / order   | `"FEST50"` · `"TRK44120983"`    | F E S T five zero · T R K four four one two…                         |
| turn off         | `"normalization": false`        | (raw text, unchanged)                                                |

## numbers & money

write quantities plainly. silk handles indian grouping (lakh/crore), decimals, and
currency symbols on its own. no quotes.

| write               | spoken                                    |
| ------------------- | ----------------------------------------- |
| `3400`              | three thousand four hundred               |
| `2,45,600`          | two lakh forty five thousand six hundred  |
| `3.2`               | three point two                           |
| `Rs 750` or `Rs750` | seven hundred fifty rupees                |
| `Rs 89.75`          | eighty nine rupees and seventy five paise |
| `Rs 2,00,00,000`    | two crore rupees                          |
| `$18.40`            | eighteen dollars and forty cents          |

currency symbols: `₹`, `Rs`, `Rs.`, `INR`, `$`, `€`, `£`, `¥`, with or without a space
before the amount.

**do**

* write `Rs 2,45,600`. the indian comma grouping is read as lakh/crore.
* put the symbol before the amount (`$45`, not `45$`).

**don't**

* don't quote an amount. `"3400"` reads as *"three four zero zero"*, not the price.

## percentages, decimals & time

| write   | spoken                   |
| ------- | ------------------------ |
| `25%`   | twenty five percent      |
| `7.5%`  | seven point five percent |
| `18:45` | six forty five PM        |
| `07:15` | seven fifteen AM         |
| `06:05` | six oh five AM           |
| `22:30` | ten thirty PM            |

time is read 24-hour to 12-hour with AM/PM. use a period for decimals (`3.2`), never a
comma.

## dates

write `DD/MM/YYYY` or `DD-MM-YY` (india, day first). silk reads an ordinal day, then
the month name, then the year.

| write        | spoken                                  |
| ------------ | --------------------------------------- |
| `09/03/2025` | ninth March two thousand twenty five    |
| `01-12-24`   | first December two thousand twenty four |
| `7/6/2025`   | seventh June two thousand twenty five   |

use 4-digit years for anything historical or ambiguous. `24/7` and `3-2-1` are not read
as dates; they come out as their numbers.

## IDs, always quote

put any identifier in double quotes. digits turn into words, letters stay as letters,
separators (spaces, `-`, `/`) are dropped, and leading zeros are kept.

| type              | write                               | spoken                                                       |
| ----------------- | ----------------------------------- | ------------------------------------------------------------ |
| OTP / PIN         | `"482093"` · `"0071"`               | four eight two zero nine three · zero zero seven one         |
| phone             | `"8123456789"`                      | eight one two three four five six seven eight nine           |
| toll-free         | `"18002094321"`                     | one eight zero zero two zero nine four three two one         |
| account           | `"000723145589"`                    | zero zero zero seven two three one four five five eight nine |
| account (grouped) | `"5231 7789 4402 1176"`             | five two three one seven seven eight nine …                  |
| aadhaar           | `"5210 8834 9071"`                  | five two one zero eight eight three four nine zero seven one |
| card ending       | `ending "6042"`                     | ending six zero four two                                     |
| PAN               | `"FGHIJ5678K"`                      | F G H I J five six seven eight K                             |
| GSTIN             | `"27FGHIJ5678K1Z3"`                 | two seven F G H I J five six seven eight K one Z three       |
| vehicle           | `"MH12AB4567"` or `"MH-12-AB-4567"` | M H one two A B four five six seven                          |
| pincode           | `"411045"`                          | four one one zero four five                                  |
| coupon            | `"FEST50"`                          | F E S T five zero                                            |
| order / tracking  | `"TRK44120983"`                     | T R K four four one two zero nine eight three                |

### phone numbers with a country code

write the `+` as the word plus, and quote the digits:

```text theme={null}
Call plus "918123456789"   →   "…plus nine one eight one two three…"
```

writing `"+918123456789"` won't work; the `+` inside the quotes isn't spelled cleanly.

## per-model notes

the rules above are the same for both models. these are the only differences.

**muga.** your `[tone]` tag stays at the very start. normalization leaves tags and
`<events>` alone, so tagging and normalizing never interfere with each other.

```text theme={null}
[excited] Aapko 3400 reward points mile hain, coupon "FEST50" abhi use karo!
```

**mulberry.** there are no tone tags to place, the voice comes from `description`.
normalization only ever touches `text`, so your `description` reaches the model exactly
as you wrote it.

```text theme={null}
Aapka refund Rs 1,899 process ho gaya. Reference "RFN20915" hai.
```

## edge cases & gotchas

* digits stuck to letters are left alone. `B2B`, `COVID19`, `12kg` are never split.
* a quoted sentence isn't spelled out. `"see you at 400"` reads *"see you at four
  hundred"*, not letter by letter. only clean identifiers (every token has a digit) get
  spelled.
* leading zeros survive only inside quotes. `"0083"` reads *"zero zero eight three"*; an
  unquoted `0083` becomes *"eighty three"*.
* ranges: `4-6` reads *"four-six"*. write `4 to 6` if you want the word "to".
* running the same text through twice is safe; normalized text stays as it is.

## turning normalization off

set `"normalization": false` and silk reads your text as-is. nothing is spelled out or
converted.

here is the same input both ways:

```json theme={null}
// default (on): the quoted OTP is spelled out
{ "model": "muga", "text": "[neutral] Aapka OTP \"482093\" hai." }
// speaks: "…OTP four eight two zero nine three hai."

// off: the model gets the text untouched and reads it however it reads it
{ "model": "muga", "text": "[neutral] Aapka OTP \"482093\" hai.", "normalization": false }
// speaks: "…OTP <read by the model, not spelled out> hai."
```

reach for it when your text is already in the exact spoken form you want, or when you
need full control over how something is pronounced.
