ChindaTTS Text-to-Speech
Speaks Thai, or Thai mixed with English, in one of three voices and eight speaking styles, or in a voice cloned from a short clip, and returns a WAV or MP3 file at 48 kHz.
The service is in alpha and may be intermittently unavailable.
- Price1 ICper 400 characters
- Served2.1Mcalls
Input
- text
- สวัสดีค่ะ ยินดีต้อนรับค่ะ
- voice
- kaimook
- style
- friendly
- format
- mp3
OutputPOST /v3/store/audio/tts
HTTP/1.1 200 OK
Content-Type: audio/mpeg
X-Sample-Rate: 48000
<MP3 audio, mono, 48 kHz>Every field, under ResponseOther endpoints: /clone see Request
Request
JSON to speak in a voice, multipart/form-data to clone one. Each costs 1 IC per 400 characters of text.
| Endpoint | Returns |
|---|---|
POST /v3/store/audio/tts | A WAV or MP3 file, 48 kHz, in the voice and style asked for |
POST /v3/store/audio/tts/clone | A WAV or MP3 file, 48 kHz, in the voice of an uploaded clip |
The older paths /v3/store/audio/tts/tts and /v3/store/audio/tts/tts/clone reach the same two endpoints.
Headers
apikeystringrequiredBody
textstringrequired/clone), about 100 seconds of audio. Send longer text in parts, split at the end of a sentence.voicestringdefault:kaitomkaitom, kaimook or kaidang; see Voices and styles. Not on /clone, which speaks in the uploaded voice.stylestringdefault:neutralneutral, friendly, cheerful, calm, serious, sad, excited or empathetic. A style changes the tone, not the voice; any other value is refused with 400.formatstringdefault:wavwav or mp3.filefile/clone only, required there: 10 to 20 seconds of clean speech by one speaker, WAV or MP3, up to 20 MB. A shorter or noisy clip is refused with 400.consentboolean/clone only, required there: true to confirm the voice is yours or its speaker has agreed. Without it the request is refused with 400.denoisebooleandefault:false/clone only: removes background noise from the clip before it is used.Response
Headers
Content-Typestringaudio/wav, or audio/mpeg when format is mp3.X-Sample-Ratestring48000.Body
audiobinaryStatus codes
| Code | Meaning |
|---|---|
| 400 | Malformed JSON, text with nothing to speak, or an unknown style; on /clone, no consent, or a clip too short or too noisy |
| 413 | Text over 1,200 characters, or a clip over 20 MB |
| 429 | More requests than the key allows; wait, then retry |
| 503 | Busy; retry shortly |
Details
Voices and styles
| Voice | voice | Suits |
|---|---|---|
| Kaitom, the default | kaitom | A man's voice, for any use |
| Kaimook | kaimook | A woman's voice, bright and friendly: service, welcomes |
| Kaidang | kaidang | A man's voice: announcements, voice assistants |
style | Sounds | For |
|---|---|---|
neutral, the default | Plain, balanced | Information |
friendly | Warm, easy | Chat, support, welcomes |
cheerful | Bright, upbeat | Promotions, good news |
calm | Slow, soft, soothing | Guidance, reassurance |
serious | Firm, measured | Alerts, announcements, terms |
sad | Slow, soft, low | Condolences, apologies |
excited | Fast, energetic | Celebrations |
empathetic | Gentle, caring | Sensitive support |
Every voice speaks every style; all 24 pairs can be heard on the ChindaTTS page. The text is read as written, so write ค่ะ and คะ for Kaimook where Kaitom and Kaidang say ครับ.
Measured
Character error rate when the audio is transcribed back; lower is better.
| Text | Character error rate |
|---|---|
| Everyday Thai | 3.2% |
| Numbers, dates, currency | 1.4% |
| Thai and English mixed | 7.6% |
| Expressive styles | 3.9% |
A request of 100 characters takes about 1.5 seconds and one of 1,000 about 14.
Limits
- Thai and English; other scripts, emoji and symbols are dropped, not read aloud. Cloning is Thai only.
- 1,200 characters per request (1,000 on
/clone), about 100 seconds of audio. - 100 requests per second per API key.
- Punctuation sets the pauses. To fix how a brand or acronym is said, write it in Thai script:
ไอแอป, notiApp.
Data handling
Text and reference clips are processed in memory and not kept after the response. Consent and notice under PDPA and GDPR remain with you as the data controller.
Deprecated endpoints
The V1 and V2 endpoints still answer, at the same price, but are no longer maintained. Move to /v3/store/audio/tts.
| Endpoint | Was |
|---|---|
/v3/store/speech/text-to-speech/kaitom, also /thai-tts-kaitom2/tts | V2, Kaitom voice |
/v3/store/speech/text-to-speech/kaitom/v1, also /thai-tts-kaitom/tts | V1, Kaitom voice |
/v3/store/speech/text-to-speech/cee, also /thai-tts-cee/tts | V1, Cee voice |
To move, send JSON with text, and voice, style and format as needed, in place of form fields or a query string, and drop language: the language is detected. The answer is an audio file, ready to play. There is no Cee voice.
Changelog
| Version | Changes |
|---|---|
| ChindaTTS, Oct 2026 | Three voices (voice: kaitom, kaimook, kaidang), eight speaking styles (style) and a choice of WAV or MP3 (format). The answer is now an audio file, WAV at 48 kHz or MP3, in place of raw 24 kHz PCM: play or save it as it is, without adding a WAV header. Cloning takes style, format and denoise. |
| ChindaTTS | The V3 endpoints run on ChindaTTS, with the same request and response, up to 1,200 characters per request. The V1 and V2 endpoints are deprecated; see Deprecated endpoints. |
| V3 | /v3/store/audio/tts replaces /v3/store/speech/text-to-speech/kaitom, with a JSON body, the language detected instead of a language mode, up to 10,000 characters, 24 kHz output, text normalisation for numbers, dates, currency, times and percentages, and voice cloning. |