# How to describe a voice for AI voice design, with examples

What to put in a voice description, weak and stronger examples, how to describe a Thai or Mandarin voice, and how to change a voice in words once you hear it.

Published 2026-10-23. Paxa Labs.

A voice design tool turns a sentence about a voice into the voice. The sentence is the whole brief. What it says and what it leaves out decide what you hear back.

The examples here were written for [Voice design](https://paxalabs.com/app/voice-design) in the Paxa console, where each design or change costs 5 credits. Advice from other vendors links their own pages, as we read them in October 2026.

## What to put in a description

Most descriptions that work cover four things: who is speaking, how the voice sounds, how the person speaks, and where the words will be heard. Name a language too when the voice should speak one other than the language you write in.

| Part | Words that carry it |
| --- | --- |
| Who is speaking | Age, gender, and role, such as a pharmacist in her thirties, a teenage gamer, or a retired sea captain |
| How the voice sounds | Pitch and texture, such as low, bright, husky, breathy, clear, or gravelly |
| How they speak | Pace, energy, and manner, such as slow and unhurried, quick and excited, or calm enough to settle a nervous passenger |
| Where it will be heard | A late night audiobook, a game lobby, a store announcement, a bedtime story |
| Language | English, Thai, or Mandarin, named outright |

One or two sentences is enough. [Google's voice design guide](https://ai.google.dev/gemini-api/docs/voice-design) asks for one to two clear sentences, and [the ElevenLabs guide](https://elevenlabs.io/docs/creative-platform/voices/voice-design) opens its template on the language before anything else. Paxa takes up to 1,000 characters, but a short description that names the parts above does more than a long one that circles them.

## Weak and stronger descriptions

A weak description names a category. A stronger one names a person in a moment, and the voice follows the person.

| Weak | Stronger |
| --- | --- |
| A female voice | A woman in her thirties who hosts a cooking show, warm and lively, and laughs easily. |
| A scary voice | A villain who speaks slowly and quietly, almost a whisper, and sounds pleased when the listener is afraid. |
| A news voice | An evening news anchor in her forties, clear, formal, and steady, who reads each headline at an even pace. |
| An excited voice | A football commentator in his thirties, fast and loud, who gets more excited with every attack. |

[The voice design page](https://paxalabs.com/voice-design) plays descriptions like these beside the voices they made, each with the line the voice spoke first.

## Describing a Thai or Mandarin voice

Name the language the voice should speak. A description can be written in English, Thai, or Chinese. The voice speaks the language the description names. An English description of a Bangkok tour guide who speaks Thai gets a Thai voice. A description that names no language gets a voice in the language it is written in.

A setting then does the work a list of traits would. A vendor at a Bangkok night market, a kindergarten teacher reading to her class, and a morning market briefing each tell the voice how to speak in a few words. These three were written in Thai and Chinese:

- แม่ค้าส้มตำหน้าตลาด วัยสี่สิบกว่า เสียงดัง อารมณ์ดี ทักลูกค้าเป็นกันเอง (a som tam vendor in her forties, loud and cheerful, greeting customers like friends)
- ผู้ชายวัยสามสิบ อ่านสรุปข่าวตลาดหุ้นตอนเช้าเป็นภาษาอังกฤษ ชัด กระชับ ฟังสบาย (a man in his thirties reading the morning market summary in English, clear, brief, and easy to hear)
- 幼儿园女老师，用普通话给孩子们读绘本，温柔又有耐心。 (a kindergarten teacher reading a picture book in Mandarin, gentle and patient)

## What to leave out

- Sound effects and recording conditions. [ElevenLabs](https://elevenlabs.io/docs/creative-platform/voices/voice-design) lists words such as reverb and phone among its pitfalls. Add effects in your editor after the voice is made.
- A real person's name. [OpenAI's custom voice guide](https://developers.openai.com/api/docs/guides/custom-voices) keeps named people out of voice prompts. In Paxa, a description that names someone gets an original voice under a name the tool makes up. Describe the qualities you want instead.
- Traits that pull against each other, such as calm and frantic at once. Pick the one the script needs most.
- Instructions about what the voice should say. [OpenAI's guide](https://developers.openai.com/api/docs/guides/custom-voices) keeps behavior rules out of the voice prompt. The script decides the words; the description decides the voice.

## Change a voice in words

The first voice is a draft. Listen to its line, then type one change, such as warmer, a little older, or slower, and hear the next version. [OpenAI's guide](https://developers.openai.com/api/docs/guides/custom-voices) also recommends refining one quality at a time against the same passage, which keeps it clear what each change did.

In Paxa, each change keeps the rest of the voice as it was. Save the version you want, and it joins the Speech tool under Your voices with an id for the API. Speech in a saved voice costs 1.25 times the rate of a catalog voice.

## Common questions

### How long should a voice description be?

One or two sentences that name who is speaking and how they sound. Paxa accepts up to 1,000 characters.

### Can I describe a voice in Thai?

Yes. Write the description in English, Thai, or Chinese. The voice speaks the language the description names, or the one it is written in when it names none.

### What does a design cost?

5 credits for each design or change, its first line included. A new account's free credits cover several, with no card.

### Can I describe a voice like a celebrity's?

Describe the qualities you want to hear. A description that names a real person gets an original voice built from what the name suggests, under a made-up name.

# Voice design vs voice cloning for a voice of your own

Voice cloning copies a person from recordings; voice design makes a voice from a written description. What each needs, when each fits, consent, and what a design costs.

Published 2026-10-23. Paxa Labs.

A voice that is not in any catalog can come from two places. Voice cloning copies a real person's voice from recordings of them speaking. Voice design makes a voice from a written description, with no recording at all.

Every vendor fact below links that vendor's own page, as we read it in October 2026.

## The difference at a glance

|  | Voice cloning | Voice design |
| --- | --- | --- |
| Starts from | Recordings of one person speaking | A sentence or two about the voice |
| Needs | Clean audio and the speaker's consent | Nothing to record |
| Gives you | A voice that sounds like that person | A voice that fits the description |
| To change it | Record again | Describe the change |

## When cloning fits

Clone when the voice has to be one particular person's: your own voice on your own channel, or a narrator who has agreed to lend theirs. The clone is only as good as the recording behind it.

[Fish Audio's cloning docs](https://docs.fish.audio/features/voice-cloning) ask for at least 10 seconds per clip and say a minute or two of clear, single-speaker speech improves fidelity. [ElevenLabs](https://elevenlabs.io/docs/overview/capabilities/voices) describes Instant Voice Cloning from samples under two minutes, and Professional Voice Cloning trained on extended audio. [Inworld's comparison guide](https://inworld.ai/resources/voice-design-vs-voice-cloning) puts its instant method at five to 15 seconds of authorized audio and its professional method, in preview, at ten minutes or more.

## When design fits

Design when the voice does not need to sound like anyone in particular: a game character, a narrator for a faceless channel, a brand voice, a bedtime storyteller. [Inworld's guide](https://inworld.ai/resources/voice-design-vs-voice-cloning) makes design the default when resemblance to a person is unnecessary.

Design also gives you a voice of your own without recording one. In [Paxa's Voice design tool](https://paxalabs.com/app/voice-design), you describe the voice in English, Thai, or Chinese, hear its first line, and change it in words until it fits. A saved voice gets an id for the API, and an account keeps 1 on the free plan and up to 50 on the largest. [How to describe a voice](https://paxalabs.com/guides/how-to-describe-a-voice-for-ai) covers what to write.

## Consent and impersonation

A clone copies a real person. It starts with their permission. [Inworld's guide](https://inworld.ai/resources/voice-design-vs-voice-cloning) says consent should be explicit, documented, and scoped to languages, channels, use cases, duration, and storage.

Design needs no recording, but a description can still aim at a person. [OpenAI](https://developers.openai.com/api/docs/guides/custom-voices) keeps named people out of voice prompts, and [Fish Audio](https://fish.audio/blog/voice-design/) asks for a no-impersonation confirmation before each designed voice is saved. In Paxa, a description that names a real person gets an original voice under an invented name, and impersonating anyone is against [the rules every account accepts](https://paxalabs.com/responsible-ai).

## What a design costs

Vendors charge for a design in different ways. [ElevenLabs](https://elevenlabs.io/docs/creative-platform/voices/voice-design) charges the preview text's characters once per generation, though three previews come back. [Fish Audio's API](https://docs.fish.audio/developer-guide/models-pricing/pricing-and-rate-limits) charges $0.01 per successful request, whatever the number of candidates. [MiniMax](https://platform.minimax.io/docs/guides/pricing) charges $3 per designed voice, on its first use for speech.

Paxa charges 5 credits for each design or change, its first line included. Speech in a saved voice costs 1.25 times the rate of a catalog voice, and [the pricing page](https://paxalabs.com/pricing) lists that rate.

## Common questions

### Is voice design the same as voice cloning?

No. Cloning copies a real person's voice from recordings of them. Design makes a voice from a written description and needs no recording.

### Can I make an AI voice of my own without recording?

Yes, with voice design. Describe the voice you want, refine it in words, and save it. It sounds the way your description says.

### Does Paxa offer voice cloning?

No. Paxa accepts no reference audio. Voices come from the catalog or are designed from a description.

### Can I use a designed voice commercially?

The free credits on a new Paxa account are for personal use and evaluation. Buy any plan or credit pack, and the account's audio is yours to use commercially, including audio made before the purchase. [The Terms](https://paxalabs.com/terms#content-and-output) state the rule.

# Best AI voice design tools for Thai voices, saved voices, and voice agents

Which AI voice design tool fits a voice that speaks Thai, a voice saved and called by id, several takes at once, or a realtime voice agent, from each tool's own pages.

Published 2026-10-23. Paxa Labs.

A voice design tool makes a voice from a written description, with no recording. The tools differ in what languages a designed voice speaks, whether the voice is kept, how many takes come back, and where the voice can be used afterward.

Every tool fact below links that tool's own page, as we read it in October 2026. No tool is scored or ranked, and a tool appears under a job only where its own page states the fit.

## For a voice that speaks Thai

[Paxa's Voice design](https://paxalabs.com/voice-design) takes a description in English, Thai, or Chinese, and each voice speaks Thai, English, or Mandarin, the one its description names. [The guide to describing a voice](https://paxalabs.com/guides/how-to-describe-a-voice-for-ai) has Thai and Chinese examples.

[ElevenLabs' models page](https://elevenlabs.io/docs/overview/models) lists its eleven_ttv_v3 design model at more than 70 languages, linked to the Eleven v3 language list, which includes Thai. [Google's speech generation page](https://ai.google.dev/gemini-api/docs/speech-generation) lists Thai for Gemini 3.8 Flash TTS, a model its [voice design page](https://ai.google.dev/gemini-api/docs/voice-design) supports. [Inworld](https://docs.inworld.ai/tts/capabilities/multilingual) places Thai in its second language tier and recommends designing a voice in the target language, while [its voice design page](https://inworld.ai/voice-design) asks for descriptions written in English.

## For a voice you save and call by id

A saved Paxa voice gets an id that works in [the Speech tool](https://paxalabs.com/app/speech) and the API on Paxa TTS Flash v2. An account keeps 1 on the free plan and up to 50 on the largest, and [the designed voices docs](https://paxalabs.com/docs/designed-voices) cover the id.

[ElevenLabs](https://elevenlabs.io/docs/creative-platform/voices/voice-design) saves a design into a voice slot, and [its slot table](https://elevenlabs.io/docs/help-center/account/general/how-many-voice-slots-do-i-get-per-tier-and-how-can-i-increase-it) runs from 3 on the free plan through 10, 30, and 160 on Starter, Creator, and Pro. [Inworld](https://docs.inworld.ai/tts/voice-design) gives a published voice a permanent voiceId, and [its pricing](https://inworld.ai/pricing) lists 100 custom voice slots on demand. [Gemini](https://ai.google.dev/gemini-api/docs/voice-design) stores up to 200 voices per project, each for one year.

Two tools keep a design for less time. [MiniMax](https://platform.minimax.io/docs/api-reference/api-overview) deletes a designed voice that no speech request has used for seven days. [Fish Audio's design API](https://docs.fish.audio/features/voice-design) creates no saved voice and points to cloning for a voice that persists.

## For several takes from one description

[ElevenLabs](https://elevenlabs.io/docs/creative-platform/voices/voice-design) returns three options per generation, and [Inworld](https://docs.inworld.ai/tts/voice-design) up to three previews. [Fish Audio's API](https://docs.fish.audio/features/voice-design) returns one to four candidates, two by default, and [Hume's platform](https://dev.hume.ai/docs/voice/voice-design) generates three.

Paxa returns one voice per description and changes it in words: type warmer or slower, and hear the next version. [ElevenLabs Remix](https://elevenlabs.io/docs/overview/capabilities/voice-remixing) also changes a voice from a description of the change, as a separate feature.

## For a realtime voice agent

A saved Paxa voice speaks on [a live connection](https://paxalabs.com/docs/live-streaming), which takes text as it arrives and streams audio back. [OpenAI's prompt voices](https://developers.openai.com/api/docs/guides/custom-voices) work only with GPT-Live, up to 100 per organization. [Hume](https://dev.hume.ai/docs/voice/voice-design) makes a saved voice usable in its EVI voice interface as well as its TTS.

## For knowing what a design costs

Paxa charges 5 credits for each design or change, its first line included, and speech in a saved voice costs 1.25 times the rate of a catalog voice. [Inworld](https://inworld.ai/voice-design) bills designed voices at the same rate as its library voices. [Alibaba Cloud](https://www.alibabacloud.com/help/en/model-studio/qwen-tts-voice-design) makes creating a voice free and bills speech at the target model's rate, in the China (Beijing) region it lists.

ElevenLabs, Fish Audio, and MiniMax each price a design differently, per generation, per request, or per voice. [The design and cloning guide](https://paxalabs.com/guides/voice-design-vs-voice-cloning#cost) sets out all three.

## Before you build on one

[ElevenLabs' help center](https://elevenlabs.io/docs/help-center/product/voices/voice-design/what-is-voice-design) says its voice design is still experimental. [Hume's voice design](https://dev.hume.ai/docs/voice/voice-design) requires its Octave 1 model, which [its FAQ](https://dev.hume.ai/docs/text-to-speech-tts/faq) says supports English and Spanish only. A designed Paxa voice works with Paxa TTS Flash v2 and no other model.

## Common questions

### What is an AI voice design tool?

A tool that makes a voice from a written description of it, such as a calm narrator in her fifties, with no recording of a real person.

### Which voice design tools speak Thai?

Paxa designs voices that speak Thai, English, or Mandarin. ElevenLabs links its eleven_ttv_v3 design model to a language list that includes Thai, Google lists Thai for Gemini 3.8 Flash TTS, and Inworld places Thai in its second language tier.

### Can I use a designed voice through an API?

Yes, at Paxa, ElevenLabs, Inworld, and Gemini once the voice is saved. A saved Paxa voice works in the console and the API, on single requests and live connections, and the Paxa API also designs, saves, renames, and deletes voices.

### Is voice design free?

It depends on the tool. Alibaba Cloud makes voice creation free. A Paxa design costs 5 credits, and a new account's free credits cover several, with no card.

# How to make an AI voice, from script to download

Pick a voice, write the script, add a direction in square brackets, then generate and download, and see how Google AI Studio, Canva, and CapCut do it.

Published 2026-10-18, updated 2026-10-23. Paxa Labs.

An AI voice reads the script you write, in a voice you choose, and gives you an audio file. It needs no microphone or recording session. People use one for a video, a lesson, a shop announcement, or a message to family.

In Paxa, you make it in [the Speech tool](https://paxalabs.com/app/speech) of the console. Every Paxa TTS Flash v2 voice speaks English, Thai, and Mandarin, and a new account starts with 100 free credits.

## Make an AI voice, step by step

1. Pick a voice: Sign in and open [the Speech tool](https://paxalabs.com/app/speech). It opens on Paxa TTS Flash v2, the model whose voices read directions. Open the voice picker and play the samples, which cost nothing. If none fits, design one first.
2. Write the text: Type or paste the script, up to 5,000 characters in one run. Write numbers and names the way they should be said. The cost in credits shows under the text before you generate.
3. Add a direction: Write how the words should sound in square brackets, such as `[warm, unhurried]` or `[whispering]`. A direction holds until the next one, and the brackets are not spoken.
4. Generate and listen: Under Format, choose MP3 for most uses or WAV for a video edit. Then select Generate speech and play the clip.
5. Fix and download: If a name or number comes back wrong, respell it in the text and generate again. When the take sounds right, select the Download icon on the player.

## Write a direction

On Paxa TTS Flash v2, a direction is any words in square brackets, in English, Thai, or Chinese. It can be one word, such as `[sad]`, or a description of the whole read, such as `[product advertisement, punchy and upbeat]`.

Text before the first direction keeps the voice's own delivery. A direction holds from where it stands until the next one, and `[neutral]` returns to the voice's own delivery.

two directions in one script:

```
[warm, unhurried] Welcome back to the kitchen.
[excited] Today we make green curry paste from scratch.
```

[The narrator voice page](https://paxalabs.com/narrator-voice) plays directions written into real narration, and [the voices page](https://paxalabs.com/voices) plays every voice.

## Design a voice when none fits

When no catalog voice suits the script, open [Voice design](https://paxalabs.com/app/voice-design) in the console. Write who is speaking and how they sound, such as "a woman in her fifties who reads ghost stories late at night, low and a little husky". A new voice comes back with a name and a line in character.

Type what to change, such as warmer or a little older, and the next version plays. Save the version you want, and it appears under Your voices in the Speech tool's voice picker, ready for the steps above. Each design or change costs 5 credits, and speech in a saved voice runs at 1.25 times the rate of a catalog voice.

[The voice design page](https://paxalabs.com/voice-design) plays descriptions beside the voices they made.

## Other places to make an AI voice

Google AI Studio, Canva, and CapCut also come up when people look for a way to make an AI voice. Every fact about them below links the vendor's own page, as we read it in October 2026.

### Google AI Studio and Gemini TTS

[Google's speech generation guide](https://ai.google.dev/gemini-api/docs/speech-generation) says the Gemini API turns text into audio with one speaker or two. It suggests testing the Gemini TTS models in Google AI Studio before you start building. The guide lists 30 prebuilt voices. Its table of supported languages checks Thai for Gemini 3.8 Flash TTS and leaves it blank for Gemini 3.8 Flash-Lite TTS. The guide sets delivery, such as emotion, pacing, and volume, in a `style` field kept apart from the words to be spoken.

### Canva

[Canva's help center](https://www.canva.com/help/canva-ai-voice/) places AI Voice inside a design. In the side panel, select Elements, scroll to Audio, and select Generate AI Voice, or open the Apps tab and select AI Voice. Type the script, choose a language and a voice style under Select Voice, and select Generate AI voice. The voice track lands on the design's audio timeline.

### CapCut

[CapCut's help center](https://www.capcut.com/help/text-to-speech-feature) turns a text layer in a video project into speech. In the mobile app, tap Text and add your words, then tap the text layer on the timeline. Select Text-to-Speech from the bottom menu, choose a voice style, and tap Generate. The same page gives the steps for the desktop app and the web editor.

## What the free credits allow

A new account gets 100 free credits, granted once. They voice about 11 minutes of English narration in any Paxa TTS Flash v2 voice.

Audio made on the free credits alone is for personal use and evaluation. Buy any plan or credit pack, and all of the account's audio is yours to use commercially, including audio made before the purchase. [The Terms](https://paxalabs.com/terms#content-and-output) state the rule, and [the pricing page](https://paxalabs.com/pricing) lists the plans and packs.

Each other tool sets its own license for the audio it makes. Read it before you publish.

## Common questions

### Can I make an AI voice for free?

Yes, for personal use and evaluation, with a new account's 100 free credits. [The free text to speech page](https://paxalabs.com/tts) also reads a line in 9 voices with no account.

### How much text does one run read?

Up to 5,000 characters. Split a longer script at a paragraph, and join the clips in an audio editor.

### Can I make an AI voice of my own voice?

Paxa Labs clones no voice from a recording. Pick a catalog voice in the voice picker, or [design a new voice](https://paxalabs.com/voice-design) from a written description and save it to your account.

### Do directions cost extra?

Directions are text. Every character in the brackets counts toward the cost, at the same rate as the words.

# How to have AI read a novel aloud

Paste a chapter, choose a narrator, give each character a voice or a direction, and listen, with what the free credits cover and when a book needs its rights holder's permission.

Published 2026-10-18. Paxa Labs.

Some novels are easier to finish by ear. A web serial updates while you commute, and a long series can tire your eyes by the third book. An AI voice reads the chapter you paste, in a voice you choose, and you listen wherever you like.

In Paxa, that happens in [the Speech tool](https://paxalabs.com/app/speech) of the console. Every Paxa TTS Flash v2 voice reads English, Thai, and Mandarin in the same voice.

## Read a chapter aloud, step by step

1. Paste the chapter: Copy the chapter as text and paste it into [the Speech tool](https://paxalabs.com/app/speech). One run reads up to 5,000 characters, about 5 minutes of English narration. Paste a longer chapter in parts, breaking at a scene or a paragraph.
2. Choose a narrator: Open the voice picker and play the samples, which cost nothing. Pick a voice you could listen to for an hour.
3. Mark the dialogue: Before a line that needs it, write a direction in square brackets, such as `[whispering]`. Write `[neutral]` after the line to return to the narrator's own delivery.
4. Generate and listen: Set the Speed slider first for a slower or faster read, at the same price. Then select Generate speech and play the part.
5. Keep the parts in order: Select the Download icon on each part's player, and number the files in reading order.

## Choose a narrator voice

A narrator stays with the listener for the whole book. The catalog casts these voices for narration, audiobooks, long reads, and audio novels.

| Voice | Role | Cast for |
| --- | --- | --- |
| [Khanom Krok](https://paxalabs.com/voices/khanomkrok) | Lead voice | Calm, unhurried elder voice and the roster's male lead: documentary, heritage storytelling, and narration. |
| [Foi Thong](https://paxalabs.com/voices/foithong) | Narrator | Captivating narrator for long reads and explainers. |
| [Espresso](https://paxalabs.com/voices/espresso) | Long-form reader | Deep, dark, unhurried English reader for long fiction, documentaries, and trailers. |
| [Tao Huay](https://paxalabs.com/voices/taohuay) | Drama lead | Tender, melancholy Mandarin voice for drama recaps, audio novels, and companion speech. |
| [Oolong](https://paxalabs.com/voices/oolong) | Audio fiction | Low, rich Mandarin narrator for audio novels, brand reads, and late-night stories. |

Hear a few pages in each before you settle. [The narrator voice page](https://paxalabs.com/narrator-voice) plays narrators reading in English, Thai, and Mandarin, and [the voices page](https://paxalabs.com/voices) plays every voice.

## Give characters a voice or a direction

Dialogue is where one even read loses a listener. A direction is the quicker fix. Keep one narrator, and write how a line should sound in square brackets before it. The direction holds until the next one, and `[neutral]` returns to the narrator's own delivery.

a direction on the dialogue, then back to the narrator:

```
[warm, unhurried] The ferry left the pier at dusk, and Mali watched the temple lights come on one by one.
[whispering] "Don't look back," her brother said. "They're still on the pier."
[neutral] She looked anyway.
```

A voice of their own takes more steps. Each run speaks in one voice. Generate each character's lines in that character's voice, then join the clips in order in an audio editor.

[The audio novels page](https://paxalabs.com/use-cases/audio-novels) casts a catalog voice for each character of a serial. [The bedtime stories page](https://paxalabs.com/bedtime-stories) plays a story in which a grandfather narrates and two animals talk.

## Listen on free credits

A new account gets 100 free credits, granted once, enough for about 11 minutes of English narration. On free credits alone, [the Terms](https://paxalabs.com/terms#content-and-output) license the audio for personal, non-commercial use and for evaluating the service.

A long book takes more credits than the free grant. [The pricing page](https://paxalabs.com/pricing) lists the plans and credit packs.

## Publishing someone else's book as audio

To publish an audio version of a book someone else wrote, you need permission from whoever holds its rights, usually the author or the publisher.

Once you buy any plan or credit pack, the Terms assign you all of the account's audio for any use, commercial included, while you comply with them. That includes audio made before the purchase. A purchase covers the audio. Permission for the book's words still comes from its rights holder. [The Terms](https://paxalabs.com/terms#content-and-output) state the purchase rule.

## Common questions

### Can AI read a whole novel aloud?

Yes, chapter by chapter. One run reads up to 5,000 characters, about 5 minutes of English narration. A long chapter goes in as several runs.

### Can I listen on the free credits?

Yes, the free credits pay for runs like any other credits. On free credits alone, [the Terms](https://paxalabs.com/terms#content-and-output) license the audio for personal, non-commercial use and for evaluating the service.

### Can I post the audio of a novel I like?

Only with permission from whoever holds the book's rights, usually the author or the publisher. Once you buy any plan or credit pack, the Terms assign you the audio for any use, commercial included, while you comply with them. Permission for the words still comes from their rights holder.

### Can it read a novel in Thai or Mandarin?

Yes. Every Paxa TTS Flash v2 voice reads English, Thai, and Mandarin in the same voice.

# Best Thai text to speech for apps, videos, and phone lines

Which Thai text to speech service fits an app, a narrated video, a phone line, a live voice agent, or a cloned brand voice, from each vendor's own documentation.

Published 2026-10-17, updated 2026-10-26. Paxa Labs.

Teams buying Thai text to speech usually have one job in mind. A banking app that reads balances aloud needs different things from a hotline menu played over a phone line. The job decides which vendors stay on the list, because each one documents different voices, output formats, and connections.

Every vendor fact below links that vendor's own documentation, as our comparison pages verified it in October 2026. No vendor is scored or ranked. Published rates for each one are on [the text to speech API comparison](https://paxalabs.com/compare/text-to-speech-apis), re-checked every month.

## Check that Thai is on the list

Several widely used speech APIs have no Thai voice. [Amazon Polly's language table](https://docs.aws.amazon.com/polly/latest/dg/supported-languages.html) has no Thai code. [Deepgram's Aura voices](https://developers.deepgram.com/docs/tts-models) cover seven languages, and Thai is not one of them. [SpeechifyAI](https://docs.speechify.ai/build/guides/text-to-speech/language-support) lists six languages for simba-3.0 and English alone for simba-3.2, with Thai on neither list.

Others list Thai among dozens of languages. [ElevenLabs](https://elevenlabs.io/docs/overview/models) names it among the 90+ languages of its newest speech models, [Cartesia](https://docs.cartesia.ai/build-with-cartesia/tts-models/latest) among the 44 of Sonic 3.6, and [MiniMax](https://platform.minimax.io/docs/api-reference/speech-t2a-http) among the 40 values of its language setting.

A language list says a vendor accepts Thai text. How a voice reads an English brand name inside a Thai sentence, Thai digits, or an abbreviation such as พ.ศ. is something to hear on your own script. [How to judge a Thai AI voice](https://paxalabs.com/guides/judging-a-thai-ai-voice) lists what to listen for, and [the script guide](https://paxalabs.com/guides/writing-for-thai-text-to-speech) covers numbers and English words in a Thai line.

## For an app or a website that speaks Thai

Every voice on Paxa TTS Flash v2 speaks Thai, English, and Mandarin, including the English words inside a Thai sentence. [The voices page](https://paxalabs.com/voices) plays all 50, and each voice keeps its slug for as long as it serves. An app already written for the OpenAI SDK can call [the compatible endpoint](https://paxalabs.com/docs/openai-compatibility) by changing the base URL and key, and its OpenAI model and voice names keep working.

[Botnoi Voice](https://voice.botnoi.ai/) lists more than 20 languages, Thai, English, and Chinese among them, and links a page of named speakers for each. [iApp's ChindaTTS documentation](https://iapp.co.th/docs/speech/text-to-speech/text-to-speech-v3) describes reading Thai, or Thai with English inside, on its standard voice, and limits that voice to Thai and English.

On the cloud platforms, [Google's Gemini-TTS](https://docs.cloud.google.com/text-to-speech/docs/gemini-tts) lists Thai (th-TH) as generally available. [Microsoft's voice table](https://learn.microsoft.com/en-us/azure/ai-services/speech-service/language-support?tabs=tts) lists three standard th-TH voices for Azure AI Speech, plus two in its Neural HD tiers marked public preview.

An app plays the same short lines many times. Test the strings your screens really show, such as a balance, a date, and a product name. Then check that the output format plays in your app with no conversion step.

## For narrated videos, courses, and captions

Narration needs timing as much as a voice, because captions have to land on the words. Paxa TTS Flash v2 returns [word, sentence, or utterance timestamps](https://paxalabs.com/docs/timestamps) with the audio on the same request. Word spans split Thai text that has no spaces, and [the subtitles page](https://paxalabs.com/subtitles) shows the result on a caption line.

[Narakeet's API](https://www.narakeet.com/docs/automating/text-to-speech-api/) can return SRT and VTT subtitle files with the audio, synchronized on paragraph boundaries, and Narakeet keeps [a separate voice list for Thai](https://www.narakeet.com/languages/). [Microsoft's Speech SDK](https://learn.microsoft.com/en-us/azure/ai-services/speech-service/how-to-speech-synthesis) raises a WordBoundary event at each spoken word, punctuation mark, and sentence, with its time offset in the audio. [Cartesia's API](https://docs.cartesia.ai/api-reference/tts/tts) documents an `add_timestamps` parameter.

A course often runs long. One Paxa TTS Flash v2 request reads up to 5,000 characters, and a chapter goes out as several requests whose audio you join. Narakeet takes scripts longer than 1 KB through its polling API.

Some teams build clips by hand in a web studio and call no API at all. [Botnoi Voice](https://voice.botnoi.ai/) offers a web studio beside its API, and [UVoice AI](https://uvoice.app/th/) offers a clip studio beside its own. [The creators page](https://paxalabs.com/use-cases/creators) and [the short-video voiceover guide](https://paxalabs.com/guides/ai-voiceover-for-tiktok-reels-and-shorts) cover a channel's own workflow.

## For phone lines and IVR menus

Telephony carries audio as 8 kHz μ-law or A-law. [ElevenLabs' create speech reference](https://elevenlabs.io/docs/api-reference/text-to-speech/convert) lists `ulaw_8000` and `alaw_8000` among its output formats and notes that μ-law is common for Twilio audio inputs. [Murf](https://murf.ai/api/docs/text-to-speech/overview) lists ALAW and ULAW outputs with 8000 Hz among its sample rates, and [its voice library](https://murf.ai/api/docs/voices-styles/voice-library) has a Thai section.

Paxa TTS Flash v2 returns MP3, Opus, WAV, or raw PCM, with PCM and WAV at 8 to 48 kHz through the sample_rate field. For phone lines it returns G.711 μ-law and A-law at 8 kHz directly. The audio goes into a telephony stack with no resampling step.

An IVR menu changes rarely. Generate each prompt once, store the file, and play it from storage on every call. A call that answers the caller in real time needs a live connection. [The call centers page](https://paxalabs.com/use-cases/call-centers) and [the announcements page](https://paxalabs.com/use-cases/announcements) cover both.

## For a live voice agent

A voice agent speaks an LLM's reply while the model is still writing it, and stops when the caller talks over it. The Paxa [live WebSocket](https://paxalabs.com/docs/live-streaming) takes text fragments as they arrive and synthesizes at natural boundaries. A cancel frame stops the reply in progress and keeps the connection open.

[Botnoi Voice's API reference](https://voice.botnoi.ai/developer/api) documents a realtime websocket that returns audio in base64 chunks. [Cartesia's API](https://docs.cartesia.ai/api-reference/tts/tts) has a websocket endpoint for realtime synthesis. [Fish Audio's streaming guide](https://docs.fish.audio/features/realtime-streaming) describes a WebSocket that buffers text until it has enough context, with a flush event that forces generation. Its [S2 Pro page](https://fish.audio/s2/) names Thai among the added languages.

Thai text carries no sentence-final punctuation, and a streaming voice that waits for a full stop waits for the whole reply. [The sentence breaks guide](https://paxalabs.com/guides/thai-sentence-breaks-for-streaming-speech) shows where to cut a Thai reply. [The realtime speech page](https://paxalabs.com/realtime-tts) and [the voice agents page](https://paxalabs.com/use-cases/voice-agents) cover the Paxa side.

## For a voice of your own

[iApp's ChindaTTS](https://iapp.co.th/docs/speech/text-to-speech/text-to-speech-v3) clones a voice from a 10 to 20 second Thai clip, and its cloned voices read Thai only. [ElevenLabs](https://elevenlabs.io/docs/overview/capabilities/voices) describes cloned voices beside its Voice Library and voices designed from a text prompt. [Fish Audio's cloning guide](https://docs.fish.audio/features/voice-cloning) asks for clips of at least 10 seconds each, saved as a voice model or sent with every request.

[MiniMax's Speech-02 announcement](https://www.minimax.io/news/speech-02-series) describes voice cloning and names Thai among its added languages. [UVoice AI](https://uvoice.app/th/) pairs a clip studio that clones voices with its API.

Clone a voice only with the speaker's written consent, and read each vendor's terms on commercial use of a clone before you ship. Paxa Labs offers no voice cloning. Its catalog voices keep their slugs while they serve, and a new voice comes from [voice design](https://paxalabs.com/voice-design), which builds one from a written description with no recording.

## For Thai beside English and Mandarin

Every Paxa TTS Flash v2 voice reads English and Simplified Chinese in the same voice it uses for Thai. Paxa TTS Flash adds 4 voices in [Isan, Northern, and Southern Thai](https://paxalabs.com/voices/accents), for a campaign that speaks to one region.

[MiniMax's API](https://platform.minimax.io/docs/api-reference/speech-t2a-http) sets Thai, English, Chinese, and Cantonese as separate language values. [Narakeet](https://www.narakeet.com/languages/) keeps separate voice lists for Thai, Mandarin Chinese, Taiwanese Mandarin, and Cantonese. [Gemini-TTS](https://docs.cloud.google.com/text-to-speech/docs/gemini-tts) lists Thai as generally available and Mandarin (cmn-CN) in Preview.

Decide first whether the brand keeps one voice across every language or one voice per language. A vendor whose voices each speak a single language can offer only the second. [The English voices page](https://paxalabs.com/english-voices) and [the Chinese voices page](https://paxalabs.com/chinese-voices) play each set.

## Jobs and vendors at a glance

| Job | Vendors whose documentation states the fit |
| --- | --- |
| Apps and websites in Thai | Azure AI Speech, Botnoi Voice, Google Gemini-TTS, iApp, Paxa TTS Flash v2 |
| Narration with captions | Azure AI Speech, Cartesia, Narakeet, Paxa TTS Flash v2 |
| Phone lines and IVR | ElevenLabs, Murf |
| Live voice agents | Botnoi Voice, Cartesia, Fish Audio, Paxa TTS Flash v2 |
| A cloned voice | ElevenLabs, Fish Audio, iApp, MiniMax, UVoice AI |
| Thai, English, and Mandarin | Google Gemini-TTS, MiniMax, Narakeet, Paxa TTS Flash v2 |

## Test on your own script

- Write one script with what your product really says, such as an English brand name, an amount in baht, a date, and a phone number.
- Run it through two or three vendors listed under your job, with voices of the same gender.
- Listen where your users will, on a phone speaker for an app and on a handset for a hotline.
- Check the output format, the request size limit, and the connection type against your player or phone system.
- Hear 9 Paxa TTS Flash v2 voices with no account on [the text to speech page](https://paxalabs.com/tts).

## Common questions

### Which Thai text to speech is best?

The one that fits your job. Find your job above, then test the two or three vendors it names on your own script, on the device your users hear it on.

### Does Paxa Labs clone voices?

No. Catalog voices keep fixed slugs, and [voice design](https://paxalabs.com/voice-design) builds a new voice from a written description, with no recording. iApp, ElevenLabs, Fish Audio, MiniMax, and UVoice AI document voice cloning.

### Can one product use more than one text to speech vendor?

Yes. Each request stands alone. An app can send its screen reading to one vendor and its phone prompts to another, as long as both voices suit the brand.

### Where are the prices?

On [the text to speech API comparison](https://paxalabs.com/compare/text-to-speech-apis), which lists each vendor's published rate beside ours and is re-checked every month.

### Do you publish quality or latency comparisons?

No. We publish no accuracy, quality, or latency figures, for our models or anyone else's. Listen to each candidate on your own text before you choose.

# Best Thai speech to text for meetings, subtitles, and voice agents

Which speech to text service fits Thai meetings, recorded calls, subtitles, long recordings, mixed Thai and English, or a live voice agent, from each vendor's own documentation.

Published 2026-10-17. Paxa Labs.

Thai recordings bring their own problems to transcription. Words run together with no spaces between them. English product names arrive mid-sentence, and a number can come back as words or as digits. Which of these matters most depends on the job, and the job decides which vendors stay on the list.

Every vendor fact below links that vendor's own documentation, as our comparison pages verified it in October 2026. No vendor is scored or ranked. Published rates for each one are on [the speech to text API comparison](https://paxalabs.com/compare/speech-to-text-apis), re-checked every month.

> Paxa STT Lite and Paxa STT Lite Realtime are both in Research preview. Their transcripts and options may change between releases, and [the speech to text page](https://paxalabs.com/speech-to-text#changelog) records each change.

## Check which model reads Thai

Read each vendor's language list model by model. [AssemblyAI](https://www.assemblyai.com/docs/pre-recorded-audio/supported-languages) lists Thai for Universal-2 and leaves it off Universal-3.5 Pro, which can fall back to Universal-2 for languages outside its set. Its [code switching guide](https://www.assemblyai.com/docs/pre-recorded-audio/code-switching) marks Universal-2 as legacy.

[Deepgram](https://developers.deepgram.com/docs/models-languages-overview) lists Thai (th, th-TH) for Nova-3 and Nova-2. [Google's Chirp 3 page](https://docs.cloud.google.com/speech-to-text/v2/docs/chirp_3-model) lists Thai at Preview launch readiness. [Speechmatics](https://docs.speechmatics.com/speech-to-text/languages) lists Thai, and [ElevenLabs](https://elevenlabs.io/docs/overview/capabilities/speech-to-text) lists it among the 90+ languages of Scribe v2.

## For meetings, interviews, and recorded calls

A meeting transcript needs to say who spoke. [Deepgram's diarization](https://developers.deepgram.com/docs/diarization) puts a speaker value on every word, with a confidence score on recorded audio, and works on every Nova batch model. [ElevenLabs](https://elevenlabs.io/docs/overview/capabilities/speech-to-text) diarizes up to 32 speakers on Scribe v2.

[AssemblyAI](https://www.assemblyai.com/docs/pre-recorded-audio/label-speakers) labels each utterance with a letter, such as A, B, and C, and advises at least 30 seconds of continuous speech per speaker. [Google's Chirp 3](https://docs.cloud.google.com/speech-to-text/v2/docs/chirp_3-model) leaves Thai off its diarization language list.

Paxa STT Lite, a Research preview, returns numbered speaker turns on a recording under 9 minutes, and nobody is identified by name. Split a longer meeting at a pause, and each part numbers its speakers afresh. The [meetings](https://paxalabs.com/use-cases/meetings) and [call recordings](https://paxalabs.com/use-cases/call-recordings) pages and [the speaker turns guide](https://paxalabs.com/guides/thai-call-transcripts-with-speaker-turns) go further.

## For product names, people, and jargon

Product meetings and support calls are full of brand names and jargon. Each vendor in this section takes a list of terms to expect. [Speech adaptation on Google's Chirp 3](https://docs.cloud.google.com/speech-to-text/v2/docs/chirp_3-model) takes up to 1,000 phrases. [Deepgram's keyterm prompting](https://developers.deepgram.com/docs/keyterm) works on Nova-3 and on Flux, with up to 500 tokens of key terms per request. [ElevenLabs](https://elevenlabs.io/docs/overview/capabilities/speech-to-text) takes up to 1,000 terms on recorded audio and 50 on realtime.

Paxa STT Lite, a Research preview, takes up to 50 terms of up to 50 characters each, in Thai or any other language. The terms bias recognition toward your spelling and are never inserted.

## For recordings that switch between Thai and English

Thai speakers often say a product name or a technical term in English and carry on in Thai. A useful transcript keeps each word in the script it was spoken in.

[Speechmatics](https://docs.speechmatics.com/speech-to-text/languages) lists Thai, and its Melia 1 model switches between the listed languages with no language selection. Its Enhanced and Standard models take one selected language or a fixed pack, and none of the packs includes Thai.

On [AssemblyAI's Universal-2](https://www.assemblyai.com/docs/pre-recorded-audio/code-switching), a manual list holds at most two language codes, one of them English, and the model detects up to two languages per file. [Deepgram's multilingual option for Nova-3](https://developers.deepgram.com/docs/models-languages-overview) covers ten languages, and Thai is not among them. [Google's Chirp 3](https://docs.cloud.google.com/speech-to-text/v2/docs/chirp_3-model) set to auto transcribes the dominant language of a file.

Paxa STT Lite, a Research preview, writes a Thai sentence that switches into English as it was spoken, with no language setting and no translation. [The code-switching guide](https://paxalabs.com/guides/transcribing-thai-english-code-switching) shows what that does for search.

## For subtitles on video

Thai writes no spaces between words. A subtitle line broken at a character count can split a word in half.

Paxa STT Lite, a Research preview, returns an SRT or WebVTT file in the same response as the transcript. Every line break falls on a word boundary, Thai included, and the line length is yours to set.

[AssemblyAI](https://www.assemblyai.com/docs/pre-recorded-audio/export-transcripts-as-srt-vtt-or-text) exports a finished transcript as SRT or VTT from its own endpoint, with `chars_per_caption` setting the most characters in each caption. [Deepgram's captions guide](https://developers.deepgram.com/docs/automatically-generating-webvtt-and-srt-captions) turns the JSON transcript into WebVTT or SRT in your own code, with its `@deepgram/captions` package.

Whichever you choose, open the file on a Thai clip and read where each line breaks. [The subtitles page](https://paxalabs.com/subtitles) and [the word timestamps guide](https://paxalabs.com/guides/thai-subtitles-from-word-timestamps) show a Thai cue broken between words, and [the captions page](https://paxalabs.com/use-cases/captions) covers the video workflow.

## For lectures, seminars, and other long recordings

[ElevenLabs Scribe](https://elevenlabs.io/docs/overview/capabilities/speech-to-text) takes files up to 10 hours in standard mode, and [its API](https://elevenlabs.io/docs/api-reference/speech-to-text/convert) fetches a file from a source URL and can deliver results to a webhook. [Deepgram](https://developers.deepgram.com/docs/pre-recorded-audio) accepts files up to 2 GB and returns a 504 when processing on a Nova model runs past 10 minutes.

[Speechmatics](https://docs.speechmatics.com/speech-to-text/batch/limits) takes a file of 1 GB or more through a fetch URL and recommends notifications for job status. On [Google's Chirp 3](https://docs.cloud.google.com/speech-to-text/v2/docs/chirp_3-model), BatchRecognize suits audio from one minute to an hour, or up to 20 minutes with word timestamps. Google's [batch recognition](https://docs.cloud.google.com/speech-to-text/v2/docs/batch-recognize) reads only audio stored in Cloud Storage.

Paxa STT Lite, a Research preview, transcribes up to 60 minutes and 25 MiB in one request. Split a longer recording at a pause and send the parts as separate requests. [The lectures page](https://paxalabs.com/use-cases/lectures) shows the workflow.

## For live captions and voice agents

A live transcript has to decide where each turn ends, and vendors put that decision in different places.

Paxa STT Lite Realtime, a Research preview, decides it in the session. Over one WebSocket it reports when the user starts and stops talking, then sends one final transcript per turn, with no setting to tune. It takes 16-bit PCM at 16 or 48 kHz, or μ-law at 8 kHz as telephony delivers it.

[ElevenLabs' realtime guide](https://elevenlabs.io/docs/eleven-api/guides/how-to/speech-to-text/realtime/transcripts-and-commit-strategies) commits transcript segments manually by default, or once a silence threshold is reached under its voice activity strategy. On [Speechmatics' Melia 1](https://docs.speechmatics.com/speech-to-text/models), realtime transcription offers channel diarization only, and the client sends ForceEndOfUtterance when the speaker has finished.

Before you build, confirm that the live model itself lists Thai. [The live transcription page](https://paxalabs.com/use-cases/live-transcription), [the realtime turns guide](https://paxalabs.com/guides/realtime-thai-transcription-turns), and [the voice agents post](https://paxalabs.com/blog/realtime-transcription-for-thai-voice-agents) cover the Paxa side.

## For code written against the OpenAI SDK

[OpenAI's file transcription guide](https://developers.openai.com/api/docs/guides/speech-to-text) recommends `gpt-transcribe` on /v1/audio/transcriptions, with files up to 25 MB. [Its deprecations page](https://developers.openai.com/api/docs/deprecations) lists `whisper-1`, `gpt-4o-transcribe`, `gpt-4o-mini-transcribe`, and `gpt-4o-transcribe-diarize` for removal from the API on February 26, 2027.

Paxa's [/v1/audio/transcriptions](https://paxalabs.com/docs/openai-compatibility) serves the same `audio.transcriptions.create` call at a new base URL, with `model` set to `paxa-stt-lite-v1-preview`, a Research preview.

## Jobs and vendors at a glance

| Job | Vendors whose documentation states the fit |
| --- | --- |
| Meetings and recorded calls | AssemblyAI, Deepgram, ElevenLabs, Paxa STT Lite (Research preview) |
| Names and jargon | Deepgram, ElevenLabs, Google Chirp 3, Paxa STT Lite (Research preview) |
| Thai mixed with English | AssemblyAI, Speechmatics, Paxa STT Lite (Research preview) |
| Subtitle files | AssemblyAI, Deepgram, Paxa STT Lite (Research preview) |
| Long recordings | Deepgram, ElevenLabs, Google Chirp 3, Speechmatics, Paxa STT Lite (Research preview) |
| Live captions and voice agents | ElevenLabs, Speechmatics, Paxa STT Lite Realtime (Research preview) |
| OpenAI SDK code | OpenAI, Paxa STT Lite (Research preview) |

## Test on your own recordings

- Pick three recordings like your real traffic, such as a clean one, a noisy one, and one where Thai and English mix.
- Run each through every vendor listed under your job, with the same settings.
- Read the transcripts against the audio at names, figures, and negations.
- Score Thai on characters or syllables. [The accuracy guide](https://paxalabs.com/guides/measuring-thai-transcription-accuracy) explains why word error rate misleads on Thai.
- See a Thai recording transcribed word by word on [the transcription page](https://paxalabs.com/transcribe).

## Common questions

### Which Thai speech to text is best?

The one that fits your job. A voice agent needs turn detection, and a video team needs subtitle files. Run your own recordings through the vendors listed under your job and read the transcripts side by side.

### What does Research preview mean for Paxa STT Lite?

Paxa STT Lite and Paxa STT Lite Realtime are live on the API and in the console while they are evaluated. Their transcripts and options may change between releases, and the changelog on [the speech to text page](https://paxalabs.com/speech-to-text#changelog) records each change.

### Can one product use more than one speech to text vendor?

Yes. Each vendor takes its own key and its own requests. A product can send live turns to one vendor and long recordings to another.

### Where are the prices?

On [the speech to text API comparison](https://paxalabs.com/compare/speech-to-text-apis), which lists each vendor's published rate for recorded audio, re-checked every month.

### Do you publish accuracy comparisons?

No. We publish no accuracy, quality, or latency figures, for our models or anyone else's. Transcribe the same recording on each service you are considering and read the transcripts side by side.

# Best Thai OCR for PDFs, invoices, and scanned forms

Which OCR or document extraction service fits Thai PDFs bound for an LLM, invoices and ID numbers, handwriting, Office files, or self-hosting, from each vendor's own documentation.

Published 2026-10-17. Paxa Labs.

A Thai PDF that prints perfectly can still give up broken text. Its text layer may drop the vowels and tone marks above and below a consonant, or store them out of order, and a scan has no text layer at all. Most Thai document work starts with OCR for that reason. [The Thai PDF guide](https://paxalabs.com/guides/thai-pdf-text-extraction) shows each failure with the string it produces.

What comes after OCR depends on the job. A language model wants Markdown, and an accounting system wants typed fields. The output shape, the languages on the page, and where the service may run decide which vendors stay on the list.

Every vendor fact below links that vendor's own documentation, as our comparison pages verified it in October 2026. No vendor is scored or ranked. Published rates for each one are on [the OCR API comparison](https://paxalabs.com/compare/ocr-apis), re-checked every month.

## Check that Thai is on the list

[Amazon Textract](https://docs.aws.amazon.com/textract/latest/dg/limits-document.html) detects text in English, French, German, Italian, Portuguese, and Spanish, and reads handwriting in English only. Thai is not on its list.

[Azure Document Intelligence](https://learn.microsoft.com/en-us/azure/ai-services/document-intelligence/language-support/ocr) lists Thai for printed text and for handwriting on its Read and Layout models, and the language code is optional. [Mistral's language list](https://docs.mistral.ai/resources/languages#ocr) places Thai under Southeast Asia. [LlamaParse's OCR](https://developers.llamaindex.ai/llamaparse/parse/features/ocr-and-languages/) takes an optional list of expected languages, and its API reference includes `th`.

Paxa OCR Lite reads Thai first, with other languages read as printed, including pages that mix Thai and English or Thai and Arabic digits.

## For Thai PDFs going into an LLM or a search index

A language model reads text, and a table flattened into a run of words loses its rows. Markdown keeps headings, lists, and tables in plain characters.

Paxa OCR Lite [returns each page](https://paxalabs.com/docs/ocr) as GitHub-flavored Markdown in reading order, with headings, lists, and tables, or as typed blocks of the same reading. One request reads up to 50 pages and 10 MiB of PDF, PNG, JPEG, or WebP.

[Mistral OCR](https://docs.mistral.ai/capabilities/document_ai/basic_ocr) returns Markdown per page, with tables inline or as separate Markdown or HTML, and extracts the page's images beside the text. [LlamaParse](https://developers.llamaindex.ai/llamaparse/parse/) returns Markdown with headings and tables on every tier except Fast, which returns text without Markdown. [Azure Document Intelligence's Layout model](https://learn.microsoft.com/en-us/azure/ai-services/document-intelligence/prebuilt/layout) can return Markdown, with tables written as HTML in v4.0.

[Feeding Thai documents to an LLM](https://paxalabs.com/guides/thai-documents-for-llms) and [the search index guide](https://paxalabs.com/guides/thai-pdf-to-search-index) take the Markdown from there, and [the knowledge bases page](https://paxalabs.com/use-cases/knowledge-bases) shows the workflow.

## For fields you define

Document extraction returns named values, such as a seller's tax ID or an invoice total, ready for a database row.

Paxa Document Extraction [fills a typed schema](https://paxalabs.com/docs/extraction) of up to 100 leaf fields over up to 20 pages, in one response. Each value is text printed in the document, or null with the reason. It returns no confidence score.

[Mistral's annotations](https://docs.mistral.ai/capabilities/document_ai/annotations) fill a Pydantic, Zod, or JSON schema for the whole document or for each image region, with nested objects, arrays, and enums. [LlamaParse Extract](https://developers.llamaindex.ai/llamaparse/general/limitations/) fills a JSON schema of up to 5,000 properties as a job you poll, and [can attach citations and a confidence score](https://developers.llamaindex.ai/llamaparse/extract/guides/response-format/) to each field.

Write the same fields into each vendor's schema and run one real document through all three. Then compare which fields came back empty or wrong, and why. [The Document Extraction page](https://paxalabs.com/document-extraction) shows one Thai tax invoice filled in.

## For Thai invoices, receipts, and ID numbers

[Azure Document Intelligence's prebuilt invoice model](https://learn.microsoft.com/en-us/azure/ai-services/document-intelligence/language-support/prebuilt) lists Thai among its languages, with THB among its currencies, and its receipt model lists Thai too. [Amazon Textract's FAQs](https://aws.amazon.com/textract/faqs/) state that it processes invoices, receipts, and identity documents in English only.

Paxa Document Extraction has built-in types for Thai documents. A 13-digit Thai identifier is verified by its check digit, and provinces, banks, insurers, and legal forms resolve against tables the service ships. Dates read in either the Buddhist or the Common Era.

Whichever service reads the card or the invoice, keep a person on the fields that move money, such as the payee, the amount, and the account number. The [invoices](https://paxalabs.com/use-cases/invoices), [identity documents](https://paxalabs.com/use-cases/identity), and [contracts](https://paxalabs.com/use-cases/contracts) pages show each workflow.

## For handwritten forms

[Azure Document Intelligence's v4.0 handwriting table](https://learn.microsoft.com/en-us/azure/ai-services/document-intelligence/language-support/ocr) lists twelve languages, Thai among them, for its Read and Layout models. [Amazon Textract](https://docs.aws.amazon.com/textract/latest/dg/limits-document.html) reads handwriting in English only.

Test with forms filled in by several people, photographed the way your users will photograph them.

## For Office files and very long documents

[Azure Document Intelligence's Read and Layout models](https://learn.microsoft.com/en-us/azure/ai-services/document-intelligence/service-limits) accept DOCX, PPTX, and XLS beside PDFs and images, and its Standard tier analyzes documents of up to 2,000 pages and 500 MB. [Mistral OCR](https://docs.mistral.ai/capabilities/document_ai/basic_ocr) accepts PPTX and DOCX, up to 50 MB and 1,000 pages.

[LlamaParse](https://developers.llamaindex.ai/llamaparse/parse/) reads more than 130 file types, and [Parse takes files of up to 512 MB](https://developers.llamaindex.ai/llamaparse/general/limitations/) with no page cap.

Paxa OCR Lite reads PDF, PNG, JPEG, and WebP, up to 50 pages and 10 MiB per request. Export an Office file to PDF first, and split a longer document into parts.

## For running on your own infrastructure

Some teams must read documents inside their own network. [Azure Document Intelligence's container guide](https://learn.microsoft.com/en-us/azure/ai-services/document-intelligence/containers/install-run) runs the Read and Layout models, and the invoice, receipt, and ID document models, as Docker containers on premises.

[LlamaIndex's self-hosting page](https://developers.llamaindex.ai/llamaparse/self_hosting/) runs Parse and Extract on your own Kubernetes cluster through Helm charts, on Enterprise plans. [Mistral's OCR 4 announcement](https://mistral.ai/news/ocr-4/) describes a single-container deployment for self-hosting, available to enterprise customers.

## Jobs and vendors at a glance

| Job | Vendors whose documentation states the fit |
| --- | --- |
| Thai PDFs to Markdown | Azure Document Intelligence, LlamaParse, Mistral OCR, Paxa OCR Lite |
| A schema you write | LlamaParse Extract, Mistral annotations, Paxa Document Extraction |
| Thai invoices, receipts, and ID numbers | Azure Document Intelligence, Paxa Document Extraction |
| Thai handwriting | Azure Document Intelligence |
| Office files and long documents | Azure Document Intelligence, LlamaParse, Mistral OCR |
| Your own infrastructure | Azure Document Intelligence, LlamaParse, Mistral OCR |

## Test on your own documents

- Collect real pages, such as a clean digital PDF, a phone photo, a faxed form, and a page with a table.
- Run the same pages through each vendor listed under your job.
- Check the Thai marks first, meaning the vowels and tone marks above and below each consonant and the order they come back in.
- Check Thai digits, Buddhist Era years, and amounts against the printed page.
- For extraction, list the fields that came back empty or wrong, and read why.
- See a Thai tax invoice read into Markdown and into fields on [the OCR page](https://paxalabs.com/ocr).

## Common questions

### Which Thai OCR is best?

The one that fits your job. Match your documents and the output you need to a job above, then run your own files through the vendors it names.

### What is the difference between OCR and document extraction?

OCR returns the text of each page, as Markdown or as structured blocks. Document extraction fills named fields, such as an invoice number or a date, from the same file. Paxa OCR Lite does the first and Paxa Document Extraction the second.

### Can one pipeline use more than one of these services?

Yes. Route each document by its job, for example slide decks to one service and scanned Thai forms to another. Your code then reads one response shape per service.

### Where are the prices?

On [the OCR API comparison](https://paxalabs.com/compare/ocr-apis), which lists each vendor's published rate per 1,000 pages, re-checked every month.

### Do you publish accuracy comparisons?

No. We publish no accuracy, quality, or speed figures for any model. Run the same documents through each service you are considering and compare the output.

# Best AI voice generator for YouTube narration, faceless channels, and Shorts

Which AI voice generator fits a narrated explainer, a faceless channel, a Short, captions, a second language, or a clone of your own voice, from each tool's own pages.

Published 2026-10-17, updated 2026-10-23. Paxa Labs.

A YouTube channel that runs on narration needs a voice it can use every week. A ten-minute explainer, a faceless channel that uploads daily, and a Short each ask something different of the voice and of the tool that makes it.

Every tool fact below links that tool's own page, as we read it in October 2026. No tool is scored or ranked, and a tool appears under a job only where its own page states the fit.

## For narrated explainers and long videos

Every voice on Paxa TTS Flash v2 speaks English, Thai, and Mandarin. The catalog holds 50 of them, and [the voices page](https://paxalabs.com/voices) plays a sample of each. Paste a script into [the Speech tool](https://paxalabs.com/app/speech), pick a voice, and download MP3, Opus, or WAV.

One run reads up to 5,000 characters, about 5 minutes of English narration. A longer script goes in as parts that you join in your editor, and a paragraph break is a natural place to cut.

The catalog casts these voices for documentaries, lessons, and explainers.

| Voice | Role | Cast for |
| --- | --- | --- |
| [Khanom Krok](https://paxalabs.com/voices/khanomkrok) | Lead voice | Calm, unhurried elder voice and the roster's male lead: documentary, heritage storytelling, and narration. |
| [Foi Thong](https://paxalabs.com/voices/foithong) | Narrator | Captivating narrator for long reads and explainers. |
| [Kaprao](https://paxalabs.com/voices/kaprao) | Easygoing | Relaxed male voice for dialogue, voice assistants, and everyday explainers. |
| [Matum](https://paxalabs.com/voices/matum) | Documentary | Unhurried, precise voice-over for documentaries, travel films, and museum guides. |
| [Chu Chi](https://paxalabs.com/voices/chuchi) | Professor | Clear, knowledgeable lecturer for classes, e-learning, and explainers. |

[ElevenLabs Studio](https://elevenlabs.io/docs/product-guides/products/studio) has video projects that combine video, images, speech, music, sound effects, text, and captions. [Narakeet](https://www.narakeet.com/create/text-to-speech-for-youtube-videos.html) turns a PowerPoint deck into a narrated video from a voiceover written in the presenter notes. It also exports the narration alone as MP3 or WAV.

## For a faceless channel with one steady voice

A faceless channel is known by its narrator. Regular viewers learn the voice the way they would learn a host's face, and a new voice on every upload throws that away. Choose one voice and keep it.

[ElevenLabs' Voice Library](https://elevenlabs.io/docs/overview/capabilities/voices) holds over 10,000 voices shared by its community. [Speechify Studio](https://speechify.com/pricing-studio) lists access to more than 1,000 voices on its free and paid plans. [Narakeet](https://www.narakeet.com/create/text-to-speech-for-youtube-videos.html) offers 900 voices in 100 languages for YouTube narration.

Each Paxa TTS Flash v2 voice has its own page with a published sample, to hear before you commit a channel to it. [The creators page](https://paxalabs.com/use-cases/creators) shows a faceless channel putting one voice to work across its uploads.

## For Shorts voiceover

A Short has room for a few sentences. Put the payoff in the first one and write the script to the length of the clip. [The short-video voiceover guide](https://paxalabs.com/guides/ai-voiceover-for-tiktok-reels-and-shorts) gives a script length for each clip length.

In [the Speech tool](https://paxalabs.com/app/speech), the speed control quickens a read for a fast clip, and the price is the same at every speed. On Paxa TTS Flash v2, a direction in square brackets such as `[excited]` changes how the words after it are read.

The catalog casts these voices for promos, shorts, recaps, and reviews.

| Voice | Role | Cast for |
| --- | --- | --- |
| [Nom Yen](https://paxalabs.com/voices/nomyen) | Lead voice | Bright, energetic voice and the roster's female lead: promos, social clips, and everyday product speech. |
| [Moo Ping](https://paxalabs.com/voices/mooping) | Street energy | Confident, streetwise voice for ads and shorts. |
| [Tom Yum](https://paxalabs.com/voices/tomyum) | Best friend | Fast, hot, chatty best-friend voice for drama recaps, entertainment news, and social clips. |
| [Salim](https://paxalabs.com/voices/salim) | Girl next door | Easy, chatty everyday voice for vlogs, reviews, and lifestyle clips. |
| [Khai Jiao](https://paxalabs.com/voices/khaijiao) | Hype commentator | High-energy commentator for esports, match highlights, and launch trailers. |

[CapCut's AI voice reader](https://www.capcut.com/tools/ai-voice-reader) works inside the editor where the Short is cut. It drops the voiceover onto the timeline and aligns it to the subtitles automatically.

## For captions from the same voiceover

A viewer watching with the sound off gets only the captions. Upload the finished voice track to [the Transcribe tool](https://paxalabs.com/app/transcribe) and ask for subtitles. It returns an SRT or VTT file with the timing of every line.

[Narakeet's YouTube page](https://www.narakeet.com/create/text-to-speech-for-youtube-videos.html) says it generates subtitle and closed caption files automatically. Video projects in [ElevenLabs Studio](https://elevenlabs.io/docs/product-guides/products/studio) carry captions beside the speech. [CapCut](https://www.capcut.com/tools/ai-voice-reader) aligns its voiceover to the subtitles already on its timeline.

## For a channel in more than one language

Every Paxa TTS Flash v2 voice reads English, Thai, and Mandarin in the same voice. One narrator can carry an English channel and a Thai or Chinese channel beside it, from a script written in each language.

[ElevenLabs Dubbing](https://elevenlabs.io/docs/product-guides/products/dubbing) lists more than 90 languages and keeps the original speakers' voices in the dub. Its Paste URL option takes a video straight from YouTube. [Speechify Studio](https://speechify.com/pricing-studio) lists a Dubbing Studio on its free and paid plans, and [Narakeet](https://www.narakeet.com/create/text-to-speech-for-youtube-videos.html) offers voices in 100 languages.

## For a clone of your own voice

[ElevenLabs' voices documentation](https://elevenlabs.io/docs/overview/capabilities/voices) describes Instant Voice Cloning from samples under two minutes, and Professional Voice Cloning trained on extended audio. [CapCut's custom voice page](https://www.capcut.com/tools/custom-ai-voice) takes an upload of your own voice and learns its tone and speech pattern.

Paxa Labs offers no voice cloning. [Voice design](https://paxalabs.com/voice-design) builds a new voice from a written description instead, which you save and reuse on every video. Impersonating a real person without their consent is against [the rules every account accepts](https://paxalabs.com/responsible-ai).

## Before the channel earns from it

The free credits on a new Paxa account are for personal use and evaluation. Buy any plan or credit pack, and the account's audio is yours to use commercially, including audio made before the purchase. A monetized channel or a sponsored video belongs on a paid account. [The Terms](https://paxalabs.com/terms#content-and-output) state the rule.

[ElevenLabs' help center](https://elevenlabs.io/docs/help-center/legal/can-i-publish-the-content-i-generate-on-the-platform) says its free plan includes no commercial license, and that content made outside a paid subscription, before or after one, cannot be used commercially. [Speechify Studio](https://speechify.com/pricing-studio) lists commercial usage rights on its Starter plan and none on its free plan.

[Murf's help center](https://help.murf.ai/do-i-have-commercial-rights-over-the-voice-over-created) says all its paid plans carry commercial rights over voiceovers made in its Studio. [Narakeet](https://www.narakeet.com/docs/usage-rights-copyright/) allows commercial use of content created on a commercial account and none on a free account.

Read YouTube's own rules on AI-made content before the first upload. [The short-video voiceover guide](https://paxalabs.com/guides/ai-voiceover-for-tiktok-reels-and-shorts) quotes its disclosure rule with the source.

## Jobs and tools at a glance

| Job | Tools whose own pages state the fit |
| --- | --- |
| Narrated explainers and long videos | ElevenLabs Studio, Narakeet, Paxa TTS Flash v2 |
| A faceless channel | ElevenLabs, Narakeet, Speechify Studio, Paxa TTS Flash v2 |
| Shorts voiceover | CapCut, Paxa TTS Flash v2 |
| Captions | CapCut, ElevenLabs Studio, Narakeet, Paxa Labs |
| More than one language | ElevenLabs Dubbing, Narakeet, Speechify Studio, Paxa TTS Flash v2 |
| A clone of your own voice | CapCut, ElevenLabs |
| Commercial rights on a paid plan | ElevenLabs, Murf, Narakeet, Speechify Studio, Paxa TTS Flash v2 |

## Test on a real script

- Take the script of a video you have already planned, with a name, a number, and a term from your niche in it.
- Run it through two or three tools listed under your job, on voices of the same gender.
- Listen on a phone speaker and on headphones, where your viewers will hear it.
- Check the license on the plan you will publish from before the first upload.
- Hear 9 Paxa TTS Flash v2 voices with no account on [the free text to speech page](https://paxalabs.com/tts).

## Common questions

### Which AI voice generator fits a YouTube channel?

The one that fits the channel's main job. Find that job above, then test the two or three tools it names on a real script.

### Can I use free credits on a monetized channel?

No. The free credits cover personal use and evaluation. Buy any plan or credit pack, and the audio is yours to use commercially, including audio made before the purchase.

### Does Paxa Labs clone voices?

No. [Voice design](https://paxalabs.com/voice-design) builds a new voice from a written description instead. ElevenLabs documents voice cloning, and CapCut builds a custom voice from a recording you upload.

### Where are the prices?

Our plans and credit packs are on [the pricing page](https://paxalabs.com/pricing). Each tool above publishes its own plans on its own site.

### Do you publish quality comparisons?

No. We publish no accuracy, quality, or latency figures, for our models or anyone else's. Listen to each candidate on your own script before you choose.

# Best free text to speech for personal projects and trying voices before you pay

Which free text to speech fits hearing a line with no account, listening to a page, a video edit, a personal project, or a trial, and what each license allows.

Published 2026-10-17. Paxa Labs.

Free text to speech serves several needs. Some people want to hear one line read aloud right now. Others want a voice for a school presentation or a family video, or a proper trial of a voice before they pay for it.

On a free tier, the license decides what you can do with the audio. Every tool fact below links that tool's own page, as we read it in October 2026, and no tool is scored or ranked.

## For hearing a line with no account

[The free text to speech page](https://paxalabs.com/tts) reads a line you type in 9 Paxa TTS Flash v2 voices, with no account. Each of them speaks English, Thai, and Mandarin.

[Narakeet's AI voice generator](https://www.narakeet.com/create/ai-voice-generator.html) makes 20 audio files free without registering. [Its pricing page](https://www.narakeet.com/docs/pricing/) caps a free script at 1 KB and says previews deduct no credits.

## For listening to a page yourself

Sometimes the job is to listen to a page, with nothing to publish. Two readers come built into a browser and an operating system.

[Microsoft Edge](https://support.microsoft.com/en-us/edge/use-immersive-reader-in-microsoft-edge) has Read aloud on its Reading mode toolbar, which reads the text of a webpage aloud. Its voice options change the reader's voice and pace. On [a Mac](https://support.apple.com/guide/mac-help/mh27448/mac), Speak selection reads selected text when you press Option-Esc, the default shortcut.

## For trying voices before you pay

A new Paxa account gets 100 free credits, granted once. They voice about 11 minutes of English narration across any of the 50 voices in [the Speech tool](https://paxalabs.com/app/speech), enough to hear a voice read a whole script.

[ElevenLabs' pricing page](https://elevenlabs.io/pricing) lists text to speech and Studio projects on its free plan. [Speechify Studio](https://speechify.com/pricing-studio) lists a Voiceover Studio, a Dubbing Studio, and access to more than 1,000 voices on its free plan. A free [Narakeet](https://www.narakeet.com/docs/pricing/) account runs 20 conversions.

## For a voiceover inside a video editor

[CapCut's text to speech page](https://capcut.com/tools/ai-text-to-speech) says its core text to speech is free for all users, with some premium voices on its Pro subscription. [Its AI voice reader](https://www.capcut.com/tools/ai-voice-reader) drops the voiceover onto the editing timeline and aligns it to the subtitles.

## For personal projects

A school presentation, a bedtime story for your own children, and a video for a family event are personal projects. Each free tier sets its own conditions on them.

On Paxa, the free credits cover personal use and evaluation. [ElevenLabs' help center](https://elevenlabs.io/docs/help-center/legal/can-i-publish-the-content-i-generate-on-the-platform) asks that content published from its free plan carry `elevenlabs.io` or `11.ai` in its title. [Narakeet's usage rights page](https://www.narakeet.com/docs/usage-rights-copyright/) allows no commercial use of content made on a free account, and [Speechify Studio](https://speechify.com/pricing-studio) lists no commercial usage rights on its free plan.

## When a project starts to earn

A monetized channel, an audiobook for sale, an ad, and a client job are commercial use. On Paxa, the free credits are for personal use and evaluation only. Buy any plan or credit pack, and all of the account's audio is yours to use commercially, including audio made before the purchase. [The Terms](https://paxalabs.com/terms#content-and-output) state the rule.

[ElevenLabs' help center](https://elevenlabs.io/docs/help-center/legal/can-i-publish-the-content-i-generate-on-the-platform) says content made outside a paid subscription, before or after one, cannot be used commercially. [Murf's help center](https://help.murf.ai/do-i-have-commercial-rights-over-the-voice-over-created) says all its paid plans carry commercial rights over voiceovers made in its Studio.

[Speechify Studio](https://speechify.com/pricing-studio) lists commercial usage rights on its Starter plan. [Narakeet](https://www.narakeet.com/docs/usage-rights-copyright/) allows commercial use of content created on a commercial account. [CapCut's text to speech page](https://capcut.com/tools/ai-text-to-speech) says the audio it makes can be used for commercial projects.

## Jobs and tools at a glance

| Job | Tools whose own pages state the fit |
| --- | --- |
| Hearing a line with no account | Narakeet, Paxa TTS Flash v2 |
| Listening to a page yourself | Mac Speak selection, Microsoft Edge Read aloud |
| Trying voices before you pay | ElevenLabs, Narakeet, Speechify Studio, Paxa TTS Flash v2 |
| A voiceover inside a video editor | CapCut |
| Commercial use | CapCut, ElevenLabs, Murf, Narakeet, Speechify Studio, Paxa TTS Flash v2 |

## Make a free tier count

- Try your real script, with the names and numbers it holds, before you judge a voice.
- Play the samples first. Previews cost nothing on Paxa and on Narakeet.
- Read the free tier's license before you publish anything made on it.
- Buy before a project earns, or confirm that the tool's license covers audio made earlier.
- Hear 9 voices on [the free text to speech page](https://paxalabs.com/tts), then try all 50 in [the Speech tool](https://paxalabs.com/app/speech) with the free credits.

## Common questions

### Is there free text to speech with no sign-up?

Yes. [The free text to speech page](https://paxalabs.com/tts) reads your line in 9 voices with no account, and Narakeet's generator makes 20 files without registering.

### Can I use free text to speech on a YouTube channel?

A monetized channel is commercial use. On Paxa, the free credits cover personal use and evaluation, and any purchase covers the account's audio, including videos voiced before it. Each other tool sets its own free license, linked above.

### Do the free credits renew?

No. A new account gets 100 credits once. Plans and credit packs add more, and [the pricing page](https://paxalabs.com/pricing) lists them.

### Which voices can I try for free?

All 50 Paxa TTS Flash v2 voices, in [the Speech tool](https://paxalabs.com/app/speech) with the free credits. 9 of them also play on [the free text to speech page](https://paxalabs.com/tts) with no account.

# Best text to speech for audiobooks and long-form narration

Which text to speech tool fits a whole book, a narrator, fiction with dialogue, editions in more than one language, or a book you plan to sell, from each tool's own pages.

Published 2026-10-17, updated 2026-10-23. Paxa Labs.

An audiobook keeps a listener with one voice for hours. A narrator who sounds right on one page can tire by the third chapter, and a tool built for short clips can make a whole book slow to assemble.

Every tool fact below links that tool's own page, as we read it in October 2026. No tool is scored or ranked, and a tool appears under a job only where its own page states the fit.

## For a whole book, chapter by chapter

[ElevenLabs Studio](https://elevenlabs.io/docs/product-guides/products/studio) has audio projects for long-form narration, podcasts, and audiobooks. A project holds up to 500 chapters in a sidebar. It exports as one file, or as a ZIP with a file for each chapter.

[Narakeet's audiobook page](https://www.narakeet.com/create/text-to-voice-audiobooks.html) takes a book's chapters as Word documents, EPUB files, or PDFs, and converts them into audio. The result downloads as MP3, WAV, or M4A.

In [the Speech tool](https://paxalabs.com/app/speech), one run reads up to 5,000 characters, about 5 minutes of English narration. A chapter goes in as several runs, and you join the clips in an audio editor. Download WAV when the chapter will be edited and mastered there.

## For choosing a narrator

Every Paxa TTS Flash v2 voice speaks English, Thai, and Mandarin. The catalog casts these for narration, long reads, audio novels, and lessons.

| Voice | Role | Cast for |
| --- | --- | --- |
| [Khanom Krok](https://paxalabs.com/voices/khanomkrok) | Lead voice | Calm, unhurried elder voice and the roster's male lead: documentary, heritage storytelling, and narration. |
| [Foi Thong](https://paxalabs.com/voices/foithong) | Narrator | Captivating narrator for long reads and explainers. |
| [Espresso](https://paxalabs.com/voices/espresso) | Long-form reader | Deep, dark, unhurried English reader for long fiction, documentaries, and trailers. |
| [Oolong](https://paxalabs.com/voices/oolong) | Audio fiction | Low, rich Mandarin narrator for audio novels, brand reads, and late-night stories. |
| [Matum](https://paxalabs.com/voices/matum) | Documentary | Unhurried, precise voice-over for documentaries, travel films, and museum guides. |
| [Chu Chi](https://paxalabs.com/voices/chuchi) | Professor | Clear, knowledgeable lecturer for classes, e-learning, and explainers. |

Play a whole page in each candidate before you decide, because a voice that suits one sentence can tire over a chapter. [The narrator voice page](https://paxalabs.com/narrator-voice) plays narrators reading in English, Thai, and Mandarin.

[ElevenLabs' Voice Library](https://elevenlabs.io/docs/overview/capabilities/voices) holds over 10,000 voices shared by its community, and its Voice Design builds a new voice from attributes such as age, gender, accent, and tone. [Narakeet](https://www.narakeet.com/create/text-to-voice-audiobooks.html) offers 900 voices in 100 languages for an audiobook.

## For fiction with dialogue and characters

[ElevenLabs Studio](https://elevenlabs.io/docs/product-guides/products/studio) can assign several voices within a single paragraph, each marked in its own color. It can also replace one voice across a whole project.

On Paxa TTS Flash v2, a direction in square brackets changes how the text after it is read. `[whispering]` before a line of dialogue, or `[sad]` before a farewell, holds until the next direction. Each run speaks in one voice. Voice each character's lines in that character's voice, then lay the clips in order.

The catalog casts these voices for folk tales, love stories, fantasy, and audio drama.

| Voice | Role | Cast for |
| --- | --- | --- |
| [Hor Mok](https://paxalabs.com/voices/hormok) | Fantasy knight | Noble, resonant voice for fantasy heroes, epic audio drama, and games. |
| [Krayasat](https://paxalabs.com/voices/krayasat) | Grandfather | Unhurried, kindly grandfather voice for bedtime stories, folk tales, and life lessons. |
| [Miang Kham](https://paxalabs.com/voices/miangkham) | Grandmother | Stern, commanding elder voice for grandmother roles, folk tales, and ghost stories. |
| [Chor Muang](https://paxalabs.com/voices/chormuang) | Bashful | Hesitant, heartfelt voice for love stories, visual novels, and tender scenes. |
| [Khao Lam](https://paxalabs.com/voices/khaolam) | Soft romantic | Low, gentle male voice for love stories, audio drama, and sleep tracks. |
| [Kaeng Pa](https://paxalabs.com/voices/kaengpa) | Villain | Rough, menacing villain voice for games, audio drama, and animation. |
| [Makham](https://paxalabs.com/voices/makham) | Villainess | Cold, cutting voice for villainesses, sorceresses, and dark fantasy. |

[The audio novels page](https://paxalabs.com/use-cases/audio-novels) gives each character of a serial its own catalog voice, and [the voice acting page](https://paxalabs.com/voice-acting) plays directions written into real lines.

## For a book in English, Thai, or Mandarin

Every Paxa TTS Flash v2 voice reads English, Thai, and Mandarin in the same voice. A book published in two or three languages can keep one narrator across its editions, voiced from the translated text of each.

[ElevenLabs' models page](https://elevenlabs.io/docs/overview/models) lists 70+ languages for Eleven v3 and 90+ for the Eleven v4 family. [Narakeet](https://www.narakeet.com/create/text-to-voice-audiobooks.html) offers voices in 100 languages.

## For a book you plan to sell

The free credits on a new Paxa account are for personal use and evaluation. Buy any plan or credit pack, and the account's audio is yours to use commercially, including chapters voiced before the purchase. A book for sale belongs on a paid account. [The Terms](https://paxalabs.com/terms#content-and-output) state the rule.

[ElevenLabs' help center](https://elevenlabs.io/docs/help-center/legal/can-i-publish-the-content-i-generate-on-the-platform) says every paid plan includes a commercial license, provided you are not using its Beta Services. It also says content made outside a paid subscription, before or after one, cannot be used commercially.

[Murf's help center](https://help.murf.ai/do-i-have-commercial-rights-over-the-voice-over-created) says all its paid plans carry commercial rights over voiceovers made in its Studio, and [those rights stay valid](https://help.murf.ai/will-my-commercial-rights-and-business-license-be-valid-after-my-subscription-has-ended) after a subscription ends. A book sells for years, and that term matters.

[Narakeet](https://www.narakeet.com/docs/usage-rights-copyright/) allows commercial use of content created on a commercial account. [Speechify Studio](https://speechify.com/pricing-studio) lists commercial usage rights on its Starter plan and none on its free plan.

Read the current terms of every store you will sell through before you upload.

## Jobs and tools at a glance

| Job | Tools whose own pages state the fit |
| --- | --- |
| A whole book in chapters | ElevenLabs Studio, Narakeet, Paxa TTS Flash v2 |
| Choosing a narrator | ElevenLabs, Narakeet, Paxa TTS Flash v2 |
| Fiction with dialogue | ElevenLabs Studio, Paxa TTS Flash v2 |
| Editions in more than one language | ElevenLabs, Narakeet, Paxa TTS Flash v2 |
| Commercial rights on a paid plan | ElevenLabs, Murf, Narakeet, Speechify Studio, Paxa TTS Flash v2 |

## Test on a real chapter

- Pick one chapter that holds dialogue, a list, a number, and a name from another language.
- Run it through two or three tools listed under your job, and hear each whole chapter in one sitting.
- Listen on earbuds and on a car speaker, two places an audiobook is heard.
- Check the license on the plan you will publish from, and the terms of the store you will sell through.
- Hear 9 Paxa TTS Flash v2 voices with no account on [the free text to speech page](https://paxalabs.com/tts).

## Common questions

### Which text to speech fits an audiobook?

The one that fits your book's main job. Find that job above, then test the two or three tools it names on a real chapter.

### Can I sell an audiobook made with free credits?

Yes, once the account has made any purchase. The free credits alone cover personal use and evaluation. Buy any plan or credit pack, and the account's audio is yours to use commercially, including chapters voiced before the purchase.

### How much text does one run read?

Up to 5,000 characters, about 5 minutes of English narration. A chapter goes in as several runs that you join in an audio editor.

### Does Paxa Labs clone a narrator's voice?

No. Paxa Labs clones no voice; a narrator of your own comes from [voice design](https://paxalabs.com/voice-design), built from a written description. ElevenLabs documents Instant and Professional Voice Cloning.

### Do you publish quality comparisons?

No. We publish no accuracy, quality, or latency figures, for our models or anyone else's. Listen to each candidate on your own chapter before you choose.

# What is text to speech? How AI voices work and where they are used

Text to speech turns written text into spoken audio. How an AI voice is made, what businesses use it for, what it costs, and how to judge one before you buy.

Published 2026-10-11, updated 2026-10-23. Paxa Labs.

Text to speech, or TTS, is software that reads written text aloud. You give it a sentence, a script, or a whole book, choose a voice, and get audio back. The same technology speaks the next turn in a navigation app, the menu on a bank's phone line, and the narration on a great many short videos.

The phrase covers a wide range of quality. The flat, robotic reader built into an old computer is text to speech. So is a voice a listener can mistake for a recording of a person. What changed between the two is how the voice is built.

## How text to speech works

Every system does three jobs in order, whatever it is built from.

1. Read the text: The system turns what is written into what should be said. A price becomes a number in words, an abbreviation becomes the phrase it stands for, and a date is read as a date. In a language written without spaces, such as Thai, it also has to find where each word begins.
2. Decide how it sounds: Each word gets its pronunciation, and the sentence gets its melody. That means which syllable is stressed, where the pitch rises, and where the voice stops for breath.
3. Make the sound: The system generates the audio itself. It arrives as a file such as MP3 or WAV, or as a stream that starts playing while the rest is still being made.

Older systems did the last step by cutting recorded speech into small pieces and joining them back together, and the joins made those voices sound mechanical. A modern voice is a neural network trained on many hours of recorded speech. It learns pronunciation and rhythm together and generates the audio whole. That is why it can pause for breath and lift the end of a question the way a person does.

## What businesses use text to speech for

Any text that someone would otherwise read aloud into a microphone is a candidate. The common jobs make a short list.

| Job | What the voice does | Read more |
| --- | --- | --- |
| Short video and social clips | Narrates a script over footage, with no recording session | [Creators](https://paxalabs.com/use-cases/creators) |
| Ads and radio spots | Reads a spot, and reads it again when the offer changes | [Advertising](https://paxalabs.com/use-cases/advertising) |
| E-learning and training | Voices every lesson in one voice, and re-reads a lesson after an update | [E-learning](https://paxalabs.com/use-cases/e-learning) |
| Audiobooks and articles | Reads a whole book, or turns each article into audio | [Audiobooks](https://paxalabs.com/use-cases/audiobooks), [publishers](https://paxalabs.com/use-cases/publishers) |
| Phone menus and announcements | Speaks the greeting, the queue number, and the closing-time notice | [Call centers](https://paxalabs.com/use-cases/call-centers), [announcements](https://paxalabs.com/use-cases/announcements) |
| Voice agents and companions | Answers a caller or a user out loud while the reply is still being written | [Voice agents](https://paxalabs.com/use-cases/voice-agents), [companions](https://paxalabs.com/use-cases/companions) |
| Accessibility | Reads a page or a document to someone who cannot read it on screen | [Accessibility](https://paxalabs.com/use-cases/accessibility) |

What these jobs share is change. A recorded voice is fixed on the day of the session, and every edit means booking the session again. Generated speech treats the script as the source. Change a line and the new audio is one more request.

## What makes a language hard to speak, with Thai as the example

A voice built for English does not turn into a Thai voice once it learns new letters. Each language sets its own problems, and Thai shows most of them at once.

- Tone is part of the word. Thai has five tones, and one syllable said on a different tone is a different word. A voice that gets the melody slightly wrong has said something else.
- Words run together. Thai is written without spaces between words, and the reader has to find each word before it can pronounce anything.
- Numbers and dates follow local rules. A year is usually written in the Buddhist Era, and a price, a phone number, and a house number are each read a different way.
- English arrives mid-sentence. Brand names and technical terms stay in Latin letters inside a Thai sentence, and the voice has to change language and change back without a pause.
- Politeness has a gender. The particles that end a polite sentence differ for male and female speakers, and a script has to match the voice that reads it.

Listen for exactly these when a provider says it supports a language. [How to judge a Thai AI voice in ten sentences](https://paxalabs.com/guides/judging-a-thai-ai-voice) turns them into a test anyone can run, and [the script guide](https://paxalabs.com/guides/writing-for-thai-text-to-speech) covers what the writer controls.

Five voices from one catalog:

- [Nom Yen](https://paxalabs.com/voices/nomyen), Lead voice: https://paxalabs.com/audio/nomyen.m4a
- [Khanom Krok](https://paxalabs.com/voices/khanomkrok), Lead voice: https://paxalabs.com/audio/khanomkrok.m4a
- [Som Tam](https://paxalabs.com/voices/somtam), Isan: https://paxalabs.com/audio/somtam.m4a
- [Cookie](https://paxalabs.com/voices/cookie), Support agent: https://paxalabs.com/audio/cookie.m4a
- [Tao Huay](https://paxalabs.com/voices/taohuay), Drama lead: https://paxalabs.com/audio/taohuay.m4a

Paxa TTS Flash has 34 voices across English, Thai, and Mandarin, with regional Thai accents among them. [The voices page](https://paxalabs.com/voices) plays every one.

## How to judge a text to speech voice

Sample clips are chosen to flatter. Judge a voice on your own text, and check six things before you commit.

- Language. Paste a paragraph of your real content, with its numbers, names, and borrowed words, and listen for the ones it gets wrong.
- Casting. A promo, a lesson, and a bedtime story want different readers, and the catalog should hold one that fits the brand.
- Control. Look for a speaking-rate setting, pauses that follow the punctuation, and a way to set emotion where the script needs it.
- Output. Check the file formats, and whether the audio can stream for a live conversation.
- Rights. Read what the plan allows. Some services license commercial use only on paid plans.
- Price unit. Most services charge per character of text. A few charge per minute of audio or sell a monthly bundle, and the three are hard to compare until you convert them.

[The comparison pages](https://paxalabs.com/compare) convert the public list prices of the main providers into one unit.

## What text to speech costs

Generated speech is priced by the amount of text. Paxa TTS Flash costs 10 credits per 1,000 characters, and 1,000 credits are one US dollar. A minute of English narration is about 897 characters, which comes to about 9 credits, or $0.009.

A new account starts with 100 free credits, enough for about 11 minutes of narration. The smallest monthly plan is $6 for 8,100 credits, which is about 15 hours of audio. [The pricing page](https://paxalabs.com/pricing) lists every plan, and [the voiceover cost guide](https://paxalabs.com/guides/thai-voice-over-cost) sets these figures beside studio and freelance rates.

The free credits are for personal use and evaluation. A first purchase of any size makes the account's audio yours to use commercially, including audio generated before it.

## Text to speech, speech to text, and voice cloning

Three terms get mixed up, and they describe different things.

- Text to speech turns text into audio, in a voice chosen from a catalog.
- [Speech to text](https://paxalabs.com/speech-to-text) goes the other way. It listens to a recording and writes down what was said, which is how a meeting becomes minutes and a video gets subtitles.
- Voice cloning builds a new voice from recordings of one particular person. It raises a question of consent that a catalog voice does not, because that person has to have agreed.

Paxa TTS Flash does not clone voices. Every voice in the catalog is a fixed cast member. A new voice comes from [voice design](https://paxalabs.com/voice-design), built from a written description. [The Responsible AI page](https://paxalabs.com/responsible-ai) covers how the voices are made and the rules every account accepts.

## Common questions

### Is text to speech free?

Phones and computers ship with a basic reader at no cost. For a natural voice, [the free text to speech page](https://paxalabs.com/tts) speaks a short line without an account, and a new account's 100 credits cover about 11 minutes before anything is paid.

### Can it speak in real time?

Yes. Audio can stream as it is generated, which lets a voice agent start answering while the rest of its reply is still being written. [The voice agents page](https://paxalabs.com/use-cases/voice-agents) shows how the pieces fit.

### Can an AI voice read with emotion?

Every voice has its own character, such as calm, bright, or theatrical. The catalog's experimental Thai emotion voices also take tags written into the text, such as `[happy]` or `[sad]`. [The emotional voices page](https://paxalabs.com/emotional-voices) plays each tag.

## Where a recorded human voice is still the right choice

Some sessions are still worth booking. A campaign built around a known person buys that person. A director who wants one word landed differently gets it fastest from an actor in the booth. Singing is its own craft. Most voice work is none of these. It is lessons, product videos, phone menus, and the updates to all of them, and that is where generated speech does the most.

## Next steps

- Type a line into [the box on the free text to speech page](https://paxalabs.com/tts) and hear it without an account.
- Listen to all 34 voices on [the voices page](https://paxalabs.com/voices).
- Read [how to choose a voice for the job](https://paxalabs.com/guides/choosing-a-thai-ai-voice) before you cast one.
- Create an account and open [the Speech tool](https://paxalabs.com/app/speech) to voice a full script and download the audio.

# How to add an AI voiceover to TikTok, Reels, and Shorts

Script, voice, and caption a short video with an AI voice. How long the script should be, which voice fits, and what the platforms ask you to disclose.

Published 2026-10-11, updated 2026-10-23. Paxa Labs.

Most short videos are a script read over footage. A recipe, a product review, a news recap, and a story told over gameplay all run on narration, and the narration is the part many creators put off. Recording it takes a quiet room, a decent microphone, and a voice you are willing to post.

An AI voice removes the recording. You write the script, pick a voice, and download the audio. The steps are the same for TikTok, Instagram Reels, YouTube Shorts, and Facebook Reels, because the result is an audio file that every editor accepts.

## The app's built-in voice, or your own

TikTok and the other short-video editors include a text to speech button. You type a caption, tap the button, and a preset voice reads it. It costs nothing and takes seconds, and for a quick reply video it is enough.

The limits show once a channel has a style. Every creator on the app has the same few voices, and regular viewers recognize them. The voice belongs to that app's editor, and the same clip cut in another editor gets a different one. Control ends at picking the voice.

A voice from a speech catalog is a file. Paxa TTS Flash has 34 voices in English, Thai, and Mandarin, and the file drops into any editor. One voice can narrate every clip on every platform a channel posts to.

## Write the script to the length of the clip

Narration runs at a steady pace, and the length of the script sets the length of the clip. English narration runs at about 897 characters a minute, spaces included. Count the characters before you cut the footage.

| Clip length | Script length | Cost to voice |
| --- | --- | --- |
| 15 seconds | About 224 characters | 2.2 credits |
| 30 seconds | About 449 characters | 4.5 credits |
| 60 seconds | About 897 characters | 9 credits |

Three habits make a short script work. Put the payoff in the first sentence, because a viewer decides in the first seconds whether to stay. Keep one idea to a sentence. Write the way you talk, and read the script aloud once before you generate anything.

Write numbers, prices, and names the way you want them said. [The script guide](https://paxalabs.com/guides/writing-for-thai-text-to-speech) covers Thai scripts in detail, including where a space becomes a pause.

## Choose a voice that fits the content

A voice sets the tone before the first word lands. A calm narrator on a flash-sale clip sounds wrong, and so does a hype voice on a news recap. The catalog states what each voice was cast for.

| Voice | Role | Cast for |
| --- | --- | --- |
| [Nom Yen](https://paxalabs.com/voices/nomyen) | Lead voice | Bright, energetic voice and the roster's female lead: promos, social clips, and everyday product speech. |
| [Massaman](https://paxalabs.com/voices/massaman) | Leading man | Deep, steady leading-man voice for trailers, drama, and announcements. |
| [Thong Ek](https://paxalabs.com/voices/thongek) | News anchor | Crisp, authoritative read for news bulletins and corporate updates. |
| [Moo Ping](https://paxalabs.com/voices/mooping) | Street energy | Confident, streetwise voice for ads and shorts. |
| [Tom Yum](https://paxalabs.com/voices/tomyum) | Best friend | Fast, hot, chatty best-friend voice for drama recaps, entertainment news, and social clips. |
| [Khanom Chan](https://paxalabs.com/voices/khanomchan) | Emotion tags | Natural conversational voice that changes mood with emotion tags written into the text: happy, sad, angry, or afraid. |
| [Som Tam](https://paxalabs.com/voices/somtam) | Isan | Isan-accented voice with local warmth. |
| [Donut](https://paxalabs.com/voices/donut) | Promos | Cheerful English voice for promos and demos. |
| [Toast](https://paxalabs.com/voices/toast) | Tutorials | Plain-spoken everyday English voice for tutorials. |
| [Tao Huay](https://paxalabs.com/voices/taohuay) | Drama lead | Tender, melancholy Mandarin voice for drama recaps, audio novels, and companion speech. |

Five voices for short video:

- [Nom Yen](https://paxalabs.com/voices/nomyen), Lead voice: https://paxalabs.com/audio/nomyen.m4a
- [Moo Ping](https://paxalabs.com/voices/mooping), Street energy: https://paxalabs.com/audio/mooping.m4a
- [Tom Yum](https://paxalabs.com/voices/tomyum), Best friend: https://paxalabs.com/audio/tomyum.m4a
- [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/khanomchan.m4a
- [Massaman](https://paxalabs.com/voices/massaman), Leading man: https://paxalabs.com/audio/massaman.m4a

Pick one voice per channel and keep it. Viewers come to know a narrator the way they know a face, and a channel that changes voice every clip gives that up. [The guide to choosing a voice](https://paxalabs.com/guides/choosing-a-thai-ai-voice) goes through all 34 by job.

## Make the voiceover, step by step

1. Paste the script: Open [the Speech tool](https://paxalabs.com/app/speech) and paste the script. The cost appears under the text before you generate anything.
2. Pick and preview a voice: Open the voice picker, filter by language, and play the samples. Previews are free.
3. Set the pace: Move the speed control up a little for a fast promo, or down for an explainer. The price is the same at every speed.
4. Generate and listen: Listen to the whole take once, with your attention on names, numbers, and English words. Fix a misread word by respelling it in the script, then generate again.
5. Download the file: Choose MP3 for most editors, or WAV when the voice will be mixed with music. Then download the clip.
6. Cut the video to the voice: Import the audio into your editor and lay the footage over it. Cutting pictures to a finished voice track is faster than stretching a voice to fit finished pictures.

The catalog's experimental Thai emotion voices read tags written into the script, such as `[happy]` before a line. [The emotional voices page](https://paxalabs.com/emotional-voices) plays each tag.

## Add captions from the same audio

A viewer with the sound off gets only the captions. Upload the finished voice track to [the Transcribe tool](https://paxalabs.com/app/transcribe) and ask for subtitles. It returns an SRT or VTT file with the timing of every line, ready to import into a video editor.

A Thai caption breaks only between words. That matters because Thai is written without spaces, and a careless break splits a word in two. Transcription costs 8.33 credits per minute of audio.

## What it costs

Speech is priced by the character, at 10 credits per 1,000 characters. A one-minute clip costs about 9 credits, which is $0.009. A new account's 100 free credits voice about 11 one-minute clips.

A channel that posts a one-minute clip every day uses about 269 credits a month. The smallest plan is $6 a month for 8,100 credits, and [the pricing page](https://paxalabs.com/pricing) lists the rest.

The free credits are for personal use and evaluation. Buy any plan or credit pack and the account's audio is yours to use commercially, including clips made before the purchase. A monetized channel or a client job belongs on a paid account.

## What the platforms ask you to disclose

Each platform publishes its own rule on AI-made content, and the rules change. YouTube's is a useful reference. [It asks for a disclosure](https://support.google.com/youtube/answer/14328491) in three cases. Realistic content makes a real person appear to say or do something they did not. Footage of a real event or place is altered. A realistic scene is shown that never happened.

A catalog voice reading your own script over your own footage makes no real person say anything, which is the case the rule is written around. Read the rule against any clip that shows or imitates a real person.

Paxa TTS Flash does not clone voices. Every voice in the catalog is a fixed cast member, and a new voice comes from [voice design](https://paxalabs.com/voice-design), built from a written description. Imitating a real person's voice without their consent is against [the rules every account accepts](https://paxalabs.com/responsible-ai).

### Can a channel with an AI voice be monetized?

[YouTube's channel policies](https://support.google.com/youtube/answer/1311392) allow creative tools that help deliver an original narrative. They turn away mass-produced, templated videos and videos that only read out material someone else wrote. Both tests look at the script and the edit. A channel earns on a script that is its own and adds something to the footage.

## Mistakes that give an AI voiceover away

- A number read the wrong way. Listen to every price, date, and phone number, and spell out the ones that come back wrong.
- A brand name respelled in Thai letters. Keep the name in the Latin letters its owner uses, and [a Thai voice reads it as English](https://paxalabs.com/thai-english) inside the sentence.
- Sentences with no place to breathe. Break a long sentence in two, and in Thai put a space where the pause belongs.
- A pace set too fast. A little faster holds attention. A lot faster sounds like the terms and conditions at the end of a radio ad.
- Music louder than the voice. Lower the music under the narration until every word is clear on a phone speaker.

## Next steps

- Hear a line in the demo voices on [the free text to speech page](https://paxalabs.com/tts), with no account.
- Open [the Speech tool](https://paxalabs.com/app/speech) with the free credits and voice a first clip.
- See what [creators](https://paxalabs.com/use-cases/creators) and [advertisers](https://paxalabs.com/use-cases/advertising) make with the same voices.
- Read [what a Thai voiceover costs](https://paxalabs.com/guides/thai-voice-over-cost) for studio and freelance rates beside these.

# How to transcribe a meeting, an interview, or a lecture into text

Three ways to turn a recording into text, how to record so the transcript comes out clean, and what to check before anyone relies on it.

Published 2026-10-11. Paxa Labs.

A recording is easy to make and hard to use. Nobody can search it, skim it, or quote from it without playing it back. Transcription turns the recording into text, and the text is what gets read, filed, and searched.

The work used to belong to a typist with headphones. Speech to text software now writes the first draft, and a person checks it. The job has three parts, which are recording well, choosing the right settings, and reviewing the names and numbers.

## Three ways to get a transcript

| Way | What it takes | Suits |
| --- | --- | --- |
| Type it yourself | Several times the length of the recording, since you pause and replay as you type | A short clip, or a recording nobody else may hear |
| Hire a transcriber | A quote based on the length of the recording, and a turnaround counted in days | Legal or sensitive work that needs a named person to stand behind the text |
| Speech to text software | An upload and a review pass | Meetings, interviews, lectures, and anything recorded every week |

The three combine well. Software writes the draft and a person who was in the room corrects it, which is far quicker than typing from a blank page.

## Record so the transcript comes out clean

Most transcript errors start in the room. A recording that a person strains to follow is one that software will struggle with too.

- Put the phone or recorder near the speakers. In a meeting room, the middle of the table beats the end by the projector.
- Keep away from the air conditioner and the fan. A steady hum covers the quiet ends of words.
- Ask people to speak one at a time. Two voices at once come out as one muddled line.
- Say names and figures clearly, and repeat the ones that matter. A budget read out twice gets checked twice.
- Save in a common format. MP3, WAV, FLAC, OGG, M4A, AAC, WEBM files all work.
- Split a long session at the breaks. One file can run up to 60 minutes and 25 MB.

## From file to text, step by step

1. Upload the recording: Open [the Transcribe tool](https://paxalabs.com/app/transcribe) and drop the file in, or record straight from the microphone. The cost appears before you start.
2. Choose how numbers are written: Pick Written to get digits, units, and the repetition mark, which is what minutes and reports want. Pick Spoken to keep every number in words, exactly as it was said.
3. Choose the style: Verbatim keeps every filler and false start, which a research interview or a legal record needs. Clean drops them and reads more easily, and it follows the recording less exactly.
4. Add your vocabulary: List the names, products, and jargon the recording contains, up to 50 terms. They come back spelled the way you wrote them.
5. Turn on speakers for a short recording: On a recording under 9 minutes, the transcript can come back as numbered turns, one per speaker. Nobody is identified by name.
6. Transcribe and copy: Run it, read the result beside the audio, and copy the text or download a subtitle file.

> Paxa STT Lite is a research preview. Its transcripts and its options may change between releases.

## What each kind of recording needs

| Recording | Settings | Then |
| --- | --- | --- |
| Meeting | Written numbers, Clean style, and every attendee's name in the vocabulary | Draft the minutes from the text, with decisions and owners at the top. See [meetings](https://paxalabs.com/use-cases/meetings). |
| Interview | Verbatim style, with word timestamps on | Quote exactly, and jump back to the second a quote was said. See [interviews](https://paxalabs.com/use-cases/interviews). |
| Lecture or training | Clean style, with subtitles as SRT or VTT | Post the transcript as notes and the subtitle file with the video. See [lectures](https://paxalabs.com/use-cases/lectures) and [captions](https://paxalabs.com/use-cases/captions). |
| Voice note | Written numbers | Paste the text where the note was heading. See [voice notes](https://paxalabs.com/use-cases/voice-notes). |

## What Thai recordings do differently

Thai speech sets a transcriber three problems that English does not.

- English arrives mid-sentence. A Thai speaker names a product or a technical term in English and carries on in Thai. A good transcript keeps each word in the script it was spoken in, and [the code-switching guide](https://paxalabs.com/guides/transcribing-thai-english-code-switching) shows what that does for search.
- Numbers are said in words. Whether the transcript writes the words or the digits is a setting, and [the numbers guide](https://paxalabs.com/guides/thai-transcript-numbers-spoken-or-written) covers which reader wants which.
- Words are written without spaces. A timestamp has to cover a whole word, and a subtitle line has to break between words.

## Check the transcript before anyone relies on it

A transcript is a draft until someone has read it against the audio. A full replay is rarely needed. Check the places where one wrong word changes the meaning.

- Names of people, companies, and products.
- Every figure, including amounts, dates, percentages, and phone numbers.
- Negations. One dropped word turns a refusal into an agreement.
- Who said what, when the transcript has speaker turns.
- Any passage where people talked over each other.

Word timestamps make the check quick. Find the doubtful word, play that second of the recording, and correct it. To compare two services, run the same three recordings of your own through both. [The accuracy guide](https://paxalabs.com/guides/measuring-thai-transcription-accuracy) explains how to score the result.

## What it costs

Transcription is priced by the length of the recording. Paxa STT Lite costs 8.33 credits per minute of audio. An hour is 500 credits, or $0.50.

| Recording | Length | Credits | Cost |
| --- | --- | --- | --- |
| Voice note | 10 minutes | 83.34 | $0.08 |
| Meeting | 45 minutes | 375 | $0.38 |
| Lecture | 60 minutes | 500 | $0.50 |

A new account's 100 free credits cover about 12 minutes of audio, with no card. [The pricing page](https://paxalabs.com/pricing) lists the plans.

## When the text has to appear live

A recording is transcribed after the fact. Live captions for a talk, or a voice agent that has to answer a caller, need the text while the person is still speaking. Paxa STT Lite Realtime does that over one connection, at 12.5 credits per minute of audio received. [The live transcription page](https://paxalabs.com/use-cases/live-transcription) covers it.

## Common questions

### Can I transcribe a video file?

The Transcribe tool takes audio. Export the sound from the video as an M4A or MP3 file in your editor and upload that. The subtitle file that comes back lines up with the original video, because the timing is the same.

### Does it work for languages other than Thai?

It is built for Thai first, and other languages are transcribed as they are spoken. A Thai sentence that switches into English keeps both scripts in one line.

## Before you upload a recording

Tell the people in the room that the meeting is being recorded and that a service will transcribe it. Before you upload anything confidential, read how the service handles what you send. Ours is set out in [the Privacy Policy](https://paxalabs.com/privacy) and [the Terms](https://paxalabs.com/terms).

## Next steps

- Upload a recording to [the Transcribe tool](https://paxalabs.com/app/transcribe) with the free credits.
- See a Thai recording transcribed word by word on [the transcription page](https://paxalabs.com/transcribe).
- Read [how to choose a Thai speech to text engine](https://paxalabs.com/guides/choosing-a-thai-speech-to-text-engine) before you commit to one.

# What is OCR? Turning photos, scans, and PDFs into text you can use

OCR reads the text in a photo, a scan, or a PDF and returns text a computer can search and edit. How it works, where businesses use it, and what to check.

Published 2026-10-11. Paxa Labs.

OCR, short for optical character recognition, is software that reads the text in an image. A photo of a receipt, a scanned contract, and a PDF made on a scanner are all pictures of words. A computer cannot search a picture or copy from it. OCR looks at the picture and writes the words out as text.

The idea is decades old, and for a long time it worked only on clean, typed English. What changed is the reader. A modern OCR model reads a whole page the way a person does, with its columns, tables, stamps, and mixed languages. That is why OCR now sits inside accounting, onboarding, and search tools.

## How OCR works

1. Clean up the image: The page is straightened, and shadows, noise, and uneven lighting are reduced. A crooked phone photo becomes something closer to a flat scan.
2. Find the layout: The reader works out what is on the page, such as a heading, two columns, a table, and a stamp over a signature. It also decides the order a person would read them in.
3. Read the characters: Each line is turned into letters, digits, and marks. In Thai this includes the vowels and tone marks stacked above and below the consonants.
4. Return the text: The result comes back as plain text, as Markdown that keeps the headings and tables, or as structured blocks a program can process.

Classic OCR did the third step one character at a time by matching shapes, which is why it failed on unusual fonts and poor scans. A modern model reads the line and the page together. It uses the context, the way a person reads a smudged word from the words around it.

## OCR, AI OCR, and document extraction

Three terms describe three depths of the same job.

| Term | What you get | Example |
| --- | --- | --- |
| OCR | The text on the page | A scanned letter becomes text you can search and copy |
| AI OCR, or document OCR | The text with its structure, meaning headings, paragraphs, tables, and reading order | A financial report becomes Markdown with its tables intact |
| Document extraction | The named fields you asked for, as data | A tax invoice becomes an invoice number, a date, a seller tax ID, and a total |

Extraction is the step that removes the typing. You list the fields you need, and each one comes back as a value read from the page, or empty with the reason it could not be read. [Paxa Document Extraction](https://paxalabs.com/document-extraction) does this for Thai documents.

## What businesses use OCR for

| Job | Documents | Read more |
| --- | --- | --- |
| Bookkeeping | Invoices, tax invoices, receipts, and withholding certificates | [Invoices](https://paxalabs.com/use-cases/invoices), [tax invoice fields](https://paxalabs.com/ocr/tax-invoice) |
| Customer onboarding | ID documents, house registrations, bank statements, and application forms | [Identity documents](https://paxalabs.com/use-cases/identity) |
| Legal and compliance | Contracts, company certificates, and title deeds | [Contracts](https://paxalabs.com/use-cases/contracts) |
| Archives | Old books, newspapers, and paper files | [Archives](https://paxalabs.com/use-cases/archives) |
| Search and AI assistants | Reports, manuals, and policies fed to a search index or a language model | [Knowledge bases](https://paxalabs.com/use-cases/knowledge-bases) |
| Accessibility | Any printed page, read aloud | [Read a document aloud](https://paxalabs.com/read-aloud) |

The pattern is the same in every row. A person is retyping what is already printed, and the retyping is slow and adds errors. OCR makes the page itself the source of the data.

## Why Thai is harder to read than English

English OCR matured first because English is forgiving. It puts one letter after another on one line, with a space between words. Thai breaks each of those assumptions.

- Marks stack. A Thai syllable can carry a vowel above or below the consonant and a tone mark above that. Lose one small mark and the word changes.
- Words have no spaces. A line of Thai is an unbroken string, and a reader that guesses the boundaries wrongly returns words that do not exist.
- There are two sets of digits. Official documents print Thai digits beside Arabic ones, sometimes in the same line.
- Years run on the Buddhist calendar. A document dated 2569 is from 2026, and a system that stores the year as written is off by 543 years.
- Modern fonts drop the loops. In a loopless typeface several Thai letters resemble Latin ones, such as ร and S or พ and W, and a weak reader swaps them.
- Thai and English share a line. Company names, units, and product codes sit in Latin letters inside Thai text.

A tool that passes on an English page can fail on any of these. [How to extract text from Thai PDFs and scans](https://paxalabs.com/guides/thai-pdf-text-extraction) shows what the failures look like.

## How to photograph a page for OCR

- Lay the page flat and hold the phone directly above it.
- Use even light, and keep the shadow of your hand and your phone off the page.
- Fill the frame with the page, with all four corners visible.
- Take one page per photo.
- Send the original PDF when you have it. A scan of a printout of a PDF is two steps worse than the file.

## What to check before choosing an OCR tool

Run your own worst page through it. A clean sample page tells you little, and a crumpled thermal receipt tells you a lot.

- Marks and digits. Compare a line with stacked tone marks and a line with Thai digits against the page.
- Tables. A table should come back as a table, with each number still in its column.
- Reading order. On a two-column page, the text should run down one column and then the other.
- Files. Check which formats one upload accepts, and how many pages.
- Output. Markdown suits people and language models. Structured blocks suit a program.
- Price unit. Most services charge per page, and the page count should be known before you pay.

## What OCR costs

OCR is priced by the page. Paxa OCR Lite is our own model, and it costs 6.5 credits per page, whatever is printed on it. A photo counts as one page.

| Job | Credits | Cost |
| --- | --- | --- |
| One page | 6.5 | $0.0065 |
| A 50-page report | 325 | $0.33 |
| 1,000 pages | 6,500 | $6.50 |

A new account's 100 free credits read 15 pages. One upload takes a file of up to 50 pages and 10 MB, and the formats are PDF, PNG, JPEG, WEBP.

Paxa Document Extraction costs 13 credits per page for a field list of up to 50 leaf fields, and 19.5 credits per page for a longer one. Reading the page is included.

## Common questions

### Is OCR the same as scanning?

A scanner or a phone camera makes a picture of the page, and OCR reads the picture. A scanned PDF with no OCR is a stack of images, which is why its text cannot be selected.

### Can OCR read handwriting?

Print reads far more reliably than handwriting in any OCR tool, and neat block letters read better than a hurried note. Try a few handwritten pages of your own before a workflow depends on them.

### Why does copying Thai text from a PDF come out broken?

Some PDFs are scans with no text inside. Others carry a text layer whose Thai marks come out scrambled when copied. Running OCR on the page image fixes both, and [the PDF guide](https://paxalabs.com/guides/thai-pdf-text-extraction) explains the cause.

## Try it on your own page

1. Drop in a file: Open [the Documents tool](https://paxalabs.com/app/documents) and drop in a PDF or a photo. The page count and the cost appear before anything is read.
2. Pick the output: Choose Markdown to read the result yourself, or Structured to pass it to a program.
3. Read and compare: Run it, then compare the text against the page, starting with the numbers.
4. Pull out the fields: For a tax invoice or a receipt, open [the Extract tool](https://paxalabs.com/app/extract) and start from a ready-made field list.

## Next steps

- See a Thai tax invoice read field by field on [the OCR page](https://paxalabs.com/ocr).
- Read [how to feed Thai documents to an LLM](https://paxalabs.com/guides/thai-documents-for-llms) if the text is going to a language model.
- Read [how to turn Thai PDFs into a search index](https://paxalabs.com/guides/thai-pdf-to-search-index) if it is going to search.

# Localization vs translation: Thai examples of the difference

Translation changes the language. Localization changes everything a local reader notices. See the difference on a Thai launch, from dates and money to names.

Published 2026-10-11. Paxa Labs.

Translation turns text from one language into another. Localization adapts a whole product, page, or campaign for the people of one market, and translation is one part of that work. A translated page can be correct in every sentence and still read as foreign.

The gap is easiest to see on a real market. Thailand makes a good example, because Thai differs from English in script, grammar, calendar, and manners all at once.

## The difference in one table

| English source | Translated | Localized for Thailand |
| --- | --- | --- |
| Hi Somchai, | สวัสดี สมชาย | สวัสดีค่ะ คุณสมชาย |
| March 4, 2026 | 4 มีนาคม 2026 | 4 มีนาคม 2569 |
| $19.99 | $19.99 | ฿590 |
| Buy now | ซื้อตอนนี้ | สั่งซื้อเลย |
| 0.4 acres | 0.4 เอเคอร์ | 1 ไร่ |
| Email us | ส่งอีเมลหาเรา | แอดไลน์หรือโทรหาเรา |

Every cell in the middle column is a correct translation. The right-hand column is what a Thai company would have written in the first place. The greeting gains a title and a polite particle, the year moves to the Buddhist Era, and the price is one somebody set in baht. The button uses the verb Thai shops use. Land is measured in rai, and the customer is sent to LINE or the phone.

## What localization covers

- Language and register. The words, and how polite, formal, or playful they are.
- Formats. Dates, numbers, currency, addresses, phone numbers, and units of measure.
- Names and titles. How a person is addressed in a greeting, on a form, and on an invoice.
- Layout. Line length, line breaks, fonts, and the room a script needs.
- Examples and images. The people, places, holidays, and references a reader recognizes.
- Payment and contact. The ways people in the market pay, and the channels they use to ask a question.
- Legal text. Terms, privacy notices, and disclosures that a local lawyer has read.

Translation covers the first item. The rest are decisions somebody has to make before or after the words change.

## Six places where translation stops, in Thai

### Politeness is part of the grammar

English can write a neutral sentence, and Thai cannot. Every Thai sentence picks a level of formality through its pronouns and its closing particles, and the particles differ for a male and a female speaker. A brand has to decide how it speaks, and to whom, before the first line is translated. [Translating into Thai at the right level of politeness](https://paxalabs.com/guides/thai-politeness-in-translation) goes through the choices.

### The year is 543 years ahead

Thailand counts years in the Buddhist Era, and 2026 is 2569. Receipts, contracts, and government forms print the Thai year, while software often stores the international one. A localized product shows the year its reader expects, and it says which calendar it means wherever the two could be confused.

### Borrowed words have more than one spelling

Thai borrows English words freely, and many of them have an official spelling, a newspaper spelling, and a chat spelling. A brand name can stay in Latin letters or be written in Thai script. Either choice works, and mixing the two across one product is what readers notice. [The checking guide](https://paxalabs.com/guides/checking-machine-translation-into-thai) has a table of common cases.

### Lines break between words that have no spaces

Thai is written without spaces between words. A browser or an app has to know where the words are before it can wrap a line, and a system without Thai support breaks a word in half. Thai also stacks vowels and tone marks above and below the line, and a tight line height clips them. Test every screen with real Thai text. [The word segmentation guide](https://paxalabs.com/guides/thai-word-segmentation) explains the mechanics.

### People are addressed by given name, with a title

Thais use given names in daily and business life, with the title คุณ in front. A greeting built around an English surname produces a line no Thai would write. A form needs the given name first, and a salutation needs the title.

### Idioms and jokes stay behind

An easy task is a piece of cake in English. The Thai phrase for the same idea is ปอกกล้วยเข้าปาก, peeling a banana into your mouth. A translator who knows both swaps one for the other. A literal rendering leaves the reader wondering where the cake came from.

## Transcreation, and where machine translation is enough

Slogans, ad headlines, and campaign names are written again from the brief by a copywriter in the market. The trade calls this transcreation, and it is priced as creative work.

Most of a product is a different kind of text. Help articles, product listings, interface text, and support replies carry facts, and they change every week. Machine translation with a clear brief and a human check does this work well, and waiting days for each update is hard to justify.

Legal documents sit apart. A contract or an official filing may need a certified human translation, and [the translation cost guide](https://paxalabs.com/guides/thai-translation-cost) covers what that costs.

## Write a brief the translator can use

A human translator and a translation model fail the same way when nobody tells them who the reader is. A one-page brief fixes most of it.

1. Name the reader and the register: State who reads the text and how the brand speaks to them. In the Translate tool this is the Register setting, with Formal and Casual.
2. List your terms: Give the Thai rendering you want for each product term. The Glossary holds the pairs and applies them every time.
3. Protect what must stay as written: Brand names, product codes, and legal names go under Keep as written and come back untouched.
4. Decide on borrowed words: Choose whether English loanwords are written in Thai script or kept in the original, and hold that choice across the product.
5. Give the context: Say where the text appears, such as a checkout button, a push notification, or a help article. Add a character limit where space is tight.
6. Show an approved example: Two or three lines of Thai copy the brand has already signed off are worth more than a paragraph of instructions.

[The Translate tool](https://paxalabs.com/app/translate) takes each part of that brief as a setting. Paxa Translate Lite translates into Thai from 14 source languages you can name, or detects the language itself. It also marks a result that deserves a second look, such as a glossary term that went missing.

## What translating into Thai costs

Paxa Translate Lite is priced by the character, and a request is billed at two rates.

| What is counted | Rate |
| --- | --- |
| Text that is translated | 25 credits per 1,000 characters |
| Reference material the model reads, such as context, a glossary, and instructions | 8 credits per 1,000 characters |

A standard page of 1,800 characters costs 45 credits to translate, which is $0.05. A new account's 100 free credits translate about 2 pages, and [the pricing page](https://paxalabs.com/pricing) lists the plans.

## Common questions

### What do l10n and i18n mean?

Both are abbreviations. L10n is localization, with ten letters between the l and the n. I18n is internationalization, the engineering work that lets a product show any language, date format, and currency without a rewrite. Internationalization comes first, and localization follows for each market.

### Can the Translate tool translate out of Thai?

Paxa Translate Lite translates into Thai only. Text going from Thai into another language needs a different service.

## A checklist before a Thai launch

- The register is chosen, with the brand's pronouns and particles written down.
- A glossary of product terms is agreed, with one spelling for each borrowed word.
- Dates show the Buddhist Era wherever a Thai reader expects it.
- Prices are set in baht.
- Greetings and forms use given names with a title.
- Every screen has been checked with real Thai text for broken lines and clipped marks.
- A Thai reader has read the main pages from start to finish.
- A Thai lawyer has reviewed the terms and the privacy text.

## Next steps

- Paste a paragraph into [the Translate tool](https://paxalabs.com/app/translate) and set the register.
- Read [what machine translation into Thai gets wrong](https://paxalabs.com/guides/checking-machine-translation-into-thai) for a review a team without a Thai reader can run.
- See how [e-commerce](https://paxalabs.com/use-cases/ecommerce), [support](https://paxalabs.com/use-cases/support), [travel](https://paxalabs.com/use-cases/travel), and [games and apps](https://paxalabs.com/use-cases/games-apps) teams translate into Thai.

# Realtime Thai transcription, and where a turn ends

Thai writes no full stop, and a live transcriber has to decide where the speaker finished anyway. What a turn is, what interim text is for, and what a live session costs.

Published 2026-09-24. Paxa Labs.

Thai does not close a sentence with a mark. The writing puts spaces at phrase and clause breaks and runs the rest together, and speech carries no punctuation at all. A transcriber working on a finished recording can read the whole file before it commits to anything. A transcriber working live has to commit while the person is still talking.

Paxa STT Lite Realtime settles that by working in turns. The socket watches the audio, decides where a stretch of speech ended, and sends one finished transcript for it. What follows covers the turn itself, why Thai makes the boundary awkward, what the interim text before it is good for, and what a session costs.

## What a turn is

A turn is one continuous stretch of one speaker's audio, bounded by the moment they started and the moment they stopped. The socket announces both. Between them it sends interim transcripts, each a fuller draft of the same turn. After the end it sends one final transcript, and the final is the text a program acts on.

A caller can always take words as they are recognized and decide for itself where a thought landed. That decision is the hard part of a live pipeline, and in Thai it is harder than the recognition.

turn 2:

```
speech_started  turn 2
transcript      turn 2  interim  ผม
transcript      turn 2  interim  ผมโอนไปแล้ว
transcript      turn 2  interim  ผมโอนไปแล้วเมื่อเช้า
speech_ended    turn 2
transcript      turn 2  final    ผมโอนไปแล้วเมื่อเช้านี้ครับ
```

The word that arrives last in that turn is ครับ, and it carries no information about the payment at all. It marks that the speaker is done. An agent acting on the third interim would have answered a sentence that was still being built.

## Where Thai makes the boundary awkward

Three properties of Thai speech work against an endpoint rule written for English.

- There is no full stop. A Thai sentence ends because it is finished, and the page marks that with a space at most. A rule waiting for a terminal mark waits forever.
- A polite utterance closes on a word. ครับ and ค่ะ end a turn, and so do นะคะ and แล้วครับ. They arrive after the content, which means the informative half of the sentence is complete before the speaker is.
- A pause lands at a phrase break. Thai puts its spaces between phrases, and a speaker stops at those same places in the middle of a sentence. The gap sits well short of the end of the thought.

The third one is what breaks a boundary rule built on silence alone. The cut lands between a noun and its classifier, or between a verb and the amount it governs. Each half of the split reads as a fragment that means less than the sentence did, and a downstream model answers the fragment it was handed.

Code-switching sharpens the same problem. Thai speakers switch into English inside a clause. Any gap that opens around the English word sits in the middle of a sentence that is still running. The transcript has to keep both scripts in one line and count that gap as part of the turn.

## What the interim text is for

Interim transcripts are drafts. Each one replaces the one before it, and any of them can change as more audio arrives. Put them on a screen where a person is watching a caption move. Keep them out of anything that acts: a booking made from an interim transcript is a booking made from half a sentence.

The final transcript is the commitment. It carries the turn number, the text, and where the turn sat in the audio. A voice agent answers on the final. A supervisor's keyword alert fires on the final. A live caption paints the interims and settles on the final.

> A turn boundary is also the signal to stop talking. The moment the socket reports speech_started, a voice agent cancels the reply it is speaking, which is how a caller talks over an assistant and is heard.

## What a live session costs

Billing follows the audio the socket receives, silence included, at 12.5 credits a minute. The connection is cut into periods at each turn and charged as it runs, which is what lets a long session report a running total. A turn the model fails to transcribe costs nothing, and the total reported already accounts for it.

In the request log the whole connection is one line, whatever it took in turns. Periods are how the money is counted; the session is what the caller asked for.

A recording that already exists belongs on the buffered endpoint. Paxa STT Lite takes a file up to 60 minutes, answers once with the whole transcript, and costs less a minute because nothing has to keep pace with a speaker.

## Opening the socket

One start frame names the model and the audio encoding. Everything after it is binary audio going up and events coming down, on a connection that stays open for the conversation.

TypeScript:

```typescript
import { open } from "node:fs/promises";

// Runs on Bun as-is; on Node, `import WebSocket from "ws"` accepts
// the same constructor options. Browsers cannot send this header, and
// API keys never ship to browsers anyway: relay the audio through your
// server.
const socket = new WebSocket("wss://api.paxalabs.com/v1/stt/live", {
  headers: { Authorization: `Bearer ${process.env.PAXA_API_KEY}` },
});

socket.onopen = async () => {
  socket.send(JSON.stringify({
    type: "start",
    model: "paxa-stt-lite-realtime-v1-preview",
    audio: { encoding: "pcm_s16le", sample_rate: 16000 },
    language: "th",
  }));
  // 16 kHz signed 16-bit mono is 32,000 bytes a second. A microphone
  // delivers frames at this pace on its own; a file has to be paced.
  const file = await open("caller.pcm");
  const frame = new Uint8Array(640); // 20 ms
  for (;;) {
    const { bytesRead } = await file.read(frame, 0, frame.length);
    if (bytesRead === 0) break;
    socket.send(frame.subarray(0, bytesRead));
    await new Promise((resolve) => setTimeout(resolve, 20));
  }
  socket.send(JSON.stringify({ type: "end" }));
};

socket.onmessage = (event) => {
  const message = JSON.parse(String(event.data));
  switch (message.type) {
    case "speech_started":
      // The user is talking: stop the agent's audio, cancel its reply.
      break;
    case "transcript":
      if (message.is_final) console.log(`turn ${message.turn}: ${message.text}`);
      break;
    case "done":
      socket.close();
  }
};
```

Python:

```python
import json
import os
import time

from websockets.sync.client import connect  # pip install websockets

with connect(
    "wss://api.paxalabs.com/v1/stt/live",
    additional_headers={"Authorization": f"Bearer {os.environ['PAXA_API_KEY']}"},
) as socket:
    socket.send(json.dumps({
        "type": "start",
        "model": "paxa-stt-lite-realtime-v1-preview",
        "audio": {"encoding": "pcm_s16le", "sample_rate": 16000},
        "language": "th",
    }))
    # 16 kHz signed 16-bit mono is 32,000 bytes a second; a file has to
    # be paced the way a microphone paces itself.
    with open("caller.pcm", "rb") as audio:
        while frame := audio.read(640):  # 20 ms
            socket.send(frame)
            time.sleep(0.02)
    socket.send(json.dumps({"type": "end"}))

    for message in socket:
        event = json.loads(message)
        if event["type"] == "transcript" and event["is_final"]:
            print(event["turn"], event["text"])
        elif event["type"] == "done":
            break
```

Server events:

```json
{"type":"started","connection":"7d9c2b7e-4a41-4c8e-9a35-1f26d8c04b7a","model":"paxa-stt-lite-realtime-v1-preview"}
{"type":"speech_started","turn":1,"time":0.3}
{"type":"speech_ended","turn":1,"time":12.252}
{"type":"charged","seq":1,"seconds":12.252,"credits":2.56,"total_credits":2.56}
{"type":"transcript","turn":1,"is_final":true,"text":"สวัสดีค่ะคุณสมชายยอดชำระของท่านจำนวน พันสองร้อยห้าสิบ บาทครบกำหนดวันที่ สิบห้า สิงหาคมนี้ชำระผ่านแอปได้ตลอด ยี่สิบสี่ ชั่วโมงค่ะ","start":0.3,"end":12.252}
{"type":"done","total_seconds":12.252,"turns":1,"total_credits":2.56}
```

## Next steps

- Read the [realtime reference](https://paxalabs.com/docs/api/stt-live) for the frames, the events, and the close codes.
- Read the [transcription guide](https://paxalabs.com/docs/speech-to-text) for the options a start frame carries.
- Read the [live transcription segment](https://paxalabs.com/use-cases/live-transcription) for what a session costs at a call-centre workload.
- Open the [transcribe tool](https://paxalabs.com/app/transcribe) and switch to live mode. The browser relays its microphone and each turn lands as it closes.

# How to choose a Thai speech to text engine

Seven properties to test on your own Thai audio before an accuracy figure enters the conversation, from word spans to what a failure costs.

Published 2026-09-10. Paxa Labs.

Most speech-to-text comparisons open with an accuracy figure and close there. For Thai that is a weak place to start. The figure depends on a tokenizer the language does not supply, and the properties that decide whether a transcript is usable are mostly about something else. An engine can hear a Thai sentence correctly and still hand back something no product can build on.

This post is a test plan. Record thirty minutes of the audio you actually have, run it through each candidate, and check seven things. Every one of them can be answered from a single response. No engine is named here, ours included, and no figure is quoted.

## 1. Word spans on whole words

Ask for word timestamps and look at what came back. Some engines time Thai one character at a time, because the writing system offers no other boundary. Character spans are technically timestamps and practically unusable: a subtitle cue cut on them breaks mid-word, a read-along player highlights a consonant, and a search result opens on a fragment.

the same phrase, timed two ways (illustrative seconds):

```
ประชุมวันพฤหัส

per word         ประชุม  0.42-0.86    วัน  0.86-1.02
                 พฤหัส   1.02-1.48

per character    ป 0.42-0.47   ร 0.47-0.51   ะ 0.51-0.55
                 ช 0.55-0.61   ุ 0.61-0.64   ม 0.64-0.86
```

The engine that returns the first shape has segmented the sentence. The engine that returns the second has passed the problem to you. Solving it afterwards means running a segmenter over the transcript and mapping its output back onto character times.

## 2. A stated number convention

A speaker says a figure aloud. A transcript can write it the way it was said or the way a document prints it, and the two are different strings. A search index wants one, a subtitle file wants the other, and a claims system wants digits it can parse. Check whether the engine offers the choice, or whether it picks for you and leaves the conversion as your problem.

Test it with a recording that carries a price, a date, a phone number, and a percentage in the same minute. That is one ordinary Thai sentence in a call centre, and it exercises every rule at once.

## 3. Thai that turns English

Thai speakers name products, technical terms, and brands in English mid-sentence without pausing. Send a recording that does this and read the line back. Three failures are worth looking for. The English word can arrive transliterated into Thai script, the Thai around it can be dropped, and the word spans can lose their seconds across the switch.

## 4. Speaker turns, if you need them

Two people on a call, or four in a meeting. Check that the turns are numbered consistently, that a speaker who returns after a gap keeps their number, and what happens to the word spans when both speakers and timestamps are on. Check the length ceiling too. Marking who spoke when reads a recording whole, and that work usually carries a shorter limit than plain transcription.

## 5. Your own names

Every product has words no general model has heard: part numbers, place names, a brand spelled a particular way. Check whether the engine takes a term list, how many terms it takes, and whether the spelling holds across separate requests. A list of 50 terms covers most working vocabularies. A list that silently truncates covers none of them predictably.

## 6. The ceilings, before you build

Length per request, bytes per file, and the containers accepted. These decide the shape of your pipeline more than accuracy does. An engine that takes an hour in one call and one that takes ten minutes are two different integrations, and finding that out after the code is written is expensive.

Check also whether the format is read from the bytes or declared by you. Declared formats mean every upload path in your product has to sniff and label the file correctly before it can send it.

## 7. What a failure costs

Send a corrupt file, a silent file, and a file past the length ceiling. A refusal before any charge is the behaviour you want, with a code that says which of the three happened. Then check what a failure after the charge does. An engine that bills for a request it could not complete turns every bad upload in your product into a small loss.

## Then measure accuracy

With the seven answered, score the candidates that are left. Do it over characters, on your own references, with the normalization rules written down. The accuracy post covers how, and the short version is that a figure nobody can reproduce is not a figure.

## Where we stand

Paxa STT Lite answers the seven this way. Word spans cover whole Thai words. A spoken or a written convention comes on request. Thai and English share one line. Speaker turns are available on shorter recordings, and a term list is accepted. Recordings run to 60 minutes with the container read from the bytes, and a request that fails is not charged. No accuracy figure is published until the method is published beside it.

## Next steps

- Read the [speech-to-text guide](https://paxalabs.com/docs/speech-to-text) for the request fields the seven checks above use.
- Read [why word error rate misleads on Thai transcripts](https://paxalabs.com/guides/measuring-thai-transcription-accuracy) before scoring anything.
- Read [what ASR means for Thai](https://paxalabs.com/asr) for the properties of the language behind these checks.
- Open the [transcribe tool](https://paxalabs.com/app/transcribe) and run your own thirty minutes.

# Transcribing Thai that switches into English

Thai speakers name products and actions in English without leaving the sentence. What that does to a transcript, its word timings, and a search index.

Published 2026-09-10. Paxa Labs.

Listen to any Thai office call and count the English. A support agent says cancel and order. An engineer says deploy and staging. A doctor, a lawyer, and a mechanic each keep a working vocabulary of English words inside otherwise ordinary Thai sentences. Code-switching between Thai and English is documented in Thai public speech, and it is the norm in the recordings a Thai product actually collects.

This is a transcription problem before it is a language problem. The sentence has one meaning and two scripts, and an engine has to decide what to write down. This post is about that decision, and about the three shapes a transcript can take.

## Three shapes, one sentence

Take one line a support agent might say. There are three ways it comes back.

one line, three transcripts:

```
spoken     ลูกค้า cancel order ไปแล้วตั้งแต่เมื่อวาน

romanised  luk kha cancel order pai laeo tang tae muea wan
phonetic   ลูกค้า แคนเซิล ออร์เดอร์ ไปแล้วตั้งแต่เมื่อวาน
as spoken  ลูกค้า cancel order ไปแล้วตั้งแต่เมื่อวาน
```

The romanised shape loses the Thai. The phonetic shape spells the English words in Thai script, which is what somebody typing quickly might do and what a model trained mostly on Thai will default to. Both are readable by a person and useless to a search index: a customer searching for cancel finds nothing, because the transcript spells it แคนเซิล.

The third shape keeps each word in the script it was spoken in. It is the only one where a search for either language finds the line, and the only one where the English terms match the strings already in your database.

## What it does to word timings

Word spans have a harder job across a switch. Thai carries no spaces. The engine has to find the boundary between the last Thai word and the first English one from the sound alone, with no orthographic hint on either side. An engine that segments Thai well and then fumbles the handover produces spans that drift by a word around every switch.

Check it on a recording of your own. Ask for word timestamps, find a switch, and play the two seconds around it against the spans. A subtitle cut from drifting spans shows the English word one cue early, which is the sort of error a viewer notices immediately.

## Pinning your own terms

Product names are the hard case, because they are English words the model has no reason to expect. A term list solves it. Send the names your recordings actually contain, up to 50 terms. The spelling then holds across every request, however clearly each speaker said it.

Keep the list to names that are genuinely ambiguous by ear. A list of common words does nothing. A list that runs past the ceiling is refused outright, with no quiet trimming, which is the behaviour you want when a database generates the list.

## The convention still applies

Numbers inside a switched sentence follow the convention you asked for, in whichever language they were said. An order number read out in English digits and a price said in Thai land in the same transcript under one rule, which is what makes the line parseable afterwards.

## What the model does

Paxa STT Lite writes each word in the script it was spoken in, and times whole words on both sides of a switch. It publishes no accuracy figure until the evaluation method is published beside it. The way to settle this for your own recordings is to run a few of them.

## Next steps

- Read the [speech-to-text guide](https://paxalabs.com/docs/speech-to-text) for the vocabulary and convention fields.
- Read the [transcription API reference](https://paxalabs.com/docs/api/stt) for the request shape.
- Read [what ASR means for Thai](https://paxalabs.com/asr) for the three properties of the language behind this one.
- The source for the pattern is [code-switching between Thai and English in young Thai politicians' speeches](https://so02.tci-thaijo.org/index.php/hasss/article/view/260788), HASSS 23(2), 2023.

# How a Thai transcript writes numbers, spoken or written

Thai says every number in words. A transcript can keep the words or turn them into digits, and each reader needs a different one. Which convention to ask for, and when.

Published 2026-09-09. Paxa Labs.

Thai speech carries numbers as words. A price is said as สองพันสามร้อยห้าสิบบาท, a date as สิบห้ามกราคม, and a time as เก้าโมงครึ่ง. A person writing the same line on a page turns each into digits without thinking about it. A transcription model has to be told which of the two it is writing, because both are correct and each serves a different reader.

Paxa STT Lite calls the two forms conventions. The spoken convention writes what was said. The written convention writes what a page would show. This post shows the difference on five lines, then says which readers need which, and how to ask for each one.

## The same five lines, twice

| Spoken | Written |
| --- | --- |
| ยอดรวม สองพันสามร้อยห้าสิบบาท | ยอดรวม 2,350 บาท |
| นัดวันที่ สิบห้า มกราคม | นัดวันที่ 15 มกราคม |
| ลดราคา ยี่สิบเปอร์เซ็นต์ | ลดราคา 20% |
| ประชุมเวลา เก้าโมงครึ่ง | ประชุมเวลา 9:30 |
| เด็ก ๆ ไปกันหมดแล้ว | เด็ก ๆ ไปกันหมดแล้ว |

The first four rows change. Amounts become grouped digits with the unit kept as a word. A date keeps the month as a word and the day as a digit. A percentage becomes the sign. A clock time becomes hours and minutes with a colon. The fifth row is the same in both, and the reason is worth a paragraph.

Thai repeats a word to mark plurality or emphasis, and the page writes the repetition with one mark, ๆ. Speech has no mark. It says the word twice. The written convention keeps the mark where a page would print it. The spoken convention keeps the word as said, and here the two forms happen to agree.

## Who needs which

A subtitle needs the spoken form. The viewer hears the words and reads the words, and a digit on screen while the speaker says four syllables reads as a mismatch. A verbatim record for a newsroom or a court needs the spoken form for the same reason. The transcript is evidence of what was said.

A language model reading the transcript usually wants the spoken form too. The model reads Thai number words as fluently as digits, and the spoken form keeps the sentence as one Thai sentence. A prompt that asks the model to extract the amount gets the same answer either way.

A record that will be searched, filed, or matched by a rule needs the written form. A collections rule matches on 3,500. A meeting note that lists a deadline wants 15 มกราคม. A dictated letter wants to read as a letter. Anything that ends up in a table or a form wants digits.

The two forms come from the same recording and the same request. Ask for both when the transcript has two readers. A call transcript can be filed under the written form and shown to a QA reviewer under the spoken one.

## Asking for each one

The spoken convention is the default. Send `convention` as `"written"` for the other. Word timestamps are the same under both, because the timing belongs to the audio and the convention belongs to the text.

curl:

```bash
AUDIO=$(base64 < meeting.m4a | tr -d '\n')
curl -X POST https://api.paxalabs.com/v1/stt \
  --max-time 300 \
  -H "Authorization: Bearer $PAXA_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"audio\": \"$AUDIO\", \"model\": \"paxa-stt-lite-v1-preview\", \"convention\": \"written\"}"
```

Response:

```json
{
  "text": "สวัสดีค่ะคุณสมชายยอดชำระของท่านจำนวน 1,250 บาทครบกำหนดวันที่ 15 สิงหาคมนี้ชำระผ่านแอปได้ตลอด 24 ชั่วโมงค่ะ",
  "usage": {
    "seconds": 11.952,
    "credits": 1.66
  }
}
```

One more detail matters for a written transcript. A figure that reaches digits is read from the words the model heard, and Thai says large numbers in a fixed order of thousands, hundreds, tens, and units. A number said in an unusual order stays as words. Check the written form against the audio at the second the figure was said, which word timestamps give you for nothing.

## Next steps

- Read the [transcription guide](https://paxalabs.com/docs/speech-to-text#conventions) for the two conventions beside the model's own reading of one recording.
- Read the [reference](https://paxalabs.com/docs/api/stt) for the `convention` field and the response shape.
- Read the [subtitles post](https://paxalabs.com/guides/thai-subtitles-from-word-timestamps) for building cues from word timestamps under the spoken convention.
- Open the [transcribe tool](https://paxalabs.com/app/transcribe) and run one recording under both conventions. The two transcripts sit side by side with the differing words marked.

# Why word error rate misleads on Thai transcripts

Word error rate needs word boundaries, and Thai writes none. How to score a Thai transcript so two models can be compared, what to normalize first, and how to build a test set from your own audio.

Published 2026-09-09. Paxa Labs.

Every speech-to-text vendor publishes a word error rate, and for Thai the number means less than it looks. Word error rate counts substituted, deleted, and inserted words between a reference transcript and the model's output, divided by the words in the reference. The count needs a word boundary. English puts a space at each one. Thai puts a space at the end of a phrase and nowhere else, and where one word ends inside a phrase is a decision a tokenizer makes.

This post is about scoring a Thai transcript in a way two models can be compared on. It covers what the tokenizer does to the number, which metric to use instead, what to normalize before counting, and how to build a test set from the audio you already have. It gives no figure for any model, including ours. A figure without the method beside it is the problem the post is about.

## What the tokenizer does to the number

Take one reference line and one hypothesis that differs by a single syllable. Score it under two common Thai tokenizers. One treats งบประมาณ as a word, the other splits it into งบ and ประมาณ. The same mistake produces a different word error rate under each, and neither is wrong.

one error, three scores:

```
reference    วันนี้ประชุมเรื่องงบประมาณปีหน้า
hypothesis   วันนี้ประชุมเรื่องงบประมานปีหน้า

tokenizer A  วันนี้ | ประชุม | เรื่อง | งบประมาณ | ปีหน้า      5 words
tokenizer B  วัน | นี้ | ประชุม | เรื่อง | งบ | ประมาณ | ปี | หน้า   8 words

one wrong syllable in งบประมาณ
  WER under A   1 / 5  = 20%
  WER under B   1 / 8  = 12.5%
  CER           1 / 32 = 3.1%
```

A published word error rate for Thai therefore carries a hidden variable. Two vendors scored with two tokenizers cannot be compared, and a single vendor's number cannot be reproduced without the tokenizer named. A tokenizer that splits more finely lowers the number for everyone.

## Character error rate

Character error rate counts the same three operations over characters. Thai characters have boundaries. The count is the same on every machine and needs no tokenizer. It is the metric most Thai speech research reports, and it is the one to ask a vendor for when a word error rate is quoted.

A character error rate is smaller than the word figure for the same transcript, because an error touches one character in a word of several. The scale is different and the comparisons still hold, as long as both models are scored the same way on the same references.

Character error rate has one blind spot. A tone mark or an upper vowel written in the wrong order is a character error even when the rendered word looks right. Normalize the Unicode order of both texts before counting, and the blind spot closes.

## Normalize before you count

A transcript and a reference disagree in ways that are conventions, and a score that counts them measures the convention. Decide each one before scoring and apply the same rule to both sides.

- Numbers. A reference written with digits and a hypothesis written with number words differ by every character of the number. Choose one form. The transcription API writes either on request, and the spoken form matches a reference typed from the audio.
- Spaces. Thai spacing between phrases is inconsistent between two typists. Remove every space before counting, or count spaces separately as their own figure.
- The repetition mark. ๆ and the word written twice are the same speech. Expand the mark on both sides.
- Punctuation and case in English words. A Thai sentence that switches into English carries English conventions with it. Lowercase and strip punctuation on both sides.
- Filler words. A verbatim reference keeps เอ่อ and a clean one drops it. Score verbatim output against a verbatim reference. A clean style is a readability choice and scores worse against a verbatim reference by construction.

## Build the test set from your own audio

A vendor's test set sounds like the vendor's data. Yours sounds like your calls, your meetings, or your lectures, with your product names and your speakers. Fifty recordings of two to five minutes each, chosen to cover the speakers, rooms, and topics you have, is a test set a model can be judged on.

Have the reference typed by a person listening to the audio, under a written rule for each item in the list above. Have a second person check a sample. A reference with a five percent error rate of its own cannot resolve a difference of two points between two models.

Keep the references and the audio together and score every candidate model on the whole set with one script. Report the character error rate, the normalization rules, and the size of the set. A reader with all three can reproduce the number, and a number a reader can reproduce is one they can trust.

## What we publish

Paxa STT Lite publishes no accuracy figure of its own. The evaluation method comes first, and a figure follows only beside the set and the rules that produced it. Until then, the recording on the product page and the transcribe tool are the way to judge the model on audio you choose.

## Next steps

- Read the [transcription guide](https://paxalabs.com/docs/speech-to-text) for the conventions and the style option that the normalization rules above depend on.
- Read the [numbers post](https://paxalabs.com/guides/thai-transcript-numbers-spoken-or-written) for how the spoken and written conventions differ, line by line.
- Open the [transcribe tool](https://paxalabs.com/app/transcribe) and run a few of your own recordings before writing a single reference.

# Speaker turns in a Thai call transcript

A call transcript with two voices in one column is a puzzle. How diarization numbers the speakers, how a pipeline turns the numbers into roles, and what the numbers never claim.

Published 2026-09-09. Paxa Labs.

A recorded call has two voices and one audio track. A transcript of it in one column reads as a monologue, and every question a QA reviewer asks starts with who said that. Did the agent give the required notice, or did the customer read it back? Who mentioned the refund first? Diarization answers the first question, and the pipeline built on it answers the rest.

This post covers what Paxa STT Lite returns when diarization is on, how to map its speaker numbers to the roles on a call, and where the numbers stop. It ends with the shape of a QA check that runs on every call, with no sampling.

## What comes back

Send the recording with `diarization` set to `true`. The response carries the transcript as before, and a `segments` array beside it. Each segment is one turn with a speaker number, its text, and its start and end in seconds. Speakers are numbered from 0 in order of first appearance, and the numbers hold for the whole recording.

curl:

```bash
AUDIO=$(base64 < meeting.m4a | tr -d '\n')
curl -X POST https://api.paxalabs.com/v1/stt \
  --max-time 300 \
  -H "Authorization: Bearer $PAXA_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"audio\": \"$AUDIO\", \"model\": \"paxa-stt-lite-v1-preview\", \"diarization\": true}"
```

Response:

```json
{
  "text": "สวัสดีค่ะคุณสมชายยอดชำระของท่านจำนวน พันสองร้อยห้าสิบ บาทครบกำหนดวันที่ สิบห้า สิงหาคมนี้ชำระผ่านแอปได้ตลอด ยี่สิบสี่ ชั่วโมงค่ะ",
  "segments": [
    {
      "speaker": 0,
      "text": "สวัสดีค่ะคุณสมชายยอดชำระของท่านจำนวน พันสองร้อยห้าสิบ บาทครบกำหนดวันที่ สิบห้า สิงหาคมนี้ชำระผ่านแอปได้ตลอด ยี่สิบสี่ ชั่วโมงค่ะ",
      "start": 0.12,
      "end": 11.66
    }
  ],
  "usage": {
    "seconds": 11.952,
    "credits": 1.66
  }
}
```

Ask for word timestamps in the same request and every word carries its speaker number too. The turns give you the shape of the conversation, and the words give you the second inside a turn where a phrase was said.

four turns of a two-party call:

```
speaker 0   0.0s   สวัสดีค่ะ ฝ่ายบริการลูกค้า ยินดีให้บริการค่ะ
speaker 1   3.2s   สวัสดีครับ โทรมาเรื่องบิลเดือนนี้ครับ
speaker 0   6.1s   ขอทราบเลขที่บัญชีสี่ตัวท้ายด้วยค่ะ
speaker 1   8.9s   สี่ห้าหกเจ็ดครับ
```

## From numbers to roles

The model numbers voices. It attaches no name, no role, and no identity. On a two-party call the mapping from number to role is yours, and three rules cover most contact centres.

- The first voice is the agent. An inbound call opens with the greeting the agent is scripted to say. Speaker 0 is the agent whenever the first turn matches the greeting.
- The greeting names the role. When the first turn fails to match, search the first three turns for the scripted phrase and take that speaker as the agent.
- Two channels make it certain. A telephony system that records the agent and the customer on separate channels can send each channel as its own file. The role is then the file, and diarization within each file catches a transfer or a supervisor joining.

A call with a third voice, a supervisor or a transfer, arrives as speaker 2. A rule that expects two speakers should treat a third as a flag for review, since the conversation changed shape.

## A QA check on every call

With roles assigned, a script check is a set of string matches on the agent's turns. The greeting, the identity check, the hold notice, and the closing line each become a phrase the agent's turns must contain, with the second it was said. A call that misses one is the call a reviewer listens to.

Keyword alerts run on the customer's turns. The words for refund, cancel, and complaint, and the names of competitors, raise a call within minutes of it ending. A vocabulary of up to 50 product and plan names keeps their spelling the same across thousands of calls, which is what a string match needs.

Talk ratio is the third figure the turns give for free. Sum the seconds of each speaker's turns. An agent who speaks for eighty percent of a complaint call is a coaching conversation, and the figure comes from the segments array with no listening at all.

## Where the numbers stop

A diarized recording is read whole before the response returns, and a long call takes longer than a short one. Plan for the response to take tens of seconds on a long recording and send calls in parallel. The concurrency your plan allows is the number of calls in flight at once.

That one pass is also where the length stops. A diarized request takes a call under 9 minutes, well below the 60 minutes a plain transcript accepts, and a longer one answers [400 diarization_audio_too_long](https://paxalabs.com/docs/errors#diarization_audio_too_long) before any charge. Split it at a silence and send the parts in parallel. Speaker numbers restart in each part. Map roles per part with the same rules. Diarization changes no charge. The recording bills by its length, and the turns ride along.

## Next steps

- Read the [speakers section of the guide](https://paxalabs.com/docs/speech-to-text#speakers) for the response shape beside the model's own turns on one recording.
- Read the [reference](https://paxalabs.com/docs/api/stt) for the `segments` and `words` fields.
- Read the [call recordings use case](https://paxalabs.com/use-cases/call-recordings) for a QA pipeline as a wire log and what a month of calls costs.
- Open the [transcribe tool](https://paxalabs.com/app/transcribe), turn on Speakers, and run one call to see the turns laid out.

# Thai subtitles from word timestamps

A Thai sentence has no spaces to cut a subtitle at. How word timestamps give a cue its cut points, the rules a Thai cue file needs, and the convention to ask for.

Published 2026-09-09. Paxa Labs.

A subtitle is a transcript cut into pieces that fit on a screen for the seconds they are spoken. In English the cutting is easy. A cue ends at a space, and a tool that knows nothing about the language produces readable lines. Thai writes a whole phrase as one run of characters. A tool that cuts at a character count cuts through a word, and the viewer reads half a word on one line and the other half two seconds later.

This post shows how to build Thai cues from the word timestamps Paxa STT Lite returns. Each span is a whole Thai word with its start and end, which is exactly the set of places a cue may be cut. The rules for turning spans into cues fit on one page, and the result is a subtitle file any player reads.

## What a span is

Ask for `timestamps` set to `"word"` and the response carries a `words` array beside the transcript. Each entry is one word with its start and end in seconds. For Thai the words are segmented on the way out. A span covers a whole word and never a character. The spans join back into the transcript with nothing lost.

curl:

```bash
AUDIO=$(base64 < meeting.m4a | tr -d '\n')
curl -X POST https://api.paxalabs.com/v1/stt \
  --max-time 300 \
  -H "Authorization: Bearer $PAXA_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"audio\": \"$AUDIO\", \"model\": \"paxa-stt-lite-v1-preview\", \"timestamps\": \"word\"}"
```

Response:

```json
{
  "text": "สวัสดีค่ะคุณสมชายยอดชำระของท่านจำนวน พันสองร้อยห้าสิบ บาทครบกำหนดวันที่ สิบห้า สิงหาคมนี้ชำระผ่านแอปได้ตลอด ยี่สิบสี่ ชั่วโมงค่ะ",
  "words": [
    {
      "text": "สวัสดี",
      "start": 0.12,
      "end": 0.44
    },
    {
      "text": "ค่ะ",
      "start": 0.52,
      "end": 0.66
    },
    {
      "text": "คุณ",
      "start": 1.08,
      "end": 1.24
    },
    {
      "text": "สมชาย",
      "start": 1.32,
      "end": 1.88
    },
    {
      "text": "ยอด",
      "start": 2.36,
      "end": 2.56
    },
    {
      "text": "ชำระ",
      "start": 2.6,
      "end": 2.879
    },
    {
      "text": "ของ",
      "start": 3,
      "end": 3.14
    },
    {
      "text": "ท่าน",
      "start": 3.2,
      "end": 3.359
    },
    {
      "text": "จำนวน",
      "start": 3.48,
      "end": 3.879
    },
    {
      "text": "พันสองร้อยห้าสิบ",
      "start": 4.24,
      "end": 5.4
    },
    {
      "text": "บาท",
      "start": 5.56,
      "end": 5.759
    },
    {
      "text": "ครบ",
      "start": 6.32,
      "end": 6.52
    },
    {
      "text": "กำหนด",
      "start": 6.56,
      "end": 6.84
    },
    {
      "text": "วัน",
      "start": 6.92,
      "end": 7.039
    },
    {
      "text": "ที่",
      "start": 7.04,
      "end": 7.119
    },
    {
      "text": "สิบห้า",
      "start": 7.24,
      "end": 7.48
    },
    {
      "text": "สิงหาคม",
      "start": 7.68,
      "end": 8.26
    },
    {
      "text": "นี้",
      "start": 8.36,
      "end": 8.5
    },
    {
      "text": "ชำระ",
      "start": 9.08,
      "end": 9.36
    },
    {
      "text": "ผ่าน",
      "start": 9.48,
      "end": 9.68
    },
    {
      "text": "แอป",
      "start": 9.76,
      "end": 9.92
    },
    {
      "text": "ได้",
      "start": 10,
      "end": 10.14
    },
    {
      "text": "ตลอด",
      "start": 10.2,
      "end": 10.46
    },
    {
      "text": "ยี่สิบสี่",
      "start": 10.56,
      "end": 10.96
    },
    {
      "text": "ชั่วโมง",
      "start": 11.08,
      "end": 11.4
    },
    {
      "text": "ค่ะ",
      "start": 11.52,
      "end": 11.66
    }
  ],
  "usage": {
    "seconds": 11.952,
    "credits": 1.66
  }
}
```

## Cutting spans into cues

Walk the spans in order and collect them into a cue until one of three limits is reached. The cue then ends at the last span's end, and the next cue starts at the next span's start.

- Length. A Thai line reads comfortably at around thirty-five characters, and a cue holds at most two lines. Count the characters of the collected words and cut before the word that would push past the limit.
- Duration. A cue on screen for longer than about six seconds reads as stuck. Cut when the next word would push the cue past the limit, even when the line has room.
- Pause. A gap between one span's end and the next span's start longer than about half a second is a breath or a full stop. Cut there, and the cue ends when the speaker does.

A cue that ends at a pause reads better than one that ends at a count. A small overrun of the length limit to reach a pause is worth allowing. Where a cue has two lines, break the line at the widest gap between spans inside the cue, which is usually a phrase boundary.

one sentence, two cues:

```
words
  วันนี้      0.00  0.38
  เรา         0.38  0.55
  จะ          0.55  0.70
  คุย         0.70  0.98
  เรื่อง      0.98  1.30
  งบประมาณ    1.30  1.92
  ปีหน้า      1.92  2.40
  กัน         2.40  2.61
  นะครับ      2.61  3.05

cues
  1  00:00:00,000 --> 00:00:01,300
     วันนี้เราจะคุยเรื่อง
  2  00:00:01,300 --> 00:00:03,050
     งบประมาณปีหน้ากันนะครับ
```

## The convention to ask for

Subtitles want the spoken convention, which is the default. The viewer hears สองพันสามร้อยห้าสิบบาท and reads the same words. A digit on screen while the speaker says seven syllables reads as a mismatch, and a cue built from the written form also loses the span boundaries inside a number, since the digits arrive as one token.

Keep the verbatim style for the same reason. A viewer who hears a false start and reads a cleaned sentence notices. The clean style is for a transcript read on its own, away from the audio.

## Writing the file

SRT numbers each cue, writes the start and end as hours, minutes, seconds, and milliseconds with a comma before the milliseconds, and follows with the text. WebVTT is the same with a period before the milliseconds and a header line. Both are plain text, and both carry Thai as UTF-8 with no further setting. Write the seconds from the spans with three decimals and the file is done.

For a translated track, send the cues' text to the translation API one cue per segment with the ids echoed back. The timings stay with the ids. A Thai video gets an English track with the same cut points, and the two tracks stay aligned.

## Next steps

- Read the [transcription guide](https://paxalabs.com/docs/speech-to-text#timestamps) for the word timestamps beside the model's own spans on one recording.
- Read the [timestamps page](https://paxalabs.com/docs/timestamps) for the span shape shared with speech synthesis, where the same rules build read-along captions.
- Read the [numbers post](https://paxalabs.com/guides/thai-transcript-numbers-spoken-or-written) for why a subtitle keeps the spoken form.
- Read the [captions use case](https://paxalabs.com/use-cases/captions) for a caption pipeline end to end and what a season of video costs.

# How to judge a Thai AI voice in ten sentences

A ten-line listening test for any Thai text to speech voice, built on the sounds Thai carries and English does not, with a scoring sheet and the script to run.

Published 2026-09-08, updated 2026-10-01. Paxa Labs.

ข่าว, ขาว, and ข้าว are spelled with the same three letters and differ in tone alone. One is news, one is white, one is rice. A voice that gets one contour wrong turns a sentence about the morning news into a sentence about rice, and the listener hears the error before the sentence ends. Most demo scripts never put those three words in one line.

This guide is a listening test. It names the five things a Thai syllable carries that an English one does not, gives a ten-line script that checks each of them, and explains how to score the result. The script works on any voice. The Paxa TTS Flash voices are on the [voices page](https://paxalabs.com/voices), and the test is the same whichever voice is in the player.

## Five things a Thai syllable carries

Thai packs more into a syllable than English does. Each of the five properties below changes the meaning of a word on its own. Each is also a place where a voice can fail while sounding fluent to a listener who does not speak Thai.

- Tone. Thai has five tones, and the tone is part of the word. ข่าว carries a low tone, ขาว a rising one, ข้าว a falling one. A wrong tone is a wrong word, and a flat reading that levels every tone is a reading with no words in it.
- Vowel length. A short vowel and a long vowel are different vowels. ฝัน is a dream and ฝาน is to slice, and the only difference is how long the vowel lasts. A voice that clips long vowels merges pairs like these.
- Final consonants. A syllable ending in ก, ด, or บ closes on a stop the speaker does not release. มาก ends with the mouth closed. A voice trained mostly on English tends to release the final, which adds a puff of air Thai listeners hear as foreign.
- ร, ล, and clusters. Standard Thai keeps ร and ล apart and keeps clusters such as คร, ปล, and คล whole. Casual Bangkok speech drops the ร in ครับ and says คับ. A voice has to pick one register and hold it for the whole line, because a reading that alternates sounds like two speakers.
- Borrowed words. A word borrowed from English has a fixed Thai reading, with its own tones, that the spelling only partly marks. คอมพิวเตอร์ ends on a falling tone nothing on the page records. A voice can read the Thai spelling with English sounds, or read it letter by letter, and both are wrong.

Three more things sit above the syllable. Written Thai has several words whose letters allow two readings, and only the sentence decides which. Numbers, dates, and times read by rules a voice has to know. A Thai question is marked by a word at the end, and the pitch of the whole sentence does the opposite of what an English question does.

## The ten-line script

Each line below tests one property, and the table after it says what to listen for. Every line is under 50 characters, which is the length the box on [the text to speech page](https://paxalabs.com/tts) speaks without an account. Copy them in order.

the ten test lines:

```
1.  ข่าวเช้านี้บอกว่าข้าวขาวราคาขึ้น
2.  เขาฝันว่าได้ฝานมะม่วงให้แม่
3.  หนังสือเล่มนี้หนักมาก อ่านจบแล้วครับ
4.  ครูให้เราอ่านเรื่องปลาในคลองครับ
5.  ส่งอีเมลจากคอมพิวเตอร์ที่ออฟฟิศ
6.  เด็กตากลมนั่งตากลมริมทะเล
7.  นัดวันที่ 15 กรกฎาคม 2569 เวลา 14:30 น.
8.  โทร 02 123 4567 ต่อ 21
9.  ทานข้าวหรือยังคะ ถ้ายังเดี๋ยวสั่งให้นะคะ
10.  ทีม Marketing จะส่ง report ให้ CEO ก่อนเที่ยง
```

| Line | Checks | Listen for |
| --- | --- | --- |
| 1 | Tone | ข่าว low, ขาว rising, ข้าว falling, three distinct contours in one sentence |
| 2 | Vowel length | ฝัน short and ฝาน long, and the long one audibly longer |
| 3 | Final consonants | หนัก, มาก, จบ, and ครับ each close on an unreleased stop, with no puff of air after the final |
| 4 | ร, ล, and clusters | ครู, เรื่อง, ปลา, and คลอง keep their ร and their clusters, or the line drops them together in one casual register |
| 5 | Borrowed words | อีเมล, คอมพิวเตอร์, and ออฟฟิศ read as Thai words with Thai tones, with the falling tone on the last syllable of คอมพิวเตอร์ |
| 6 | Two readings of one string | The first ตากลม reads as ตา-กลม, round eyes, and the second as ตาก-ลม, sitting in the breeze |
| 7 | Date and time | 15 reads as สิบห้า, the year reads in full, and 14:30 น. reads as a clock time in either the formal or the spoken form |
| 8 | Phone number and 21 | The digits read one by one, with สอง or the telephone form โท for 2, and ต่อ 21 reads as ยี่สิบเอ็ด |
| 9 | Particles and a question | คะ on a high tone and นะคะ on the right two tones, with the question carried by the particle and no rising pitch across the sentence |
| 10 | English inside Thai | Marketing and report read as English words, CEO reads letter by letter, and the Thai around them stays Thai |

Line 6 is the classic test for reading in context, and it has a cousin in เพลา, which reads as one syllable when it means an axle and as two when it means a time of day. Line 9 matters most for a female voice, because ค่ะ on a falling tone and คะ on a high tone are one letter apart in spelling and a whole register apart in sound. The [script guide](https://paxalabs.com/guides/writing-for-thai-text-to-speech) covers how to write numbers and English words when the script is yours to change.

## How to listen

A fluent reading hides errors. The ear forgives a wrong tone when the sentence carries on at a natural pace, and a listener who is judging the overall feel will pass a voice that fails three lines. Score each line on its own check and nothing else.

- Play each line twice. Listen to the whole line the first time, and listen for the one property the table names the second time.
- Score each line 0, 1, or 2. Two means the check passes cleanly. One means a Thai listener would notice and understand. Zero means the word changed or the reading is wrong.
- Read all ten lines in one voice before switching. Comparing line 3 in one voice against line 3 in another is the point, and mixing voices inside a run confuses the memory of what each one did.
- Ask a native speaker to score lines 1, 2, 6, and 9 blind, without the table. Those four are where a non-native ear passes what a native ear fails.
- Keep the audio. A file per line per voice is a small folder, and a decision made on it can be revisited when the script or the voice changes.

> A line that fails on every voice you test is a script problem. Rewrite it in the form the script guide gives, and run it again before you rule a voice out.

## Where a natural reading breathes

Thai writing puts a space between phrases and no mark between sentences. A speaker breathes at the space, holds a shorter beat at a comma, and runs straight through a phrase with no space in it. Lines 3 and 9 each carry one space, and the reading should pause there and nowhere else.

A reading that pauses inside a phrase has cut a word in half or has guessed a boundary wrong. A reading that runs through the space has lost the phrase structure, and a long sentence read that way sounds like a machine even when every syllable is right. Score this under the line it happens in, and note it separately, because the fix is different from the fix for a wrong tone.

Speed is the last thing to judge. Thai news reads fast and Thai bedtime stories read slow, and a voice cast for one job is at the wrong pace for the other. Judge the pace against the job the voice is for, and use `speed` on the [request](https://paxalabs.com/docs/api/text-to-speech) to move it after the sounds pass.

## Reading the score

The maximum is 20 per voice. A voice at 18 or above reads Thai as a Thai speaker would on the lines that matter. The remaining points are usually a number or a borrowed word the script can fix. A voice between 14 and 17 is usable for a surface where the text is written for it, and the lines it lost tell you what the writer has to avoid. Below 14 the voice is the problem, and a better script will not carry it.

One line overrides the total. A zero on line 1 means the voice does not hold tones, and every other line was passed by luck. Rule that voice out whatever the rest of the sheet says.

## Voices the script treats differently

Line 10 flips for an English-first voice. The 6 English-first voices read a whole English sentence with no Thai accent and read Thai with a foreign one, and the Thai lines above score them low by design. Test those voices on an English line of the same shape, and score line 10 on whether the Thai around the English words stays intelligible. The [English voices page](https://paxalabs.com/english-voices) lists them and the jobs they are cast for.

Line 10 flips the same way for the 2 Mandarin-first voices, which read a Mandarin sentence in their own language and Thai with a foreign accent. Test them on a Mandarin line of the same shape. The [Mandarin voices page](https://paxalabs.com/chinese-voices) lists them and the jobs they are cast for.

The 4 regional voices read the same script in their own sound system. The regional varieties of Thai carry tone systems of their own, and a speaker of central Thai scoring line 1 on a regional voice is judging it against the wrong system. Have a speaker from that region score lines 1, 2, and 9, and read the [accents page](https://paxalabs.com/voices/accents) for what the register changes.

## Run the script

- Paste the lines one at a time into the box on [the text to speech page](https://paxalabs.com/tts). It speaks 9 of the 50 Paxa TTS Flash v2 voices with no account, one line every few seconds.
- Open the [speech tool](https://paxalabs.com/app/speech) for the full script in one run, any voice, and audio you can download. A new account starts with 100 free credits, which covers the whole ten-line script about 30 times.
- Call [POST /v1/tts](https://paxalabs.com/docs/api/text-to-speech) with the same ten lines when the test is part of a build, and keep the files under version control beside the script.
- Read each voice's page under [voices](https://paxalabs.com/voices) before you pick. The catalog role says what the voice was cast for, and a voice at the wrong pace for the job fails a test no line above can catch.

## Next steps

- Read the [choosing guide](https://paxalabs.com/guides/choosing-a-thai-ai-voice) to pick the two or three voices worth testing for a job.
- Read the [script guide](https://paxalabs.com/guides/writing-for-thai-text-to-speech) to fix the lines a voice lost on numbers, English, and particles.
- Read the [voices reference](https://paxalabs.com/docs/api/voices) for the ids and the fields the catalog returns.

# What machine translation into Thai gets wrong, and how to check it

The five ways a Thai translation can be grammatical and still wrong, a review a team without a Thai reader can run, and where machine output is already enough.

Published 2026-09-08. Paxa Labs.

A Thai sentence can be grammatical, accurate, and wrong for the reader at the same time. Thai asks the writer to choose a level of politeness, a pronoun for the speaker and one for the reader, and a spelling for every borrowed word. English asks for none of those, and a translation engine that carries the meaning across still has to make each choice. The choices it makes are the errors a team without a Thai reader ships.

This guide names the five failures that survive a grammar check and gives a review a non-reader can run on every batch. It ends with where machine output is already good enough to ship after that review. The examples use [Paxa Translate Lite](https://paxalabs.com/docs/translation) and its fields, and the checks apply to output from any engine.

## Five failures that survive a grammar check

### Register drift

Every Thai sentence sits at one level of formality, and the level shows in the particle at the end, the pronouns, and the verbs. A product is translated in batches over months, and each batch arrives at the level the engine inferred from that batch's text. The support macros come back polite, the onboarding tour casual, the terms formal. Each batch is correct on its own, and the product speaks in three voices.

one string, two batches:

```
source     Your order has shipped.
batch 1    ส่งของแล้วนะ
batch 2    จัดส่งคำสั่งซื้อของคุณเรียบร้อยแล้วค่ะ
```

Both lines above are fine Thai. The first belongs in a chat app and the second in a bank, and a product that shows one on the order page and the other in the email has drifted. The [politeness post](https://paxalabs.com/guides/thai-politeness-in-translation) explains the three registers in depth. The fix for drift is one decision written down and sent with every request.

### The wrong pronoun

English has one word for I and one for you. Thai has a dozen of each, and the pair a sentence uses states who is speaking to whom. A support macro written in the first person often comes back with ฉัน, the pronoun a person uses about themselves in casual speech. A company writes เรา, or its own name, and addresses the reader as คุณ. ท่าน sits a rank higher and belongs in a letter to a government office or a formal notice.

a refund macro:

```
source     I've refunded your order. You'll see it in 5 to 7 days.
machine    ฉันคืนเงินคำสั่งซื้อของคุณแล้ว คุณจะเห็นภายใน 5 ถึง 7 วัน
better     เราคืนเงินค่าสินค้าให้คุณเรียบร้อยแล้วค่ะ ยอดเงินจะเข้าภายใน 5 ถึง 7 วัน
```

The second line also changes the verb of receipt. A refund in Thai arrives, ยอดเงินจะเข้า, and the reader does not see it. That change is the kind a native reader makes in one pass and a checklist never catches, which is why the review below keeps a reader on the strings customers see most.

### Three spellings of one borrowed word

Thai borrows English words constantly and spells many of them more than one way. The Office of the Royal Society publishes one spelling, newspapers and apps use another, and chat uses a third. An engine that has seen all three picks per sentence, and a product ends up with two spellings of email on one screen.

| Word | Royal Society spelling | Common variants |
| --- | --- | --- |
| email | อีเมล | อีเมล์, เมล |
| application | แอปพลิเคชัน | แอพพลิเคชั่น, แอพ |
| digital | ดิจิทัล | ดิจิตอล |
| internet | อินเทอร์เน็ต | อินเตอร์เน็ต |
| website | เว็บไซต์ | เว็ปไซต์ |

Pick one column per product and hold it. The Royal Society spelling is the safe default for anything formal, and the common variant reads as natural in a consumer app. Whichever it is, put the chosen spellings in the `glossary`, and the engine will use them. The [borrowed words section](https://paxalabs.com/docs/translation#borrowed-words) of the guide covers the `borrowed_words` field, which decides whether a word with no established Thai form is transliterated or kept in Latin script.

### Words that are correct and never said

A calque translates each word and produces a phrase no Thai service uses. บำรุงรักษา is maintenance, and it is what a mechanic does to an engine. A website that goes down for maintenance ปิดปรับปรุง, closes to improve. Both phrases are in the dictionary, and only one has ever appeared on a Thai status page.

a maintenance notice:

```
source     Heads up: we're doing maintenance tonight.
machine    แจ้งเตือน: เราจะดำเนินการบำรุงรักษาในคืนนี้
better     แจ้งเพื่อทราบ คืนนี้ระบบจะปิดปรับปรุงชั่วคราวค่ะ
```

Calques cluster in system messages, error text, and status pages, because those strings are short and give the engine no context. Sending the surface in `context`, a status page or a push notification, is what moves the engine from the dictionary phrase to the one in use. A glossary entry does the same for a phrase that recurs. The [instructions section](https://paxalabs.com/docs/translation#instructions) of the guide covers the fields.

### Formatting that changes at the border

Several formatting rules change when the language does. Thai has no plural forms, and the CLDR plural rules give it one category. Written Thai ends a sentence with a space and no full stop. The baht sign is rare in Thai text and the word บาท follows the number. Dates print in the Buddhist Era, which is the Common Era year plus 543, and a receipt that prints 2026 has kept the source calendar.

what changes:

```
ICU     {count, plural, one {# message} other {# messages}}
Thai    {count, plural, other {# ข้อความ}}

source  Saved.
Thai    บันทึกแล้ว

source  ฿100 · 2026-07-15
Thai    100 บาท · 15 ก.ค. 2569
```

An ICU message with one, few, and other branches collapses to other in Thai, and a file that keeps the English branches carries text no Thai user will see. A placeholder such as `{count}` has to survive with its braces intact, and a tag has to close where it opened. Send rich strings with `format` set to `"html"` or `"markdown"` and the engine preserves the structure. The [markup section](https://paxalabs.com/docs/translation#markup) of the guide describes what is preserved.

## A review a non-reader can run

The engine runs the first pass itself. Every delivered segment is checked against what the request asked for, and a segment that fails a check carries a `review` member naming the reason. The [review section](https://paxalabs.com/docs/translation#review) lists the reasons. A flag never refuses a request, and the translation is delivered either way. Read the flags before anything else.

- Count the placeholders and tags. Every `{name}`, `%s`, and tag in the source appears once in the output, and the `markup_changed` and `preserved_span_missing` reasons name the strings where one moved or vanished.
- Compare lengths. Thai runs at a fairly steady ratio to English across a batch, and a string far outside that ratio dropped a clause or picked up one. Set `max_length` on strings bound to a button or a title, and read the `too_long` reason.
- Search for the glossary. Each term's chosen Thai form appears wherever the source term did, and the `glossary_term_missing` reason names the segments where it did not.
- Read the `untranslated` reason with care. A product name that came back unchanged is right. A sentence that came back unchanged is a failure the engine reported on itself.
- Check the particles by eye. Every customer-facing statement ends on the same particle, ค่ะ or ครับ, across the batch, and no string ends on นะ in a surface that handles money. The particles are visible to anyone, whatever they read.
- Check the numerals, the dates, and the currency. Arabic digits throughout, บาท after the amount with a space before it, and the year in the era the surface uses everywhere else.
- Give a reader the delta. The ten strings customers see most, the top of every surface, and every string about money or terms get a native read on every batch. The rest gets a sampled read on the first batch and the flagged strings after that.

## Measure the register without reading it

Three counts over a batch show its register to someone who reads none of it. Each is a one-line script over the output file, and each catches drift before a reader is asked for an hour.

- Count the last word of every statement. A batch at one register ends most statements on one particle, ค่ะ or ครับ, and a batch that splits between ค่ะ, นะคะ, นะ, and no particle at all is three batches in one file.
- Count the pronouns. ฉัน, ผม, ดิฉัน, เรา, คุณ, and ท่าน each have a place, and a customer-facing batch should contain เรา and คุณ and little else. A single ฉัน in a support batch is worth opening.
- Count each spelling of the borrowed words in the glossary. The chosen spelling should be the only one present, and a variant that appears once is a string the glossary did not reach.

three counts over one batch:

```
particle   ค่ะ 412   นะคะ 9   นะ 3   none 61
pronoun    เรา 388   คุณ 402   ฉัน 2   ท่าน 0
spelling   อีเมล 37   อีเมล์ 1   เมล 0
```

The second and third lines above each name a string to open. The first says the batch holds together, apart from the 61 statements with no particle, which are most likely labels and belong in a separate count. Run the same counts on the approved strings from the last batch, and a new batch is compared against a number.

## Brief before you edit

A wrong register on one string is an edit. A wrong register on a batch is a brief that was never written. The fields below fix each decision once, and a batch sent with them comes back needing the reader's pass and little else.

| Decision | Field | What to send |
| --- | --- | --- |
| Level of formality | `formality` | `formal` for money, legal text, errors, and email; `casual` only for an audience that speaks that way |
| Speaker and reader | `instructions` | The particle the product speaks with and the pronoun pair, for example a company voice with ค่ะ, เรา for us, and คุณ for the reader |
| Surface and audience | `context` | Where the string appears and who reads it. A status page and a contract translate differently |
| Fixed terms and spellings | `glossary` | Every term with one Thai form, borrowed-word spellings included |
| Strings that stay | `do_not_translate` | Product names, feature names, placeholders, and codes |
| Accepted output | `examples` | Source and approved Thai pairs from the last batch, which carry the voice better than a description of it |
| Space on screen | `max_length` | The width a control allows, per segment, on buttons, titles, and notifications |

Some strings are cheaper to write than to brief. A headline, a tagline, and anything that turns on wordplay are a copywriter's job in Thai as in English. A batch of under ten such strings costs less to hand to a writer than to describe to an engine. Send the engine the volume and the writer the voice.

## Where machine output is enough, and where it is not

| Surface | After the review above | Native read |
| --- | --- | --- |
| Support macros and system email | Ships | First batch in full, then the flagged strings |
| Product descriptions at volume | Ships | A sample per batch |
| Interface strings | Ships with `max_length` and ids | The top of every surface |
| Help center and documentation | Ships | The pages with the most traffic |
| Terms, policies, invoices | A draft | Every string, every batch |
| Headlines, taglines, campaign copy | A draft | A rewrite by a writer |

The line between the rows is the cost of a wrong sentence. A support macro with a stiff particle costs a raised eyebrow. A clause in the terms with the wrong verb costs a dispute. The review is the same on every row, and the reader's share of it grows with what a mistake costs.

## A workflow that holds across batches

- Batch by surface. One request carries up to 200 segments with shared context, and a batch drawn from one surface gets one register. Send each string's key as its `id`, and the result comes back keyed to your file with no dependence on order. The [batching section](https://paxalabs.com/docs/translation#batching) covers the shape.
- Keep one glossary per product, in version control, and send the whole of it with every batch. Only the terms that appear in the text are sent to the engine and billed, and the pruning is automatic.
- Read the review flags first, the reader's delta second, and change the brief when the same flag repeats. A flag that appears on every batch is a missing glossary term or a missing instruction.
- Feed accepted strings back as `examples` on the next batch. Ten approved pairs from the last batch hold the voice better than any paragraph of instruction.
- Translate only what changed. Hash each source string, and send a batch of the strings whose hash moved. The register holds because the brief has not changed, and the reader's delta stays small.

## Next steps

- Read the [translation guide](https://paxalabs.com/docs/translation) for every field, and the [reference](https://paxalabs.com/docs/api/translate) for the request and response shapes.
- Read the [politeness post](https://paxalabs.com/guides/thai-politeness-in-translation) to choose the register before the first batch.
- Read the [cost post](https://paxalabs.com/guides/thai-translation-cost) for what a batch costs against an agency or a freelancer.
- Open the [translate tool](https://paxalabs.com/app/translate) with ten real strings from one surface and read the flags it returns.

# Feeding Thai documents to an LLM: OCR comes first

A PDF is a drawing of text, and a Thai one fails a language model twice. How to read the pages first, what to hand the model, and how to pay for the reading once.

Published 2026-09-08. Paxa Labs.

A PDF is a drawing of text. It records where each glyph sits on the page, and whether the characters behind those glyphs are recoverable depends on how the file was made. A language model reasons over text it receives, and for a Thai document the text it receives is usually wrong in one of two ways. A text layer, when there is one, carries Thai in an order no reader wrote. A scan carries no text at all, and a model asked to read the image is guessing at marks a few pixels tall.

This guide is about the step between the file and the prompt. It covers what a model receives from a Thai PDF and why a reader built for Thai pages goes first. It then covers what shape to hand the model, how to handle tables and page boundaries, and how to pay for the reading once. The examples use [Paxa OCR Lite](https://paxalabs.com/docs/ocr) for the reading, and the shape of the pipeline holds for any reader that returns structure.

## What a model receives from a PDF

Sending a PDF to a model API does one of two things on your behalf, and hides which. The service extracts the text layer and puts it in the prompt, or it renders the pages to images and puts those in the prompt. Both paths work well enough on an English contract. Both fail on a Thai one for reasons that are specific to the script.

A Thai text layer is built from the glyphs the producing software placed. Thai fonts keep repositioned copies of tone marks and upper vowels as private-use glyphs, shifted to clear a tall consonant such as ป or ฝ, and a text layer that names those glyphs extracts as code points no text tool recognizes. Other producers emit a mark before the letter it sits on. The [extraction post](https://paxalabs.com/guides/thai-pdf-text-extraction) catalogs the failures. The line below is one printed line and two things a text layer makes of it.

one line, two text layers:

```
printed        ปุ๋ยอินทรีย์ ถุงละ ๒๕๐ บาท
text layer A   ปยอินทรีย ถงละ ๒๕๐ บาท
text layer B   ป๋ ุยอินทรีย ์ ถ ุงละ ๒๕๐ บาท
```

The first layer dropped every mark the font stored as a private glyph. The second kept the marks and stored two of them out of order. A model reading either receives a string that spells nothing. It is not reading nonsense, because it can often reconstruct the word from the letters around it, and that is worse. The model fills the gap with the most likely word, and the most likely word on an invoice is a plausible wrong number.

## Why a Thai scan needs a reader before the model

The image path avoids the text layer and meets the script directly. A Thai line uses four vertical levels. A vowel can hang below the consonant, a vowel or ั can sit above it, and a tone mark sits above that. One column stacks up to three glyphs, and the marks that carry the meaning are the smallest things on the page. The four tone marks, ่ ้ ๊ ๋, and the upper vowels ิ ี ึ ื are told apart by a stroke or a dot a few pixels wide at a normal scan resolution.

A general model resizes an image to a fixed budget of pixels before it reads it, and a full page of Thai at that budget leaves a tone mark with too little to go on. The model reads the consonants, which are large, and infers the marks, which are small. The result reads as fluent Thai and disagrees with the page on the words that differ by one mark. ข่าว and ข้าว are one such pair, and an amount column has a dozen more.

A reader trained on Thai pages reads at the page's resolution and outputs characters once. Text is what a model is good at. Reading a page once and handing the model the text puts each system on the task it does well. It also makes the reading a stored artifact a person can open and check.

## Markdown as the interchange format

Ask the reader for Markdown. [POST /v1/ocr](https://paxalabs.com/docs/api/ocr) returns each page as GitHub-flavored Markdown in reading order by default. Headings arrive as heading marks, lists as list items, and tables as pipe tables. The structure is carried in plain characters that survive a prompt unchanged, and a model has read more Markdown than any other structured text. The page below is one page of a quotation as the reader returns it.

one page as Markdown:

```
# ใบเสนอราคา

เลขที่ QT-2569-0142 วันที่ 15 กรกฎาคม 2569

| รายการ | จำนวน | ราคาต่อหน่วย | รวม |
| --- | --- | --- | --- |
| ปุ๋ยอินทรีย์ 25 กก. | 40 ถุง | 250 | 10,000 |
| ค่าขนส่ง | 1 | 800 | 800 |

ยืนราคา 30 วัน นับจากวันที่ในใบเสนอราคา
```

Everything the model needs is on the page and nothing else is. There is no geometry, no font name, no bounding box, and no confidence score to explain away in the prompt. The table is a table, and a question about the total finds the total in a cell under a column heading. Join pages with a blank line to rebuild the document, and the document is a prompt.

Two things are worth adding before the join. Mark each page boundary with a comment such as `<!-- page 3 -->`, which a Markdown renderer hides and a model reads as a marker, and the model can cite the page in its answer. And keep the Thai digits as printed. A model reads ๒๕๐ correctly, and a citation that shows the reader's text should match the scan. The [search index post](https://paxalabs.com/guides/thai-pdf-to-search-index#normalize) covers the normalized copy a retrieval index needs beside the original.

## Tables, running headers, and page boundaries

A table is one object, and it should reach the model whole. A pipe table split across two pages by the scan arrives as two tables with one header. The pipeline should join them when the second page opens on rows with no heading above them. A table wider than the prompt can bear is the one case where the Markdown shape fights the model, and the structured output below is the answer to it.

Running headers and footers repeat on every page. A document id, a company name, a page number, and a confidentiality line arrive once per page and add nothing after the first. Detect lines that recur at the top or bottom of most pages and drop them, and keep the page number in the boundary marker where it does the work of a citation.

A long document is read in parts. One request reads up to 50 pages and 10 MiB, and a 200-page manual is 4 requests. Number the pages continuously across the parts, because the page is what an answer cites, and a part that restarts at page 1 breaks every citation after the first part.

## Read once, and pay for the reading once

A page costs 6.5 credits whatever it holds. The 200-page manual is 1,300 credits, which is $1.30, and that is the cost of every question ever asked of it if the reading is stored. A pipeline that reads the document inside each request pays that again per question. Key the cache on a hash of the file's bytes, and a document uploaded twice is read once.

the read-once pipeline:

```
key    = sha256(bytes)
pages  = cache.get(key)
if pages is missing:
    pages = POST /v1/ocr { document: base64(bytes), model, output: "markdown" }
    cache.put(key, pages)
text   = join(pages, page => "<!-- page " + page.page + " -->\n" + page.markdown)
answer = model(system, text, question)
```

Store the reader's output beside the source hash, and rebuild the prompt from stored text every time. The page count is read before the charge, and a document the reader cannot open is refused without one. A request that fails after the charge is refunded. Send an `Idempotency-Key` on the read and a retry after a timeout replays the stored result without a second charge. The [OCR guide](https://paxalabs.com/docs/ocr#billing) covers the billing rules.

## The prompt around the reading

The reading is the document. The prompt around it sets what the model may do with it, and three rules matter more for a Thai document than for an English one.

- Answer from the text alone, and say when the text does not contain the answer. A model that falls back on what it knows about Thai invoices in general will produce a plausible field the page never had.
- Quote Thai verbatim. A model asked to summarize will normalize spellings and drop particles, and a quotation that differs from the page by one mark is a quotation a reviewer cannot find.
- Keep the digits and the calendar as printed, and convert on a separate line. ๒๕๖๙, 2569, and 2026 name the same year in three notations, and a model that converts in place leaves the citation pointing at text that no longer matches the page.

a system prompt for a read document:

```
You are answering questions about a Thai document.
The document follows, one page per <!-- page N --> marker.
Answer only from the document. When the answer is absent, say so.
Quote Thai text exactly as written, and name the page marker it came from.
Keep digits, amounts, and years as printed. Put any conversion on a separate line.
```

A photo of a document goes through the same path. An image counts as one page, the reader accepts PNG, JPEG, and WebP beside PDF, and a phone photo of a receipt costs 6.5 credits like any other page. Photograph the whole page, and the reader returns its text in the same Markdown a scan gets.

## Structured blocks for extraction

Set `output` to `"structured"` and each page arrives as typed blocks in reading order. Headings carry a level, lists carry their items, and tables carry rows of cells. A pipeline that extracts fields can route each block by type. Tables go to code, which reads a cell by column name without a model. Paragraphs go to the model with the heading trail above them as context. Figures carry a caption and nothing else.

The rule that follows is worth stating plainly. Leave every number that sits in a table block to the code. The code reads it exactly, and the model reads it probably. Ask the model for what the code cannot do, which is to say which of three paragraphs states the payment terms, or whether a clause obliges the buyer or the seller. Validate what comes back against a schema, and keep the block the answer came from as the citation.

A wide table is the other reason to use blocks. Flatten each row into a line of column name and value pairs. A table that would have wrapped past recognition as pipes becomes a list, and the model reads it without losing which value belonged to which column.

## Where the model still earns its place

The reader turns the page into text. The model does the rest. It summarizes a fifty-page regulation, answers a question across a folder of contracts, and classifies a document by its first page. It normalizes the four ways a Thai document writes a date into one field, and it drafts the reply to a letter. Every one of those tasks is a text task, and every one of them is only as good as the text it starts from.

## Next steps

- Read the [OCR guide](https://paxalabs.com/docs/ocr) for the outputs and limits, and the [reference](https://paxalabs.com/docs/api/ocr) for the page and block fields.
- Read the [search index post](https://paxalabs.com/guides/thai-pdf-to-search-index) for chunking the stored text when the folder outgrows one prompt.
- Read the [extraction post](https://paxalabs.com/guides/thai-pdf-text-extraction) for what a Thai text layer gets wrong and how to check a reading.
- Open the [documents tool](https://paxalabs.com/app/documents) to read one page and see the Markdown and the blocks it returns.

# What Thai translation costs in 2026: agency, freelancer, API

Thai translation rates from public listings, per page and per word, beside what the same letter, contract, and product catalogue cost as generated translation.

Published 2026-09-07. Paxa Labs.

Translating a page between English and Thai in 2026 costs from ฿250 on a freelance listing to ฿1,500 at a language institute for technical text. An agency quotes from ฿150 to ฿600 a page, or from ฿1 a word with a minimum order. Generated translation prices the same 300-word page at about 45 credits, which is $0.05.

This guide lays the two side by side. The human figures come from public listings retrieved on 7 September 2026 and linked beside each number. The generated figures come from the published per-character rate, and they move when it moves.

## How human translation is priced

Human translation is priced by the page, by the word, or by the document. A freelancer on a marketplace sells a package, which is a word or page ceiling, a turnaround, and a number of revision rounds. An agency prints a per-page range and marks every figure as a starting price that depends on the content. A certified translator prices by document type, with the certification and the legalization run as separate lines.

The headline figure is rarely the whole invoice. Specialized content moves a page up a tier, and a rush turnaround has its own fee. A document bound for a government office needs a certification stamp and sometimes a trip to the consular office, each priced on its own.

## What a page is

The page is the unit most Thai listings price in, and no two define it the same way. [an agency's rate page](https://www.bbktranslator.com/rate) defines it by typesetting, as an A4 sheet at Angsana New 16 with images and charts excluded. [an agency's rate page](https://www.edubranch.com/17721677/%E0%B8%AD%E0%B8%B1%E0%B8%95%E0%B8%A3%E0%B8%B2%E0%B8%84%E0%B9%88%E0%B8%B2%E0%B8%9A%E0%B8%A3%E0%B8%B4%E0%B8%81%E0%B8%B2%E0%B8%A3) counts 350 Thai words a page at the same font. [a certified translator's rate page](https://www.firstchoicetranslation.com/en/servicerateeng/) allows 250 to 300 words an A4. [a language institute's price page](https://www.sumaa.net/services/translation-services/) fixes 300 words whatever the font, and [a freelance listing](https://fastwork.co/user/lerluck/translation-50150270) on a marketplace counts 500.

A page of 500 words at one price and a page of 250 at the same price are a factor of two apart. Ask what the page is before comparing two page rates, or ask for the per-word rate, which two of the agency pages below print beside the page rate. The comparison in this guide uses a 300-word page throughout.

## Thai translation rates from public listings

The table holds every figure found on nine public pages on 7 September 2026. Each row is one page's own price, and a listing is the opening position in a negotiation. Read the spread as the range a buyer meets on the first day of looking.

| Job | Unit | Figure | Source |
| --- | --- | --- | --- |
| English and Thai, any direction | Starting price | ฿250 | [a marketplace category](https://fastwork.co/translation/english) |
| Thai and English, 500-word page, one day | Per page | ฿250 | [a freelance listing](https://fastwork.co/user/lerluck/translation-50150270) |
| Package by turnaround, two revisions | Per package | ฿400 for 2,000 words in four to seven days, ฿480 for 1,000 in two to three, ฿800 for 700 in one | [a freelance listing](https://fastwork.co/user/chalisaph/translation-27590348) |
| English and Thai, general documents | Per page, from | ฿150 to ฿600 | [an agency's rate page](https://www.bbktranslator.com/rate) |
| Civil registry forms, certified | Per form | ฿150 to ฿400 | [an agency's rate page](https://www.bbktranslator.com/rate) |
| English to Thai | Per word, from | ฿1 (minimum ฿300) | [an agency's rate page](https://www.edubranch.com/17721677/%E0%B8%AD%E0%B8%B1%E0%B8%95%E0%B8%A3%E0%B8%B2%E0%B8%84%E0%B9%88%E0%B8%B2%E0%B8%9A%E0%B8%A3%E0%B8%B4%E0%B8%81%E0%B8%B2%E0%B8%A3) |
| Thai to English | Per word, from | 1.25 baht (minimum ฿350) | [an agency's rate page](https://www.edubranch.com/17721677/%E0%B8%AD%E0%B8%B1%E0%B8%95%E0%B8%A3%E0%B8%B2%E0%B8%84%E0%B9%88%E0%B8%B2%E0%B8%9A%E0%B8%A3%E0%B8%B4%E0%B8%81%E0%B8%B2%E0%B8%A3) |
| General and specialized documents | Per page, from | ฿400 general, ฿500 specialized (1.85 and 2.5 baht a word) | [an agency's rate page](https://www.iamtranslation.com/%E0%B8%94%E0%B8%B9%E0%B8%AB%E0%B8%99%E0%B9%89%E0%B8%B2-14413-%E0%B8%AD%E0%B8%B1%E0%B8%95%E0%B8%A3%E0%B8%B2%E0%B8%84%E0%B9%88%E0%B8%B2%E0%B8%9A%E0%B8%A3%E0%B8%B4%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%81%E0%B8%9B%E0%B8%A5%E0%B9%80%E0%B8%AD%E0%B8%81%E0%B8%AA%E0%B8%B2%E0%B8%A3.html) |
| Certified documents, Thai to English | Per document | ฿400 for an ID card, ฿450 for a birth certificate, ฿550 to ฿900 for a court judgement | [a certified translator's rate page](https://www.firstchoicetranslation.com/en/servicerateeng/) |
| General and technical text | Per page | ฿800 general, ฿1,200 to ฿1,500 technical | [a language institute's price page](https://www.sumaa.net/services/translation-services/) |
| Certified Thai, overseas agency | Per page or per word | $24.95 a 250-word page certified, $0.10 a word standard | [an overseas agency's Thai page](https://rushtranslate.com/languages/thai) |

Two of the pages price the same 300 words six times apart. A general page is ฿250 on the freelance listing and ฿800 at the institute, and the technical tier on the same institute page reaches ฿1,500. The difference is the translator, the subject, and the review the fee includes, and each page states all three.

## Certified documents are a different product

A birth certificate, a house registration, or a court judgement translated for a visa or a government filing is priced per document, and the translation is the smaller line. [an agency's rate page](https://www.bbktranslator.com/rate) lists the consular legalization run from ฿500 on top of the form, and [a certified translator's rate page](https://www.firstchoicetranslation.com/en/servicerateeng/) prints an express fee of ฿250 beside its per-document prices. The stamp, the signed statement, and the trip are what the buyer pays for.

Generated translation does none of that. A certified document needs a named translator who signs for the text, and this guide leaves that column out of every comparison below.

## What generated translation costs per page

Generated translation is priced per character of source text, at 25 credits per thousand characters, where 1,000 credits are one dollar. English runs about 6 characters a word with the space, which makes a 300-word page about 1,800 characters. One page therefore costs about 45 credits, which is $0.05.

There is no per-page tier, no rush fee, and no minimum order. The one floor is 2 credits per request, which is what a single product name costs. Context, a glossary, and instructions bill at a lower reference rate on top, and [the credits guide](https://paxalabs.com/docs/credits) walks through how a request is charged and refunded.

> The characters-per-word figure is an estimate for English prose. Thai source text has no spaces between words and a different character count per meaning, and a Thai-to-English job is best priced from its character count directly. Every response reports the exact count it billed.

## Three jobs, priced three ways

| Job | Text | Freelance floor | Agency or institute | Generated |
| --- | --- | --- | --- | --- |
| One-page business letter | 300 words | ฿250 | ฿400 to ฿800 | 45 credits ($0.05) |
| 40-page commercial contract | 12,000 words | ฿10,000 at ฿250 a page | ฿30,000 at 2.5 baht a word, ฿48,000 at ฿1,200 a page | 1,800 credits ($1.80) |
| Catalogue of 2,000 products | 40,000 words | ฿40,000 at ฿1 a word | ฿74,000 at 1.85 baht a word | 6,000 credits ($6) |

The freelance column applies one listing's page rate to the whole job, and a real contract quote is negotiated at the specialized tier. The generated column is the published rate times the characters, with no rounding beyond the per-request floor.

The gap grows with length. On a letter the two sit a few hundred baht apart. On the contract the generated translation costs less than one page of the specialized rate. A contract of that length is sent in parts, because one request accepts 20,000 characters of text. The parts share a glossary, and a defined term reads the same in clause 3 and clause 41.

## A year of updates

The letter is translated once. The catalogue is translated every month. Take the 2,000-product catalogue above, where a tenth of the descriptions change each month with a new variant, a price line, or a reworded claim.

With a human translator each month's batch is 4,000 words, and 48,000 words a year. That is ฿48,000 at the per-word rate above, plus the review that keeps a term consistent with what was translated last month. A month with fewer changes still meets the minimum order, ฿3,600 a year at that page's minimum.

With generated translation the changed descriptions are sent as one batch of up to 200 segments with the same glossary as last month, and the unchanged ones are never sent. That is 7,200 credits a year, or $7.20. The [translation guide](https://paxalabs.com/docs/translation#glossaries) shows how a glossary holds a product name across batches.

## What the free credits buy

A new account starts with 100 credits. At the published rate that is about 4,000 characters of source text, about 666 English words, or 2 pages of the size used above. It covers a letter, a set of interface strings, or the first batch of a catalogue, which is enough to read the output against a human draft before deciding.

The free grant is for personal and evaluation use, and any purchase unlocks commercial use for the account, including the free credits.

## Where a human translator still wins

- Any document that needs a signature. Certified, sworn, and notarized translation is a named person's liability, and no rate above for generated text applies.
- A campaign line, a slogan, or a brand name, where the job is to write a Thai line that lands and the source is a brief.
- Literary text, where voice is the product and a second draft by the same translator is the point.
- The final read of a contract that binds the reader. A generated draft plus a lawyer's review is a common split, and the lawyer's hour is the larger line.

## What generated translation changes

The rate is one line. The turnaround is the request. A batch of 200 product descriptions returns in one call, and the register, the pronoun pair, and the fixed terms are set once in the request and hold across every segment. The [politeness post](https://paxalabs.com/guides/thai-politeness-in-translation) covers the register choices, and [Paxa Translate Lite](https://paxalabs.com/docs/api/translate) documents the fields that carry them.

The cost the generated column hides is review. A translator reads their own draft back. A generated draft needs a reader who knows the product, and a glossary written by that reader is what stops the same review from repeating every month.

## Next steps

- Read the [pricing page](https://paxalabs.com/pricing) for the plans and what a month of translation costs.
- Open the [translate tool](https://paxalabs.com/app/translate) to run a page with a glossary and read the result.
- Read the [translation guide](https://paxalabs.com/docs/translation) for batching, segments, and the two billing rates.
- Compare the priced examples for [support](https://paxalabs.com/use-cases/support), [ecommerce](https://paxalabs.com/use-cases/ecommerce), and [contracts](https://paxalabs.com/use-cases/contracts).

# Thai has no full stop: where streaming speech should break

Thai ends a sentence with a space and no full stop, and a voice agent streaming text to a speech socket has to find that boundary before the voice can start.

Published 2026-09-07. Paxa Labs.

Thai writing ends a sentence with a space. The same space separates clauses inside the sentence, and the full stop is absent from ordinary prose. A voice agent that streams a reply to a speech socket as the language model writes it has to decide where one sentence ends and the next begins. The character it would wait for in English never arrives.

This guide is about that decision. It covers what the [live socket](https://paxalabs.com/docs/live-streaming) does with a stream of Thai text, which boundaries a Thai reply carries, and where a break sounds wrong. It ends with a way to have the language model mark the breaks itself.

## A space does the work of a full stop

Written Thai uses one character for two jobs. A space closes a sentence, and a space also closes a clause inside a sentence. The comma appears in numbers and lists, the question mark appears in chat more than in print, and the full stop appears after an abbreviation and almost nowhere else. A reader tells a sentence break from a clause break by the words on either side of the space.

The spacing rules taught in school put the space after a complete sentence, before a conjunction such as แต่ or เพราะ, and around a number or a quotation. A list gets one between its items. A well-written paragraph is a chain of short spaced phrases, and the sentence boundary inside the chain carries no mark of its own.

This becomes a problem the moment text is spoken as it arrives. English streaming code waits for a period. Thai streaming code has nothing to wait for.

## Why the boundary decides the latency

A live voice agent sends text to the speech socket as the language model produces it, and the socket synthesizes in legs. A leg starts when the buffer holds something worth speaking. The listener hears the first leg after the model's first sentence plus one synthesis pass, and every boundary after that is a place where the voice takes a breath.

Two things go wrong at a bad boundary. A leg cut too early speaks half a clause, pauses, and speaks the rest with the pitch reset, which sounds like a hesitation. A leg cut too late waits for text the model is still writing, and the silence before the first word grows with every character the model adds.

The socket flushes on three triggers, which are a newline in the frame, sentence-ending punctuation at the end of the buffer, and a buffered-length threshold. English dialogue trips the second trigger at every full stop. Thai dialogue trips neither of the first two and rides the length threshold, which suits a paragraph and arrives late for a reply of one sentence. The [API reference](https://paxalabs.com/docs/api/live) documents the three triggers and the `flush` frame that forces a leg by hand.

## Where a Thai sentence ends in dialogue

Spoken Thai marks the end of an utterance more clearly than written Thai does. A reply from an assistant ends on a final particle far more often than a paragraph of prose does. ครับ and ค่ะ close a polite statement, คะ and ครับ close a polite question, นะ and สิ and เถอะ soften or urge, and ล่ะ and ไหม and มั้ย ask. A particle followed by a space is the strongest boundary signal a Thai stream carries.

- A final particle followed by a space: ค่ะ ครับ คะ นะคะ นะครับ สิ เถอะ ล่ะ ไหม มั้ย หรือเปล่า. In a polite reply this closes nearly every sentence.
- A newline. A language model writes one when asked to, and the socket flushes on it without any client logic.
- A space before a sentence-opening word such as แต่ แล้ว ส่วน ถ้า เพราะ ดังนั้น. This is a clause boundary at least, and a safe pause on a long reply.
- A closing quotation mark or bracket followed by a space.

Particles carry the register of the reply, and the [politeness post](https://paxalabs.com/guides/thai-politeness-in-translation) explains why a formal assistant ends nearly every sentence on one. That habit is what makes the particle rule reliable. An assistant instructed to write polite Thai produces its own boundaries.

## Where a break sounds wrong

A space is a pause, and the [script guide](https://paxalabs.com/guides/writing-for-thai-text-to-speech) covers how a script uses one. A leg boundary is a longer pause with a pitch reset, and there are places a speaker would never put one.

- Before a final particle. A flush that lands before ค่ะ leaves the particle as its own leg, spoken alone after a gap.
- Inside a number, an amount, or a time. ๒,๕๐๐ บาท and 14:30 น. are one spoken unit.
- Between a title and a name, as in คุณ สมชาย, or between a name and the particle that follows it.
- After a conjunction. A leg that ends on แต่ hangs in the air until the next leg arrives.
- Between a verb and its object across a clause space, where a reader runs straight on.

A short reply is one leg. Splitting a twelve-word answer into three legs costs nothing extra in credits and gains nothing in latency, because the first leg already started the voice.

## Ask the model to write the breaks

The cheapest boundary detector is the language model itself. Instruct it to end every sentence with a newline and to keep each line to one or two clauses. The socket flushes on the newline, each leg is one sentence, and the client carries no Thai-specific logic at all.

The client still sends a `flush` frame at the end of the turn, because the last sentence can end without a newline when the model stops. Flushing an empty buffer is a safe no-op, and the `flushed` event confirms that the buffer drained.

A model that ignores the instruction on a long answer still hits the length threshold, and the particle rule above is the fallback for a client that wants to flush sooner. Check the particle, then the space after it, and never the particle alone. ค่ะ in the middle of a quoted line is a particle inside speech, and the space is what says the sentence closed.

## What an interruption costs

A speaker talks over the reply. The client sends `cancel`. The leg being spoken stops, and its charge stays, because that text was synthesized before the interruption arrived. The buffered text that had not started was never charged, and it is discarded. The connection stays open, and the next `text` frame begins a new leg. The [live guide](https://paxalabs.com/docs/live-streaming#interrupt) walks through the exchange.

Sending one sentence per leg bounds the cost of an interruption to the sentence being spoken. Credits follow characters however many legs carry them, and the 0.1 credit minimum applies once per connection. Each leg also counts as one request against the plan's [rate limit](https://paxalabs.com/docs/rate-limits), and a client that flushes after every word spends that limit without gaining anything a listener can hear.

## A turn, frame by frame

The trace below is one assistant turn. The first two sentences end on a newline the model wrote, and the socket flushes each one as it lands. The third sentence arrives without a newline, and the client's `flush` at the end of the turn closes it.

one turn on the live socket:

```
client  text     ได้เลยค่ะ\n
server  charged  leg 1
server  audio    ...
client  text     ร้านเปิดเก้าโมงเช้า
client  text     ถึงสองทุ่มค่ะ\n
server  charged  leg 2
server  audio    ...
client  text     วันอาทิตย์ปิดนะคะ
client  flush
server  charged  leg 3
server  audio    ...
server  flushed
```

Each `charged` event is the receipt for one leg. The listener hears ได้เลยค่ะ while the model is still writing the opening hours, which is the whole point of streaming a reply.

## Next steps

- Read the [live streaming guide](https://paxalabs.com/docs/live-streaming) for the session lifecycle and the [reference](https://paxalabs.com/docs/api/live) for every frame.
- Read the [politeness post](https://paxalabs.com/guides/thai-politeness-in-translation) to set the register the particles come from.
- Open the [companion page](https://paxalabs.com/ai-companion) to hear a Thai reply spoken in the demo voices.

# Thai PDFs into a search index: OCR, chunking, and the missing spaces

How to turn scanned Thai documents into chunks a search index or a language model can use, when the text has no spaces to cut on.

Published 2026-09-07. Paxa Labs.

Most Thai source documents a company wants to search arrive as scans. Government circulars, contracts, board minutes, and older annual reports are PDFs of paper, and the ones with a text layer often carry a broken one. Once the pages are read, the text has no spaces between words and no full stops between sentences, and the chunker written for English cuts it in the wrong places.

A Thai document goes from a scan to a chunk in an index in five steps. Read the pages as structure, see why fixed windows fail on Thai, choose where to cut, decide what to carry with each chunk, and normalize before anything is indexed. The examples use [Paxa OCR Lite](https://paxalabs.com/docs/ocr) for the reading. The chunking applies to any reader that returns structure.

## Scans and broken text layers

A Thai PDF is one of two things. A scan has no text at all, and every character on the page has to be read from pixels. A born-digital PDF has a text layer, and Thai text layers fail in the ways the [extraction guide](https://paxalabs.com/guides/thai-pdf-text-extraction) catalogs. Tone marks are stored out of order, legacy fonts map bytes to the wrong characters, and columns come back interleaved. Both cases end in the same place. The page has to be read as a page.

A pipeline that tries the text layer first and falls back to OCR on failure needs a way to detect the failure. A corrupted Thai text layer looks like text to every check short of a Thai speaker reading it. Reading every page the same way costs a few credits per page and removes the branch.

## Read the document as blocks

Ask for structure at the reading step. With `output` set to `"structured"`, [POST /v1/ocr](https://paxalabs.com/docs/api/ocr) returns each page as typed blocks in reading order. The blocks are headings with a level, paragraphs, lists with their items, tables as rows of cells, and figures with their captions. The lines below are the kind of blocks one page of a regulation returns.

one page as structured blocks:

```
{ "type": "heading", "level": 1, "text": "ระเบียบการเบิกค่าเดินทาง" }
{ "type": "heading", "level": 2, "text": "หมวด ๒ อัตราค่าพาหนะ" }
{ "type": "paragraph", "text": "ข้อ ๗ การเดินทางโดยรถไฟให้เบิกได้ตามที่จ่ายจริง ..." }
{ "type": "table", "rows": [["ประเภท", "อัตรา (บาท/กม.)"], ["รถยนต์ส่วนตัว", "๔"], ["รถจักรยานยนต์", "๒"]] }
```

One request reads at most 50 pages and 10 MiB, and a longer document is sent as parts. Keep the page numbers continuous across the parts, because the page is what a citation points at. The Markdown output carries the same reading with the structure as heading marks and pipe tables, and a pipeline that already parses Markdown can start there. The blocks save the parse.

## Why fixed windows fail on Thai

The usual chunker takes a window of a few hundred characters and slides it forward with some overlap. It trusts that a boundary near a space or a period lands near a meaning boundary. English gives it a space every five characters and a period every twenty words. Thai gives it a space every clause and nothing between words. A window that ends on a character count ends inside a word most of the time, and inside a sentence almost every time.

The overlap hides the damage without repairing it. A word cut in half appears whole in the next chunk, and the half in this one is a string no query will match. A sentence split across two chunks has its subject in one and its verdict in the other, and a retrieval that returns one of them returns a fragment that answers nothing.

Chunkers that count tokens have the same problem one step removed. The token boundary is a property of the tokenizer, and it has no more idea where a Thai word ends than the character count does.

## Cut on the structure the reader returned

The document already carries its boundaries. Headings open sections, paragraphs are units of meaning the author chose, and a table is one object. A chunker that walks the blocks needs three rules and no Thai dictionary.

- A paragraph is the default chunk. Merge short consecutive paragraphs under one heading up to a size cap. A merge stops at a heading.
- A table is one chunk, whole, with its header row kept. A row alone loses the column names, and a table split by size loses the rows that answer the question.
- A list is one chunk when it fits. When it does not, split between items and keep each item whole.

A paragraph that exceeds the cap on its own is the one place a cut inside prose is needed. Cut on the Thai space, which is a clause boundary at least and a sentence boundary often, and prefer the space nearest the cap from below. That keeps a clause together, and it never lands inside a word. The [segmentation post](https://paxalabs.com/guides/thai-word-segmentation) explains why a cut inside a word is worse in Thai than a cut inside a sentence.

The size cap is set by the model that reads the chunks and the number of chunks returned per query. Set it in characters of Thai, measured on the corpus. A Thai character carries more of a word than a Latin one, and a cap tuned on English prose is loose on Thai.

## Carry the heading trail and the page

A paragraph under หมวด ๒ อัตราค่าพาหนะ means something different from the same paragraph under หมวด ๓. Prefix each chunk's text with its heading trail when it goes to the embedding, and store the trail as a field for display. Store the page too. A user who asks where a rule came from wants the page, and a reviewer who checks a reading wants to open the scan at it.

one chunk in the index:

```
{
  "doc": "travel-regulation-2569.pdf",
  "page": 3,
  "trail": ["ระเบียบการเบิกค่าเดินทาง", "หมวด ๒ อัตราค่าพาหนะ"],
  "text": "ข้อ ๗ การเดินทางโดยรถไฟให้เบิกได้ตามที่จ่ายจริง ...",
  "match": "ข้อ 7 การเดินทางโดยรถไฟให้เบิกได้ตามที่จ่ายจริง ..."
}
```

Numbered clauses such as ข้อ ๗ are worth a field of their own in a regulation or a contract, because a query often names the clause. The reader returns the number as printed. The pipeline reads it off the start of the paragraph.

## Normalize a matching copy, keep the original

A Thai document carries several spellings of the same value, and a query uses one of them. Build a second copy of each chunk for matching, and leave the original for display and citation.

- Thai digits to Arabic. ๒๕๖๙ and 2569 are the same year, and a document mixes the two on one page.
- Buddhist Era years carried as printed, with the Common Era year in a separate field. Subtracting 543 in the text itself breaks the citation.
- The vowel อำ as one code point. Some documents store it as นิคหิต followed by สระอา, which Unicode normalization leaves alone, and the two forms never match.
- Unicode NFC, which fixes the order of stacked marks a broken text layer produced.
- Whitespace collapsed to one space, and zero-width characters removed. A reader returns none, and a text layer returns many.

Run the same normalization on the query. A mismatch between the two sides is the most common reason a term that is visibly on the page is not found.

## Lexical, vector, or both

A vector index embeds the chunk and needs no word boundaries. The embedding model reads the characters, and the chunk boundary above is the only Thai-specific decision. A lexical index stores terms, and a term is a word. A Thai lexical index therefore needs a segmenter on both the chunk and the query, the same one on both, and a rebuild when the segmenter changes.

Exact strings are where the lexical side earns its place. Clause numbers, document ids, tax ids, amounts, and names are what a vector index blurs and a term index nails. A hybrid that scores both and merges the lists handles a regulation well, and the normalized copy is what the lexical side indexes.

## What a fifty-page report costs to read

A page costs 6.5 credits whatever it holds, and the page count is known before the charge. A 50-page report is 325 credits, which is $0.33. Read a document once, and rebuild the chunks from the stored blocks whenever the chunking rules change. Re-read a page only when the page changes.

Store the blocks as well as the chunks. The chunk cap, the trail format, and the normalization all change as the index is tuned, and each change is a rebuild from stored blocks at no cost.

## Next steps

- Read the [OCR guide](https://paxalabs.com/docs/ocr) for the outputs and limits, and the [reference](https://paxalabs.com/docs/api/ocr) for the block fields.
- Read the [extraction post](https://paxalabs.com/guides/thai-pdf-text-extraction) for what a Thai text layer gets wrong.
- Open the [documents tool](https://paxalabs.com/app/documents) to read a page and see the blocks it returns.

# What a Thai voiceover costs in 2026: studio, freelancer, AI

Thai voice over rates from public listings, per spot and per minute, beside what the same 30-second spot, e-learning module, and audiobook cost as generated speech.

Published 2026-09-02, updated 2026-10-01. Paxa Labs.

A Thai voiceover in 2026 costs from ฿500 for a 30-second freelance read to ฿6,000 for an advertising spot package. A studio quotes from ฿1,000 for e-learning and from ฿3,000 for a spot. Generated speech prices the same 30 seconds at about 3 credits, which is $0.003.

This guide lays the two side by side. The human figures come from public listings retrieved on 2 September 2026 and linked beside each number. The generated figures come from the published per-character rate and the speaking rate this site prices audio with, and both move together when either constant moves.

## How human voice work is priced

Human voice work is priced by the unit the client can count. A commercial spot is priced per spot at a fixed length, usually 15, 30, or 60 seconds. Narration for e-learning, corporate video, and documentaries is priced per finished minute of delivered audio. A long project such as an audiobook is priced per project, per finished hour, or as a share of sales.

The headline figure is rarely the whole invoice. A listing states how many revisions are included, and a script change after delivery is a new session. Usage rights are a separate line for broadcast and paid media, a rush turnaround carries its own surcharge, and a studio booking adds engineer time to the artist's fee.

- Revisions included, stated as a count. One listing below includes two tone adjustments and one script change.
- Usage rights for broadcast and paid placement, quoted per term and renewed.
- Turnaround, one to two days on the listings below, with rush delivery at a surcharge.
- Studio and engineer time whenever the artist records somewhere other than a home booth.
- Pickups after the client hears the cut, which are a new booking on most rate cards.

## Thai voiceover rates from public listings

The table holds every figure found on six public pages on 2 September 2026. Each row is one listing's own price, and a listing is the opening position in a negotiation. Read the spread as the range a buyer meets on the first day of looking.

| Job | Unit | Figure | Source |
| --- | --- | --- | --- |
| Spot or short read | 30 seconds | ฿500 | [a freelance listing](https://www.thaifreelanceagency.com/freelances/%E0%B8%A3%E0%B8%B1%E0%B8%9A%E0%B8%9E%E0%B8%B2%E0%B8%81%E0%B8%A2%E0%B9%8C%E0%B9%80%E0%B8%AA%E0%B8%B5%E0%B8%A2%E0%B8%87-%E0%B9%82%E0%B8%86%E0%B8%A9%E0%B8%93%E0%B8%B2-%E0%B8%AA%E0%B8%9B%E0%B8%AD%E0%B8%95%E0%B9%82%E0%B8%86%E0%B8%A9%E0%B8%93%E0%B8%B2-%E0%B8%AD%E0%B8%B7%E0%B9%88%E0%B8%99%E0%B9%86/) |
| Narration | Per minute | ฿1,000 (฿1,500 for 1:30, ฿2,000 for 2:00) | [a freelance listing](https://www.thaifreelanceagency.com/freelances/%E0%B8%A3%E0%B8%B1%E0%B8%9A%E0%B8%9E%E0%B8%B2%E0%B8%81%E0%B8%A2%E0%B9%8C%E0%B9%80%E0%B8%AA%E0%B8%B5%E0%B8%A2%E0%B8%87-%E0%B9%82%E0%B8%86%E0%B8%A9%E0%B8%93%E0%B8%B2-%E0%B8%AA%E0%B8%9B%E0%B8%AD%E0%B8%95%E0%B9%82%E0%B8%86%E0%B8%A9%E0%B8%93%E0%B8%B2-%E0%B8%AD%E0%B8%B7%E0%B9%88%E0%B8%99%E0%B9%86/) |
| Any voice work | Starting price | ฿500 | [a marketplace category](https://fastwork.co/voice-over) |
| Any media, WAV delivery, three revisions | Starting price | ฿700 | [a freelance listing](https://fastwork.co/user/o9i1l16/voice-over-15381223) |
| Advertising spot, 15 or 30 seconds | Per project | ฿6,000 | [a freelance listing](https://fastwork.co/user/bellnice17/voice-over-42801369) |
| Presentation, infographic, corporate video | Per minute | ฿3,000 | [a freelance listing](https://fastwork.co/user/bellnice17/voice-over-42801369) |
| E-learning, VTR, company profile | From | ฿1,000 | [a studio's price page](https://mellowlystudio.com/) |
| Translation with voiceover | From | ฿2,000 | [a studio's price page](https://mellowlystudio.com/) |
| Advertising spot | From | ฿3,000 | [a studio's price page](https://mellowlystudio.com/) |
| Audiobook narration | Share of sales | 20% after VAT and payment fees | [an audiobook platform's narrator terms](https://www.mebmarket.com/?action=find_narrator) |

Two of the six pages price the same 30 seconds twelve times apart. A short read is ฿500 on one freelance listing and ฿6,000 as a spot package on another. The difference is the artist, the deliverable, and what the fee covers, and each listing states all three.

## How to compare two quotes

Two quotes for the same script rarely price the same thing. Five questions put them on one footing, and every one of them moves the number.

- What the rights cover. A read licensed for one platform for one year and a buyout for all media are different products at different prices.
- What the minute is. A finished minute of delivered audio and an hour of studio time are billed on different clocks, and a slow read fills more minutes.
- How many revisions are inside the fee, and what counts as a revision. A tone change and a rewritten line are usually different rows.
- What arrives. A raw WAV, a cleaned and levelled file, and a mixed track with music are three deliverables, and the edit is often the largest hidden line.
- When it arrives, and what a rush costs. Two of the listings above state one to two days as the base.

Ask the same five of a generated read. The rights are the account's plan, and the minute is the text divided by the speaking rate. Revisions are re-reads at the same rate, the file is the format the request asked for, and the turnaround is the session.

## What an AI voice costs per minute

Generated speech is priced per character of text, at 10 credits per thousand characters, where 1,000 credits are one dollar. A minute of Thai narration runs about 606 characters of text, a rate measured on the free grant and in line with published corpus work on Thai speech ([CCOST](https://zenodo.org/records/17366698), [JASA](https://pubs.aip.org/asa/jasa/article/158/2/1204/3359743/Effects-of-speaking-rate-on-f0-trajectories)). One minute of audio therefore costs about 6.1 credits, which is $0.0061.

There is no session, no booking, and no per-project floor. The one floor is 0.1 credits per request, which is what a two-word line costs. A script that changes after the first listen costs another read at the same rate, and [the credits guide](https://paxalabs.com/docs/credits) walks through how a request is charged and refunded.

> The characters-per-minute figure is an estimate for Thai narration at a natural pace. A slower read, a meditation script, or a line with long pauses spends fewer characters per minute, and a fast promo read spends more. The credit cost follows the text, and the minutes follow the read.

## Three jobs, priced three ways

| Job | Text | Freelance floor | Package or studio | Generated |
| --- | --- | --- | --- | --- |
| 30-second spot | 303 characters | ฿500 | ฿3,000 to ฿6,000 | 3 credits ($0.003) |
| 10-minute e-learning module | 6,060 characters | ฿10,000 at ฿1,000 per minute | ฿30,000 at ฿3,000 per minute | 61 credits ($0.06) |
| 8-hour audiobook | 290,880 characters | ฿480,000 at ฿1,000 per minute | 20% of sales on a platform deal | 2,909 credits ($2.91) |

The freelance column applies the listing's per-minute rate to the whole job. A real audiobook quote is negotiated per project or paid as a share of sales, and the platform terms above show one such deal. The generated column is the published rate times the text, with no rounding beyond the per-request floor.

The gap grows with length. On a spot the two sit a few hundred baht apart at the low end. On an audiobook the generated read costs less than one minute of the human per-minute rate.

## A year of updates

The spot is priced once. The catalogue is priced every quarter. Take 200 minutes of e-learning across twenty ten-minute modules, where a few lines in every module change each quarter with a price, a policy, or a product name.

With a human artist each changed module is a pickup. At the per-minute rates above with a one-minute minimum per module, twenty modules a quarter is 80 pickup minutes a year. That is ฿80,000 at the freelance rate and ฿240,000 at the corporate rate. Studio time comes on top, and so does a second artist when the original is unavailable.

With generated speech the whole catalogue is re-read every quarter, because a re-read costs the same as a pickup and keeps every module in one voice at one pace. That is 800 minutes of audio a year, 4,848 credits, or $4.85. The line that changed and the line that did not cost the same, and nothing waits for a booking.

## What the free credits buy

A new account starts with 100 credits, a one-time grant. At the published rate that is about 10,000 characters of text, or roughly 16 minutes of narration at the speaking rate above. It covers about 33 reads of a 30-second spot, enough to hear the same script in most of the roster before choosing.

The free grant is for personal use and evaluation. Any purchase unlocks commercial use for the account, including audio made on the free credits.

## Where a human voice still wins

- A campaign built around a face. When the voice is the person in the film, the fee buys the person.
- Live direction in the booth. A director who wants the third word landed harder gets it in one take, with the artist listening.
- A licensed celebrity or character voice, where the contract is the product.
- Singing, chanting, and anything carrying a melody.
- A read the client will judge against a specific human performance they already have in mind.

Those jobs are a small share of voice spending. The bulk is e-learning modules, product videos, IVR menus, listings, and updates to all of the above, and that is the work where the rate table is the whole decision.

## What generated speech changes

A script change costs another read at the same per-character rate, with no session fee and no pickup schedule. A module that changes every quarter is re-read every quarter for the price of the changed lines.

Casting happens before the meeting. All 34 voices on the roster read the same script, and the client hears every candidate on the same text, which a booking budget never allowed. [The voices page](https://paxalabs.com/voices) lists them with a sample line each.

Thai and English sit in one line. Paxa TTS Flash reads a product name, an English phrase, and the Thai around them in one pass. A human session covers the same line by casting a bilingual artist or splicing two reads.

Volume stops being a schedule problem. An eight-hour audiobook is minutes of generation and a day of listening, and the listening is where the effort moves.

## Hidden costs on both sides

| Cost | Human session | Generated speech |
| --- | --- | --- |
| Revisions | Included up to a stated count, then a new session | Another read at the per-character rate |
| Usage rights | A separate line for broadcast and paid placement, renewed by term | Commercial use for the account from the first purchase |
| Turnaround | One to two days on the listings, rush at a surcharge | The same session, in the playground or through the API |
| Studio and engineer | Booked by the hour when the artist records in a studio | None |
| Review | The client hears one take per session | Someone listens to the whole cut, and that time is real |
| Pickups | A new booking for a mispronounced name | A respelling in the script, then one more read |

The cost the generated column hides is attention. A human artist catches a mispronounced name in the booth. A generated read needs a listener who knows the names, and [the guide to writing for a Thai AI voice](https://paxalabs.com/guides/writing-for-thai-text-to-speech) covers the fixes a script can carry.

## Next steps

- Read [the pricing page](https://paxalabs.com/pricing) for the plans and what a month of narration costs.
- Type a line into [the box on the text to speech page](https://paxalabs.com/tts) and hear it in the demo voices without an account.
- Open [the playground](https://paxalabs.com/app/playground) to run a full script, pick from all 34 voices, and download the audio.
- Compare the priced examples for [advertising](https://paxalabs.com/use-cases/advertising), [e-learning](https://paxalabs.com/use-cases/e-learning), and [audiobooks](https://paxalabs.com/use-cases/audiobooks).

# Choosing a Thai AI voice for the job, across all 34 voices

How to pick a Thai text to speech voice for ads, IVR, audiobooks, sleep, companions, games, regional campaigns, and English lines, from all 34 voices.

Published 2026-09-02, updated 2026-09-25. Paxa Labs.

The right Thai AI voice is the one cast for the job the line has to do. Paxa TTS Flash ships 34 voices, and each carries a catalog role that says what it was cast for, from a news bulletin to a bedtime story.

The roster is grouped here by job. Every voice links to its own page, where its published sample plays, and the whole roster plays at the end of this page. The [voices index](https://paxalabs.com/voices) lists all 34 with their sample lines, and the API returns the same catalog from [the voices endpoint](https://paxalabs.com/docs/api/voices).

## How to choose, in order

Decide in this order and most of the roster falls away before you play a single clip.

- The job first. A promo, an IVR menu, an audiobook chapter, and a meditation script ask for different pacing, and the catalog roles were cast on pacing.
- Then the register of your text. Thai carries politeness in its particles and pronouns. A line ending in ครับ or ค่ะ is polite in any voice, and a line ending in นะ is close in any voice. Fix the words before you pick the voice.
- Then gender, when the surface has a fixed persona. The roster holds 18 female and 16 male voices, and every job below offers both.
- Then language. 26 voices are Thai-first and read an English word inside a Thai sentence the way a Bangkok speaker does. The 6 English-first voices read a whole English line without a Thai accent, and read Thai with one. The 2 Mandarin Chinese voices do the same for Mandarin.
- Then accent. 4 voices carry a regional register for a campaign that speaks to one region.

## Voices for ads and promos

[Nom Yen](https://paxalabs.com/voices/nomyen) is the roster's female lead, cast for promos, social clips, and everyday product speech. It is the voice the landing page opens on, and the one to start with when a spot has to sound like the product itself.

[Moo Ping](https://paxalabs.com/voices/mooping) brings confident street energy to ads and shorts, the read a 15-second vertical clip wants. [Tom Yum](https://paxalabs.com/voices/tomyum) is the fast, chatty best-friend voice for drama recaps, entertainment news, and social clips. [Massaman](https://paxalabs.com/voices/massaman) is the deep, steady leading-man voice for trailers and drama, cast for the spot that has to carry weight in one sentence.

A short spot has room for one voice. Cast it on the register the product already speaks in, then hear the same script in the two alternatives before the client meeting. The [advertising use case](https://paxalabs.com/use-cases/advertising) walks a spot through the whole roster, and the [creators page](https://paxalabs.com/use-cases/creators) covers a channel's own voice.

## Voices for IVR and announcements

[Thong Ek](https://paxalabs.com/voices/thongek) is the catalog's news anchor, a crisp, authoritative read for bulletins and corporate updates. An IVR menu is a corporate update read aloud, and a queue message written in polite Thai lands in this voice without sounding hurried.

[Massaman](https://paxalabs.com/voices/massaman) is cast for announcements as well as trailers, and suits a public-address line in a station or a mall. [Khanom Krok](https://paxalabs.com/voices/khanomkrok) is the calm, unhurried male lead, the choice for a hold message that has to stay patient for the fourth repeat.

For an English support line, see the English-first voices below. The [call centers use case](https://paxalabs.com/use-cases/call-centers) and the [announcements use case](https://paxalabs.com/use-cases/announcements) cover the surfaces themselves.

## Voices for audiobooks and long reads

[Foi Thong](https://paxalabs.com/voices/foithong) is the captivating narrator for long reads, and the pick when a chapter has to hold attention for forty minutes.

[Khanom Krok](https://paxalabs.com/voices/khanomkrok) reads documentary and heritage narration at an elder's pace. [Panang](https://paxalabs.com/voices/panang) is the polished, theatrical voice with a stage actor's gravitas, cast for serious storytelling and the audio novel that wants a performance.

A long read is where pacing matters most. Play a whole paragraph in the [playground](https://paxalabs.com/app/playground) before you decide, because a voice that sounds right on one sentence can tire over a chapter. The [audiobooks use case](https://paxalabs.com/use-cases/audiobooks) and the [publishers page](https://paxalabs.com/use-cases/publishers) price a full book.

## Voices for sleep, meditation, and ASMR

[Lod Chong](https://paxalabs.com/voices/lodchong) is the slow, close-mic voice cast for mindfulness and sleep. For wind-downs and bedtime, [Woon](https://paxalabs.com/voices/woon) reads in a soft near-whisper. The male voice of the three is [Sangkaya](https://paxalabs.com/voices/sangkaya), quiet and close-mic, cast for ASMR and calm narration.

All three are written for a microphone a few centimeters from the mouth, and they read a slow script slowly. The [meditation page](https://paxalabs.com/meditation) plays them side by side and shows the speed setting a slower read uses.

[Khao Niao](https://paxalabs.com/voices/khaoniao) is a low, unhurried male voice cast for guided breathing, wellbeing narration, and slow documentary. It suits the script that tells the listener what to do next.

## Voices for companions and late-night reads

[Sanae Chan](https://paxalabs.com/voices/sanaechan) is the warm, magnetic voice with a late-night glow, and the voice the [AI companion page](https://paxalabs.com/ai-companion) opens on. For late-night reads, [Tub Tim Krob](https://paxalabs.com/voices/tubtimkrob) brings a low, intimate delivery. The male option is [Oliang](https://paxalabs.com/voices/oliang), the relaxed low drawl of late-night radio.

A companion sounds close because its lines are written close, with the pronouns and particles Thai uses between friends. The voice carries that register; it does not invent it. The [companions use case](https://paxalabs.com/use-cases/companions) shows the four registers on one script.

## Voices for characters and games

[Luk Chup](https://paxalabs.com/voices/lukchup) is the light, childlike character voice for cartoons and playful spots. [Bua Loi](https://paxalabs.com/voices/bualoi) is the sweet, youthful voice for characters and light stories. [Panang](https://paxalabs.com/voices/panang) returns here for the narrator or the antagonist who needs a stage voice.

A cast needs contrast more than it needs range. Two characters on the same voice blur, and two characters on a light voice and a deep one read as two people at once. The [games and apps use case](https://paxalabs.com/use-cases/games-apps) and the [interactive fiction page](https://paxalabs.com/use-cases/interactive-fiction) cover casting a whole script.

## Voices for regional campaigns

[Som Tam](https://paxalabs.com/voices/somtam) and [Larb](https://paxalabs.com/voices/larb) carry the [Isan register](https://paxalabs.com/voices/accents/isan), one female and one male. [Khao Soi](https://paxalabs.com/voices/khaosoi) carries the soft [Northern cadence](https://paxalabs.com/voices/accents/northern), and [Roti](https://paxalabs.com/voices/roti) the quick [Southern cadence](https://paxalabs.com/voices/accents/southern).

Write the script in standard Thai. A regional voice reads standard text with its accent, and the [accents page](https://paxalabs.com/voices/accents) plays one Central Thai sentence in all four, with [Khanom Krok](https://paxalabs.com/voices/khanomkrok) as the control. A campaign that speaks to one region and a national campaign can share a script and differ only in the voice.

## Voices for English lines

[Donut](https://paxalabs.com/voices/donut) is the cheerful English voice for promos and demos. [Cookie](https://paxalabs.com/voices/cookie) is the kind, attentive English voice for support and onboarding. [Toast](https://paxalabs.com/voices/toast) reads tutorials in plain-spoken everyday English, and [Latte](https://paxalabs.com/voices/latte) is the polished voice for brand films.

The split is by how much English the line holds. A product name or an English phrase inside a Thai sentence belongs to a Thai-first voice, which reads it the way the sentence's speaker would. A whole English paragraph belongs to an English-first voice. The [English voices page](https://paxalabs.com/english-voices) plays all 6 on one line.

## Voices for events and podcasts

[Pad Thai](https://paxalabs.com/voices/padthai) is the Thai-English code-switching MC for events and lifestyle content, cast for the script that changes language mid-sentence and has to sound like it meant to. [Yoyo](https://paxalabs.com/voices/yoyo) is a conversational podcast host with an easy live-mic feel. It is the real voice of one of the lab's co-founders, and the one entry in the roster that is a person.

## Voices that take emotion tags

[Khanom Chan](https://paxalabs.com/voices/khanomchan) and [Kaprao](https://paxalabs.com/voices/kaprao) are experimental conversational voices that read emotion tags written into the text. A tag such as `[happy]` or `[sad:0.5]` changes the delivery from where it sits until the next tag, which suits companions and game characters whose lines already know their mood. Their delivery may change while we tune them. Pin a stable voice for audio that has to sound identical across releases. The [emotional voices](https://paxalabs.com/emotional-voices) page lists every tag and the delivery it sets.

## What a voice cannot change

Register comes from the words. The model has no style control, and the same voice reads ขอบคุณครับ and ขอบใจนะ as differently as those two lines are. Emotion comes from the words too, except on the experimental voices above, which also read emotion tags. If a read sounds wrong, change the text before you change the voice: the particle at the end, the pronoun at the start, a space where a breath belongs.

> A Thai space is a phrase break, and the voice pauses on it. A comma does the same job for a shorter beat. Neither changes the charge.

The [script guide](https://paxalabs.com/guides/writing-for-thai-text-to-speech) covers numbers, abbreviations, and English words in a Thai line, all of which read differently from how they look.

## One voice per surface

Hold one voice per brand surface. A product that greets in one voice, reads notifications in another, and narrates its tutorial in a third sounds like three products. Add a second voice for a second character, or for a second language, and for nothing else.

Keep the voice's slug in configuration next to the brand color. A slug is a stable public identifier, and a voice keeps its slug for as long as it serves.

## Voice by job, on one table

| Job | Voices | Gender | Language or accent |
| --- | --- | --- | --- |
| Ads and promos | Nom Yen, Moo Ping, Tom Yum, Massaman | Female, Male, Female, Male | Thai |
| IVR and announcements | Thong Ek, Massaman, Khanom Krok | Male, Male, Male | Thai |
| Audiobooks and long reads | Foi Thong, Khanom Krok, Panang | Female, Male, Male | Thai |
| Sleep, meditation, and ASMR | Lod Chong, Woon, Sangkaya, Khao Niao | Female, Female, Male, Male | Thai |
| Companions and late-night reads | Sanae Chan, Tub Tim Krob, Oliang | Female, Female, Male | Thai |
| Characters and games | Luk Chup, Bua Loi, Panang | Female, Female, Male | Thai |
| Regional campaigns | Som Tam, Larb, Khao Soi, Roti | Female, Male, Female, Male | Isan, Isan, Northern, Southern |
| English lines | Donut, Cookie, Toast, Latte, Espresso, Mocha | Female, Female, Male, Male, Male, Female | English |
| Mandarin lines | Tao Huay, Oolong | Female, Male | Mandarin Chinese |
| Events and podcasts | Pad Thai, Yoyo | Female, Male | Thai and English |
| Emotion tags (experimental) | Khanom Chan, Kaprao | Female, Male | Thai |

Every voice, with its published sample line. Press play on a row to hear it. The roster is the same one [the voices endpoint](https://paxalabs.com/docs/api/voices) returns.

| Voice | id | Gender | Language | Description |
| --- | --- | --- | --- | --- |
| Khanom Krok | khanomkrok | Male | Thai | Calm, unhurried elder voice and the roster's male lead: documentary, heritage storytelling, and narration. |
| Nom Yen | nomyen | Female | Thai | Bright, energetic voice and the roster's female lead: promos, social clips, and everyday product speech. |
| Foi Thong | foithong | Female | Thai | Captivating narrator for long reads and explainers. |
| Massaman | massaman | Male | Thai | Deep, steady leading-man voice for trailers, drama, and announcements. |
| Thong Ek | thongek | Male | Thai | Crisp, authoritative read for news bulletins and corporate updates. |
| Panang | panang | Male | Thai | Polished, theatrical delivery with a stage actor's gravitas. |
| Oliang | oliang | Male | Thai | Relaxed low drawl for chill content and late-night radio. |
| Sanae Chan | sanaechan | Female | Thai | Warm, magnetic voice with a late-night glow. |
| Tub Tim Krob | tubtimkrob | Female | Thai | Low, intimate delivery for late-night reads. |
| Moo Ping | mooping | Male | Thai | Confident, streetwise voice for ads and shorts. |
| Bua Loi | bualoi | Female | Thai | Sweet, youthful voice for characters and light stories. |
| Luk Chup | lukchup | Female | Thai | Light, childlike voice for characters and playful spots. |
| Lod Chong | lodchong | Female | Thai | Slow, close-mic delivery for mindfulness sessions and sleep audio. |
| Woon | woon | Female | Thai | Hushed, breathy read for wind-downs and bedtime. |
| Sangkaya | sangkaya | Male | Thai | Quiet male voice for sleep tracks and slow narration. |
| Pad Thai | padthai | Female | Thai | Thai-English code-switching MC for events and lifestyle content. |
| Khao Niao | khaoniao | Male | Thai | Low, unhurried male voice for guided breathing, wellbeing narration, and slow documentary. |
| Tom Yum | tomyum | Female | Thai | Fast, hot, chatty best-friend voice for drama recaps, entertainment news, and social clips. |
| Som Tam | somtam | Female | Isan Thai | Isan-accented voice with local warmth. |
| Larb | larb | Male | Isan Thai | Isan-accented male voice for regional content. |
| Khao Soi | khaosoi | Female | Northern Thai | Northern-accented voice with a soft Lanna cadence. |
| Roti | roti | Male | Southern Thai | Southern-accented voice with a quick coastal cadence. |
| Donut | donut | Female | English | Cheerful English voice for promos and demos. |
| Cookie | cookie | Female | English | Kind, attentive English voice for support lines and onboarding. |
| Toast | toast | Male | English | Plain-spoken everyday English voice for tutorials. |
| Latte | latte | Male | English | Polished English voice for brand films. |
| Espresso | espresso | Male | English | Deep, dark, unhurried English reader for long fiction, documentaries, and trailers. |
| Mocha | mocha | Female | English | Close, gentle, low-volume English voice for bedtime, wellness, and companion speech. |
| Tao Huay | taohuay | Female | Mandarin Chinese | Tender, melancholy Mandarin voice for drama recaps, audio novels, and companion speech. |
| Oolong | oolong | Male | Mandarin Chinese | Low, rich Mandarin narrator for audio novels, brand reads, and late-night stories. |
| Tako | tako | Female | Thai | Easygoing reader for audiobooks, recaps, and explainers. |

Experimental: **Khanom Chan** (`khanomchan`, Female, Thai). Natural conversational voice that changes mood with emotion tags written into the text: happy, sad, angry, or afraid.

Experimental: **Kaprao** (`kaprao`, Male, Thai). Easygoing male voice that changes mood with emotion tags written into the text: happy, sad, angry, or afraid.

Special: **Yoyo** (`yoyo`, Male, Thai). One of Paxa Labs' co-founders: a conversational podcast host with an easy live-mic feel.

## Before you decide

- Name the job before you name the voice, and start from the two or three voices cast for it.
- Write the line in the register you want, particles included, and only then compare voices on it.
- Type your own sentence into the box on [the text to speech page](https://paxalabs.com/tts). It speaks 9 of the voices with no account.
- Open the full roster of 34 in the [playground](https://paxalabs.com/app/playground) for a longer script, a whole paragraph, and audio you can download.
- Hold one voice per surface, and write its slug into configuration once.

# How to write a script for a Thai AI voice

Ten script rules for Thai text to speech cover where to put spaces and how to write numbers, dates, abbreviations, and English words the AI voice reads right.

Published 2026-09-02. Paxa Labs.

A Thai AI voice reads what the script says, and a Thai script says less than it looks. Written Thai marks no word boundaries, writes some vowels nowhere, and leaves the reading of a number or an abbreviation to the reader. Ten rules below settle those gaps before the model has to. Every example line is 50 characters or fewer, the limit of the box on [/tts](https://paxalabs.com/tts). Each one can be pasted there and heard.

The rules apply to any Thai voice and were written for Paxa TTS Flash. The reading facts behind them are the ones published on the [product page](https://paxalabs.com/text-to-speech).

## A space is a pause

Thai spends the space character on phrase breaks, the job a comma does in English. A voice pauses at a space and runs through everything between two spaces as one breath. That gives the writer direct control of phrasing, and it also means a space in the wrong place cuts a word in half.

the space decides the phrase:

```
before  วันนี้ฝนตกหนักมากรถติดทั้งเมือง
after   วันนี้ฝนตกหนักมาก รถติดทั้งเมือง

one breath becomes two phrases

wrong   วันนี้ฝนตกหนักมาก รถติดทั้งเมื อง

a space inside เมือง splits the word
```

A name inside a sentence reads cleanest with a space on each side. คุณ สมชาย stresses the name; คุณสมชาย runs it into the title. The same holds for a place or a product name that the listener needs to catch on the first hearing.

Put a space where a reader would breathe: after a clause, before a conjunction such as แต่ or แล้ว, and around a name that carries its own stress. Leave a compound alone. ร้านอาหาร, โทรศัพท์มือถือ, and กรุงเทพมหานคร each read as one word.

## Full stops and question marks set the fall

Thai prose usually ends a sentence with a space and nothing else. A voice needs more. A full stop tells it the pitch falls and the next sentence starts fresh; a question mark tells it to lift. A script for speech may punctuate where a printed page would not.

punctuation the page omits, the voice needs:

```
before  ร้านเปิดกี่โมง พรุ่งนี้หยุดไหม
after   ร้านเปิดกี่โมง? พรุ่งนี้หยุดไหม?

before  ขอบคุณที่โทรมา เราจะติดต่อกลับ
after   ขอบคุณที่โทรมา. เราจะติดต่อกลับ.
```

An exclamation mark raises the line and suits a promotion. Three dots hold the voice on the last syllable, which works once in a bedtime story and wears out in a menu. A comma inside a Thai sentence does nothing a space does not already do, and a stray one can read as a pause in the wrong place. Use the space for pauses and keep the comma for numbers.

## Numbers, dates, and prices

A number has more than one reading, and the script decides which one the voice gets. A year reads as a quantity, a phone number reads digit by digit, and a quantity ending in one takes เอ็ด in place of หนึ่ง. Thai digits and Arabic digits read the same. Use whichever the audience expects, and keep to one kind within a script.

| Written | How it reads | What to write |
| --- | --- | --- |
| พ.ศ. 2569 | พอ-สอ สองพันห้าร้อยหกสิบเก้า | Keep it. A year reads as a quantity. |
| 1,250 บาท | หนึ่งพันสองร้อยห้าสิบบาท | Keep the comma; the unit follows the number. |
| ๑๐๑ | ร้อยเอ็ด | A trailing one in a quantity takes เอ็ด. Nothing to add. |
| 02 000 0000 | ศูนย์สอง ศูนย์ศูนย์ศูนย์ ศูนย์ศูนย์ศูนย์ศูนย์ | Space the groups; a phone number reads digit by digit. |
| 10150 | หนึ่งศูนย์หนึ่งห้าศูนย์ | Leave a postal code unspaced; it reads digit by digit. |
| ๑๖.๓๐ น. | สิบหกนาฬิกาสามสิบนาที | Keep the น. mark; it makes the point a clock time. |
| 3/4 | สามส่วนสี่ or สาม ทับ สี่ | Write the reading out when it matters: สามในสี่ or บ้านเลขที่ 3 ทับ 4. |

When two readings are both plausible, write the one you mean as words. A fraction, a house number with a slash, and a score all look alike as digits and read differently aloud. The written-out form costs a few characters and removes the guess.

A date reads day, month, year, and the era mark tells the voice which century it is in. 15 กรกฎาคม 2569 reads the year in full. Add ค.ศ. in front of a Western year, because 2026 read bare sounds like a Buddhist year from the past. A percentage reads เปอร์เซ็นต์ and a decimal reads จุด, so 7% and 3.5 need no rewriting.

## Abbreviations, and when to expand them

Thai abbreviates with a full stop, ฯ, or ฯลฯ, and each mark carries a reading rule. กรุงเทพฯ restores six syllables. ฯลฯ reads และอื่น ๆ at the end of a list and ละถึง between two items. ก.พ. has two accepted readings, the full month กุมภาพันธ์ and the letter names กอ-พอ, and a listener accepts either.

Expand an abbreviation when only one reading is right for your audience. A clinic reminder wants กุมภาพันธ์ in full. A news line can leave กทม. as it is, because กรุงเทพมหานคร is the only reading it has.

expand where one reading is required:

```
before  นัดครั้งถัดไป 14 ก.พ. ที่ รพ. เดิม
after   นัดครั้งถัดไป 14 กุมภาพันธ์ ที่โรงพยาบาลเดิม
```

## English words inside Thai

Thai business text carries English inside it: product names, job titles, and acronyms. Keep them in Latin script. A voice reads a Latin word as English and a Thai respelling as Thai, and the respelling often reads worse. An acronym reads letter by letter. `AI` and `HR` need no help.

keep English in its own script:

```
before  ส่งอีเมลหาเอชอาร์ก่อนประชุม
after   ส่ง email หา HR ก่อน meeting

before  เปิดแอปเวอร์ชันใหม่ได้แล้ว
after   เปิด app เวอร์ชันใหม่ได้แล้ว
```

Words that Thai has fully absorbed stay Thai. แท็กซี่, คอมพิวเตอร์, and เวอร์ชัน read well in Thai script because that is how Thai speakers say them. A brand name follows the brand's own spelling.

Some acronyms are spoken as words. NASA reads as two syllables and UNESCO as three, and a letter-by-letter reading sounds foreign to a Thai listener. Write those in Thai script, นาซา and ยูเนสโก, and the voice reads the word. A mixed name keeps each half in its own script: บริษัท Paxa Labs จำกัด reads the Thai frame in Thai and the name in English.

## ๆ and what it repeats

The repetition mark ๆ repeats a word, two syllables, or a whole phrase, and meaning sets the span. เด็กเล็ก ๆ repeats one word. ในวันหนึ่ง ๆ repeats two syllables. แต่ละวัน ๆ repeats the phrase. Write the mark with a space before it, as the standard orthography does, and write the repetition out when the span is in doubt.

write the span out when it could be misread:

```
before  ค่อย ๆ เดิน ช้า ๆ นะ
after   ค่อยค่อยเดิน ช้าช้านะ

both read the same here; the second
leaves the voice nothing to decide
```

## Particles and pronouns set the register and the gender

A Thai sentence carries its politeness in its last word and its speaker's gender in its pronoun. ค่ะ and ดิฉัน belong to a female speaker; ครับ and ผม to a male one. A script written with ครับ and read by a female voice sounds wrong before the first sentence ends. Match the line to the voice you pick on the [voices page](https://paxalabs.com/voices).

| Register | Line | Voice |
| --- | --- | --- |
| Formal, female | ยินดีต้อนรับค่ะ ดิฉันขอแนะนำบริการของเรา | Nom Yen |
| Formal, male | สวัสดีครับ ผมขอแจ้งข่าวประจำวันนี้ | Thong Ek |
| Casual, male | เดี๋ยวผมส่งไฟล์ให้นะ | Khanom Krok |

The particle does the work a style setting would do elsewhere. Write นะคะ and the read softens. Write ครับผม and it firms up. Drop the particle and the line reads as narration with no listener in the room.

Spell the female particle by its tone. ค่ะ closes a statement and carries a falling tone. คะ closes a question and follows นะ, with a high tone. ขอบคุณค่ะ and ใช่ไหมคะ are both right; the reverse spellings read with the wrong tone and a Thai listener hears the slip at once.

## How long a line should be

Short lines suit ads and prompts, because each one lands with its own stress. Narration reads better as full paragraphs of three to five sentences, where the voice can settle into a pace. One request takes up to 5,000 characters. A chapter longer than that splits at a heading or a paragraph, and a split inside a sentence is audible as a break in the read.

- An ad line is one clause, one idea, and a particle at the end.
- A menu prompt names the option first and the instruction second.
- Narration is written in paragraphs, with a space at every phrase and a full stop at every sentence.
- A list read aloud puts one item per line, with the item count written before the list.

## English lines belong to the English-first voices

A Thai voice reads a whole English sentence with a Thai accent, the way a Thai speaker would. That is right for one English word inside a Thai line and wrong for a support script written entirely in English. The roster carries [English-first voices](https://paxalabs.com/english-voices) for that work; Cookie and Toast read a support greeting in the register a native speaker expects.

> A single line that switches language halfway is a Thai line. Give it a Thai voice, and keep the English words in Latin script.

## Speed and timing

Pace is a request option. The script never has to fake it with punctuation. The `speed` field runs from 0.5 to 1.5 on the voice's own rate, and it changes nothing in the charge. A meditation read sits below 1; a news bulletin sits above it. Word timestamps mark where each word starts and ends, which is what a [subtitle track](https://paxalabs.com/subtitles) needs in a language that writes no spaces. The [timestamps guide](https://paxalabs.com/docs/timestamps) shows the three granularities.

Word timing suits subtitles and karaoke-style highlighting. Sentence timing suits a player that jumps between lines. Utterance timing marks the whole request and costs the least attention. Pick the coarsest one that does the job.

## Common mistakes at a glance

| Written | What you hear | Fix |
| --- | --- | --- |
| รถติดทั้งเมื อง | Two fragments where one word belongs. | Delete the space inside the word. |
| โทร 020000000 | A quantity in the tens of millions. | Space the digits into groups. |
| ประชุม 14 ก.พ. | The letter names, when the month was meant. | Write กุมภาพันธ์. |
| ส่งเมล์หาเอชอาร์ | Thai respellings that sound like neither language. | Write email and HR in Latin script. |
| สวัสดีครับ read by a female voice | A male particle in a female voice. | Write ค่ะ, or pick a male voice. |
| A 2,000-character block with no full stop | One long fall with no fresh starts. | End each sentence with a full stop. |

## Before you press play

- Read the line aloud once. Where you breathed, put a space.
- End every sentence with a full stop or a question mark.
- Write ambiguous numbers as words, and space phone numbers into groups.
- Expand an abbreviation when only one reading fits.
- Keep English words in Latin script.
- Match ครับ or ค่ะ to the voice you chose.
- Try each line in the box on [/tts](https://paxalabs.com/tts), then move longer scripts to the [playground](https://paxalabs.com/app/playground), which takes 5,000 characters and returns audio you can download.
- Developers integrating the read find the request fields in the [text to speech guide](https://paxalabs.com/docs/text-to-speech) and the [API reference](https://paxalabs.com/docs/api/text-to-speech).

# How to extract text from Thai PDFs and scans

Why copying text out of a Thai PDF returns broken marks, junk letters, and unspaced phrases, and how Thai OCR turns the page into text, headings, and tables.

Published 2026-09-02. Paxa Labs.

A Thai PDF gives up its text in one of two ways. A file with a text layer can be copied directly. A scanned file has to be read by OCR, which looks at the page as an image and writes the text back.

The catch is that the text layer of a Thai PDF often carries broken text, even when the page prints perfectly. Tone marks land in the wrong order, older fonts extract as Latin junk, phrases arrive as one unbroken token, and Thai and Arabic digits sit on the same line. Each failure below appears with the string it produces, followed by when OCR is the right tool and what document OCR returns for a real Thai invoice.

## The two kinds of Thai PDF

A PDF exported from a word processor, an accounting system, or a browser carries a text layer. The glyphs on the page are drawn from fonts, and the characters behind them are stored in the file. Select all and copy, and something comes out.

A PDF from a scanner, a phone camera, or a fax gateway is a container for images. The page is pixels. Select all finds nothing, and search finds nothing, until a reader has turned the pixels into characters.

Two quick checks tell them apart. Search the file for a word you can see on the page, and if the search fails on a word that is clearly there, the page is an image. Drag to select a line, and if the selection highlights the whole page as one rectangle, or nothing at all, the page is an image. Many real Thai documents are mixed, with a typed form as a text layer and a stamped, signed, or annotated section as an image on top of it.

## Why the text layer of a Thai PDF breaks

English extraction has one common failure, the missing space between columns. Thai extraction has four, and each one produces text that looks plausible until a Thai reader or a database sees it.

### Tone and vowel marks come out of order

A Thai syllable stacks marks above and below its consonant. The word `กุ้ง` (shrimp) is four code points in Unicode order, and a correct text layer stores them in that order. A PDF producer that lays out glyphs one at a time can store the tone mark before the vowel, because the mark was drawn first. Some producers do not store the marks as characters at all and paint them as positioned artwork.

one word, four code points, three storage orders:

```
กุ้ง   as written

U+0E01 ก   base consonant
U+0E38  ุ  vowel below
U+0E49  ้  tone mark above
U+0E07 ง   final consonant

ก ้ ุ ง     the same four, as one PDF stores them
ก ง         the same word, marks placed as art
```

Both cases extract as a string that renders almost right and matches nothing. A search for `กุ้ง` fails, a database that stores the string fails to join on it, and a downstream translation of it reads a different word. The page itself looks correct throughout.

### Legacy fonts extract as Latin junk

Thai documents from before Unicode was universal were set in TIS-620 and in fonts with their own private glyph maps. Those files still circulate, and government forms, contracts, and title deeds are reprinted from them. A PDF made from one has a text layer, and the bytes in it are Thai only to a reader that knows the code page. A generic extractor reads them as Latin-1 and produces the characters below.

a legacy font on the page and in the file:

```
กรุงเทพ        on the page
A1 C3 D8 A7 E0 B7 BE   in the file (TIS-620)
¡ÃØ§à·¾         after extraction
```

The junk is deterministic, and a table can map it back for the TIS-620 case. Font-private maps have no table. The visible page is the only reliable copy of the text, and that is the definition of a scan.

### There are no spaces between words

Thai writes words together and spends the space character on phrase and clause breaks. A correct text layer of an invoice returns `ใบแจ้งหนี้เลขที่` as one token. Any tool that splits on spaces, matches a word boundary with `\b`, or wraps at a fixed width is working on phrases it cannot see inside. The text is right and the tooling around it is wrong.

### Two numeral systems share a line

Thai documents use Thai digits (`๑ ๒ ๓`) for dates, quantities, and addresses and Arabic digits for money, in the same table, sometimes in the same cell. A date reads `๑๕ กรกฎาคม ๒๕๖๙`, in the Buddhist Era. A quantity of `๔` sits beside an amount of `3,000.00`. Latin runs are mixed in as well, from invoice numbers like `INV-2569-0107` to product names. Extraction that normalizes digits, or that assumes one script per field, silently changes values.

## When OCR is the right tool for a Thai PDF

| The file | What to do |
| --- | --- |
| Text layer, extracted text reads correctly | Use the text layer and keep the structure the producer stored |
| Text layer, marks out of order or missing | Treat the page as an image and OCR it |
| Text layer, Latin junk from a legacy font | Treat the page as an image and OCR it |
| Scanned or photographed page | OCR |
| Typed form with a stamped or handwritten layer | OCR the whole page, then compare with the text layer |

OCR reads the page the way a person does, from the pixels, and is indifferent to how the file stored its characters. That makes it the right tool for every row above except the first. It is also the only tool that returns the stamped, signed, and handwritten parts of a mixed page.

OCR is the wrong tool for a clean text layer, where it costs a vision pass to recover text the file already holds. Run the two checks first.

## What document OCR returns for a Thai page

Character recognition returns a string. Document OCR returns the page. Paxa OCR Lite reads the whole page in reading order and returns it as Markdown, with headings and tables kept, or as typed blocks (heading, paragraph, list, table, figure) for code to consume. The lines below are the first lines of the committed reading of a sample Thai invoice, unedited.

the reading of a Thai invoice, first lines:

```
# บริษัท ศตวรรษการค้า จำกัด (สำนักงานใหญ่)
เลขประจำตัวผู้เสียภาษีอากร 0 1055 64078 12 7

# ใบแจ้งหนี้
เลขที่ INV-2569-0107
วันที่ ๑๕ กรกฎาคม ๒๕๖๙

| ลำดับ | รายละเอียด | จำนวน | หน่วยละ | จำนวนเงิน |
| ๑ | ค่าบริการดูแลระบบรายเดือน กรกฎาคม ๒๕๖๙ | ๑ | 18,000.00 | 18,000.00 |
| ๒ | ค่าพื้นที่จัดเก็บข้อมูลส่วนเกิน | ๔ | 750.00 | 3,000.00 |

( สามหมื่นหกพันสามร้อยแปดสิบบาทถ้วน )
```

Three things in that excerpt are the ones that break text-layer extraction. The line items carry Thai digits for the running number and the quantity beside Arabic digits for the money, and both return as the digits printed. The date is in the Buddhist Era, and it returns as printed for the application to convert. The total in words, `สามหมื่นหกพันสามร้อยแปดสิบบาทถ้วน`, is one unspaced Thai string, and it returns as one line.

With `output` set to `structured`, the same page returns as typed blocks. The company name is a level one heading block, each label line is a paragraph block, and the line items are one table block whose rows are arrays of cell strings. Code reads the invoice number as the text after its label and the line items as the rows of that block, and no template per supplier is needed.

The table returns as a table. A reader that walks the page in pixel strips would flatten those five columns into one line per row and lose which number was the unit price. The full reading, and the sample page it was made from, are on the [invoice page](https://paxalabs.com/ocr/invoice).

## Checking a Thai OCR result

A reading is verbatim, and a document can be wrong on its own terms. These checks catch most problems in a Thai business document before the values reach a system.

- A Thai tax identification number is 13 digits. Strip the spaces and count. `0 1055 64078 12 7` passes.
- Line amounts equal quantity times unit price, and the subtotal, VAT at 7%, and grand total add up. A reading that disagrees with itself has misread a digit.
- A year above 2500 is Buddhist Era. Subtract 543 before storing it as a date. `๒๕๖๙` is 2026.
- The number of table rows matches the count of line items on the page. A merged row is the most common table error on a dense invoice.
- Thai digits and Arabic digits both parse as numbers. Convert them with a table. Hand conversion introduces errors.
- The amount in words matches the grand total. It is the one field a person wrote to catch exactly this class of error.

> A tax invoice is a legal document with fields the Revenue Code prescribes, and a plain invoice is a commercial one. The [tax invoice page](https://paxalabs.com/ocr/tax-invoice) lists the prescribed fields, which are the ones an audit will read back.

## What Thai OCR costs and what it accepts

The charge is per page. A page costs 6.5 credits, which is $6.50 per thousand pages, and the amount of text on the page does not change it. A new account starts with 100 free credits, which reads 15 pages.

One request takes a PDF, PNG, JPEG, or WebP of up to 10 MB and up to 50 pages. An image is one page. The page count is read from the file before the charge, and a PDF that wants a password is refused before any credit moves.

Accounts-payable teams that run every supplier invoice through this flow are described on the [invoice processing page](https://paxalabs.com/use-cases/invoices).

## How to extract text from a Thai PDF today

- Run the two checks. If the text layer reads correctly, keep it.
- Drop a broken or scanned page into the [playground](https://paxalabs.com/app/playground) and read the Markdown back. No code is needed for the first page.
- Choose `markdown` when a person or a language model reads the result next, and `structured` when code does.
- Read the [OCR guide](https://paxalabs.com/docs/ocr) for the request shape and the [API reference](https://paxalabs.com/docs/api/ocr) for every field and error.
- Run the checklist above on the first hundred documents, and keep the checks that fired.
- The [Thai OCR page](https://paxalabs.com/ocr) holds the witnessed reading of a full document and the twelve document types with sample readings.

# Translating into Thai at the right level of politeness

Thai politeness is written into the sentence through particles, pronouns, and vocabulary. How to choose a register before you translate, with examples.

Published 2026-09-02. Paxa Labs.

A Thai translation has to choose a level of politeness before it can write a single sentence. English carries most of its politeness in tone and word choice, and a neutral sentence stays neutral in print. Thai marks the relationship between speaker and listener inside the grammar: the pronouns, the sentence-final particles, and the verb itself all change with the register.

This means a translation into Thai cannot be neutral. Every rendered sentence sits at some level of formality, implies a speaker with a gender, and addresses a listener with a rank. A translation that is technically accurate and set at the wrong register reads as a bank talking like a teenager, or a game talking like a ministry. The register is a decision the translator has to make.

## Politeness in Thai is written into the sentence

The same action has several Thai verbs, each with its own level. To eat is `กิน` between friends, `ทาน` to a customer or a guest, and `รับประทาน` in an announcement or a formal notice. To die is `ตาย` in speech and `เสียชีวิต` in the news. To tell someone is `บอก` at home and `แจ้ง` in a letter from a company. A translator picks the tier for the whole document, and a reader hears the tier in the first line.

| Meaning | Casual | Polite | Formal |
| --- | --- | --- | --- |
| to eat | กิน | ทาน | รับประทาน |
| to die | ตาย | เสียชีวิต | ถึงแก่กรรม |
| to tell, to inform | บอก | แจ้ง | เรียนให้ทราบ |
| to give | ให้ | มอบ | มอบให้ |
| to know | รู้ | ทราบ | ทราบ |
| money | ตังค์ | เงิน | เงิน |

The verb tier is the least visible of the three signals because it hides inside ordinary sentences. It is also the one a non-Thai reviewer misses most often, since a bilingual dictionary lists all three verbs under the same English headword. The particles and pronouns are louder, and they are where most translation complaints begin.

## The particle ladder from ครับ to จ้า

A Thai sentence usually ends with a particle that has no dictionary meaning and carries most of the politeness. The particle also states the speaker's gender. `ครับ` marks a male speaker, `ค่ะ` a female speaker, and both are the default in customer-facing text. Dropping the particle turns a polite sentence into a flat one. Choosing the wrong one turns a hotel into a stranger.

| Particle | Speaker | Reads as | Typical use |
| --- | --- | --- | --- |
| ครับ | Male | Polite, neutral | Every polite statement or answer |
| ค่ะ | Female | Polite, neutral | Every polite statement or answer |
| คะ | Female | Polite, rising | Questions only, paired with ค่ะ |
| นะครับ | Male | Polite and soft | Reassurance, gentle instructions |
| นะคะ | Female | Polite and soft | Reassurance, gentle instructions |
| นะ | Either | Friendly, informal | Chat between peers, casual brands |
| จ้ะ | Either | Warm, familiar | Speaking to a child or a junior |
| จ้า | Either | Playful, informal | Social replies, casual retail chat |
| ฮะ | Male | Casual polite | Younger male speaker, relaxed |

Two details trip up most machine output. First, `คะ` with a high tone is the question form and `ค่ะ` with a falling tone is the statement form. Swapping them is the most common spelling error in Thai customer service text. Second, `นะ` softens a request, and a customer service line that omits it sounds like an order. A translation that ends `กรุณารอสักครู่ค่ะ` is polite. The same line ending `รอสักครู่` is a command.

## Which Thai pronoun a translation should use

English has one you and one I. Thai has a ladder for each, and the rung fixes the relationship. `ท่าน` is reserved for officials, executives, and letters that want distance. `คุณ` is the safe second person for a customer. `เธอ` and `นาย` belong to friends and fiction. On the first-person side `ดิฉัน` is a formal woman, `ผม` a polite man, `ฉัน` a neutral woman in writing, and `เรา` a company speaking as a company.

| Pronoun | Person | Gender | Register | Where it fits |
| --- | --- | --- | --- | --- |
| ท่าน | You | Any | Formal, deferential | Government, banking, legal notices |
| คุณ | You | Any | Polite, standard | Retail, support, product interfaces |
| เธอ | You | Any | Familiar | Friends, fiction, song lyrics |
| นาย | You | Male | Familiar, blunt | Close friends, games between players |
| ผม | I | Male | Polite | Any male speaker addressing a customer |
| ดิฉัน | I | Female | Formal | Presentations, official replies |
| ฉัน | I | Female (mostly) | Neutral in writing | Narration, apps with a female persona |
| เรา | I or we | Any | Neutral | A company or team speaking as one |
| หนู | I | Female, junior | Deferential | A young speaker to an elder |

Most product text does well with `คุณ` for the reader and `เรา` for the company, which avoids picking a gender for the brand in the pronoun. Interfaces often drop the pronoun altogether: `บันทึกแล้ว` says saved without naming who saved it. A translation that inserts `คุณ` into every sentence reads as padded, because Thai omits a subject whenever context supplies it.

## One sentence at three registers

The English line "Your order will arrive tomorrow." has no register. Each Thai rendering below is a correct translation of it, and each belongs to a different business. The particle is written for a female speaker in the first two rows, which is the convention most Thai support teams follow for a brand voice.

| Register | Thai | Who it sounds like |
| --- | --- | --- |
| Formal | สินค้าที่ท่านสั่งซื้อจะจัดส่งถึงในวันพรุ่งนี้ค่ะ | A bank, an airline, a government portal |
| Polite | ออเดอร์ของคุณจะถึงพรุ่งนี้นะคะ | An e-commerce support chat, a delivery app |
| Casual | ของถึงพรุ่งนี้นะ | A teen fashion brand, a game, a friend |

Read the three rows again for what changes. The formal row uses `ท่าน`, the full verb `จัดส่ง`, and the noun `สินค้าที่ท่านสั่งซื้อ` for order. The polite row switches to `คุณ`, borrows `ออเดอร์` from English, and softens with `นะคะ`. The casual row drops the pronoun, shortens order to `ของ`, and keeps only `นะ`. Length falls from 48 characters to 16 while the meaning holds.

## Particles give the brand a gender

Because `ครับ` and `ค่ะ` name the speaker's gender, every polite sentence a company publishes makes the company male or female for that sentence. Thai brands settle this once. Most consumer brands, banks, and airlines write as a female speaker with `ค่ะ`, following the convention of the call center and the front desk. Some brands with a male persona, such as a sports channel, write with `ครับ`.

The failure mode is mixing. A help center that answers one article in `ค่ะ` and the next in `ครับ` reads as two different people, and a Thai reader notices at once. Decide the speaker before the first translation, write it into the brief, and check every batch against it. Short interface strings have a neutral option. Leave the particle off and use the plain verb, as native apps do for buttons and labels.

## Where formal reads cold and casual reads rude

Formal Thai in the wrong place feels like a form letter. A push notification that says `ขอเรียนให้ท่านทราบว่าคำสั่งซื้อของท่านได้รับการยืนยันแล้ว` is correct and nobody wants to read it on a lock screen. The polite version `ยืนยันคำสั่งซื้อแล้วค่ะ` carries the same fact in a quarter of the characters, which also matters on a phone.

Casual Thai in the wrong place feels like an insult. A payment failure that says `จ่ายไม่ผ่านนะ ลองใหม่` uses the friend register, and a customer who has just lost money reads it as flippant. The polite version `การชำระเงินไม่สำเร็จค่ะ กรุณาลองใหม่อีกครั้ง` names the problem and the next step at the register a bank would use. The rule of thumb is that money, health, legal, and error messages move one rung up, and marketing for a young audience moves one rung down.

## Borrowed words in Thai text

Thai borrows English words constantly, and a translation has three ways to write each one. The established Thai spelling exists for common words: `โปรโมชัน` for promotion, `แอปพลิเคชัน` for application, `อีเมล` for email. A transliteration renders a newer word in Thai script even where no dictionary form exists, such as `แดชบอร์ด` for dashboard. Preserving keeps the Latin script, which is what Thai text does with product names, technical terms, and codes: `iPhone`, `API`, `OTP`.

Register decides which option a reader expects. Formal text prefers the established Thai form and keeps Latin only for proper nouns. Polite product text mixes freely, and `กด Save` next to `บันทึก` is common in Thai apps. Casual text keeps more English because young Thai speakers code-switch in speech. Product names, feature names, and error codes should stay in the source script at every register. A transliterated product name is unsearchable and reads as a typo.

## Holding one register across a product

Register drifts across a product because text is translated in batches over months by different people. The support macros arrive polite, the onboarding tour arrives casual, the terms arrive formal. A style sheet fixes the three decisions in writing, which are the speaker particle, the pronoun pair, and the borrowed-word policy. A glossary fixes the terms that must never vary, such as the Thai form of each feature name and the words that stay in Latin script.

Thai has one further consistency trap. The word for you inside a sentence and the word in the greeting must agree in rank. A message that opens `เรียน คุณสมชาย` and continues with `ท่าน` has shifted register mid-paragraph. Keep one pronoun per document and let the glossary carry it.

## Royal and monastic vocabulary

Two Thai registers sit above formal. Royal vocabulary, `ราชาศัพท์`, applies to the monarchy and uses separate nouns and verbs for the same actions. Monastic vocabulary applies to monks and has its own set. Both are governed by convention and by official guidance, and both need a human editor who works with them regularly. Machine translation should stop at formal, and a translation brief that involves either register should say so before any text is sent.

## Mapping each decision to an API option

Each decision above maps to one field on [Paxa Translate Lite](https://paxalabs.com/docs/api/translate). The defaults are set for a caller who sends plain text and wants a sensible result; the fields exist so the register can be fixed once and held across every request.

| Decision | Field | Values |
| --- | --- | --- |
| Overall register | `formality` | `auto` matches the source tone, `formal` writes polite written Thai with polite particles where natural and formal vocabulary, `casual` writes conversational Thai |
| English words | `borrowed_words` | `auto` uses the established Thai form where one exists, `transliterate` writes borrowed words in Thai script, `preserve` keeps technical terms and proper nouns in the original script |
| Speaker gender and pronoun pair | `instructions` | Free-form style direction, for example a female speaker with ค่ะ and คุณ for the reader |
| Fixed terms | `glossary` | Source and target pairs, up to 5,000 per request |
| Names and codes | `do_not_translate` | Strings that stay exactly as written |
| Situation | `context` | Background the model reads and never translates, such as the audience and the channel |

Reference fields bill at 8 credits per thousand characters against 25 for the text itself, which is the rate structure that makes a long style brief affordable to send on every request. The [translation guide](https://paxalabs.com/docs/translation) covers batching and how a glossary is matched.

> State the speaker once in `instructions` and reuse the same string on every request. Register that lives in a field can be audited; register that lives in a translator's head drifts.

## A checklist before you translate

- Pick the speaker particle, `ค่ะ` or `ครับ`, and write it into the brief.
- Pick the pronoun pair for the reader and the company, usually `คุณ` and `เรา`.
- Set `formality` once per surface: formal for money, legal, and errors, casual only for an audience that speaks that way.
- List product names, feature names, and codes in `do_not_translate`.
- Put every term with a fixed Thai form in the `glossary`, including the borrowed words you want spelled one way.
- Send the audience and channel in `context` so a lock-screen notification and a contract are translated differently.
- Test a batch of real strings in the [playground](https://paxalabs.com/app/playground); a new account starts with 100 free credits.

The [translation](https://paxalabs.com/translation) page describes the model and its languages. The [e-commerce](https://paxalabs.com/use-cases/ecommerce) and [customer support](https://paxalabs.com/use-cases/support) pages show what a product listing and a support macro look like once the register is set.

# What Thai word segmentation is, and why it decides translation, speech, and search

Thai word segmentation finds word boundaries in text written without spaces. Why it decides translation, speech phrasing, timestamps, and search.

Published 2026-09-02. Paxa Labs.

Thai word segmentation is the step that finds where one word ends and the next begins in text that carries no spaces between words. Every system that handles Thai, whether it translates, speaks, indexes, or times the text, has to perform this step before it can do its own job.

The step is invisible in English because the space already did the work. In Thai the space exists and means something else. This post explains what the space marks and shows the strings that can be cut two ways. It then follows one wrong cut into a translation, a spoken sentence, a subtitle file, and a search index.

## Why Thai has no spaces between words

Thai writing runs its words together inside a phrase. `ผมกินข้าวที่ร้านอาหารไทย` reads as six words to a Thai speaker and as one token to any function that splits on whitespace. The space character is reserved for a larger unit. It marks the end of a phrase or a clause, the job a comma or a period does in English, and it appears far less often than an English reader expects.

That convention is old and consistent. Numbers, names, and foreign words sometimes take a space on either side, and a sentence-final particle sometimes stands apart, but the words inside a Thai phrase never do. A reader learns to find the boundaries from vocabulary and context, the same way an English reader resolves which sense of `lead` a sentence uses.

Words are short. On the BEST2010 corpus the average Thai word is 3.855 characters long ([COLING (2014)](https://aclanthology.org/W14-5513/)), and this site rounds that to 4 when it converts a word count into billable characters. A hundred-word paragraph is therefore a string of about four hundred characters with perhaps three spaces in it, and every one of the hundred boundaries has to be inferred.

## Strings that can be cut two ways

Most Thai text segments one way once the vocabulary is known. The hard cases are strings where two different cuts both produce real words. A dictionary cannot settle them, because the dictionary contains every word on both sides.

| String | One cut | Another cut |
| --- | --- | --- |
| ตากลม | ตา กลม (round eyes) | ตาก ลม (to air-dry) |
| ไปหามเหสี | ไป หา มเหสี (go to see the queen) | ไป หาม เห สี (go carry, then two stray syllables) |
| มากกว่า | มาก กว่า (more than) | มา กกว่า (come, then a non-word) |
| ขนมอบ | ขนม อบ (baked sweets) | ขน มอบ (fur, to hand over) |

The first two rows are the ones a reader meets in practice. `ตากลม` is a real ambiguity, and only the sentence around it decides which reading is meant. `ไปหามเหสี` looks ambiguous to a machine and never to a person, because the second cut leaves syllables that do not form words. The last two rows show the same shape: one cut is a phrase people say, the other is a sequence of dictionary entries that nobody would write.

one string, two segmentations:

```
ตากลม

  ตา   กลม      round eyes
  ตาก  ลม       air-dry

เด็กคนนี้ตากลม        the child has round eyes
เอาผ้าไปตากลม        take the cloth to air-dry

same five letters; the words before them decide
```

The figure is the whole problem in one line. Nothing inside `ตากลม` chooses a reading. The choice comes from `เด็กคนนี้` (this child) or `เอาผ้าไป` (take the cloth), which sit outside the string a per-word matcher is looking at.

## What a wrong cut does to a translation

A translation system that segments first and translates second inherits every wrong cut. `เอาผ้าไปตากลม` cut as `ตา กลม` produces a sentence about a cloth and round eyes. The output is fluent, grammatical, and wrong, and a reviewer who does not read Thai has no signal that anything happened.

Names are the common case. A brand written in Thai script, `ไลน์` for a chat app or `แกร็บ` for a ride service, is a string of ordinary syllables. Cut the wrong way, `ไลน์` becomes a word for a line and the brand disappears from the translation. The [translation API](https://paxalabs.com/docs/api/translate) takes a glossary for exactly this reason. A term listed there in its published form is matched as a unit and rendered as the caller wrote it.

Markup is the other place a cut goes wrong. An inline tag reinserted by character offset lands inside a word whenever the offset drifts by one, and in Thai that means between a consonant and the vowel that belongs to it. The `format` field exists so that the model receives the markup and keeps it on word boundaries it can see.

## What a wrong cut does to speech

A speech model needs the word to know two things: where to breathe and how to read the letters. Phrasing follows words and clauses. A pause dropped inside a word sounds like a stutter, and a sentence read without any pause sounds like a machine. Neither the space nor the punctuation tells the model where the words are.

Syllable reading depends on the word as well. The same letters cut into different syllables in different words, and only the word decides. `ปลา` reads as one syllable, `plaa`, with a consonant cluster. `ปลัด` opens on the same two letters and reads as two syllables, `pa-lat`. `จักรยาน` reads `jak-kra-yaan` and `จักรี` reads `jak-kri`, with a different cut after the shared `จักร`. The doubled `รร` reads `un` at the end of a word in `สรร` (`san`) and `um` before a final consonant in `กรรม` (`kam`).

| Word | Reading | Why the word decides |
| --- | --- | --- |
| ปลา · ปลัด | plaa · pa-lat | Same opening letters, cluster in one, two syllables in the other |
| จักรยาน · จักรี | jak-kra-yaan · jak-kri | Same first four letters, different syllable cut |
| สรร · กรรม | san · kam | The doubled รร reads un at word end and um before a final |

A model that has found the word reads each of these correctly. A model that reads letters in sequence gets each one wrong on the first syllable. The [text-to-speech page](https://paxalabs.com/text-to-speech) lists more of these reading rules with the reading a Thai speaker produces.

## What a wrong cut does to word timestamps

A word timestamp is a span of audio attached to a word. In English the words are given and the alignment is the whole task. In Thai the model has to produce the words first, and the timestamps inherit whatever it produced. A wrong cut yields a span that covers one and a half words, and a subtitle built from those spans highlights the wrong syllables.

The speech API returns [timestamps](https://paxalabs.com/docs/timestamps) at word, sentence, or utterance granularity, and the word spans follow the model's own segmentation of the text. The [subtitles page](https://paxalabs.com/subtitles) shows what that looks like as a highlighted read-along. Sentence granularity sidesteps the question entirely when a caption only needs to change once per line.

## What a wrong cut does to a search index

A search index stores terms, and a term is a word. An index built by splitting Thai on spaces stores whole phrases as single terms, and a query for one word inside a phrase finds nothing. An index built with a segmenter finds the word, and finds it under whichever cut the segmenter chose. The query has to be cut the same way, by the same segmenter, or the two sides disagree.

The practical consequence is that Thai search quality is capped by segmentation quality, and that changing the segmenter means rebuilding the index. Product catalogs feel this first, because product names are exactly the strings a segmenter has never seen.

## Dictionary matching and context models

Two families of method exist. Dictionary methods walk the string and take the longest word the dictionary contains at each position, with a backtrack when the remainder cannot be segmented. They are fast, transparent, and correct on most text. They fail on the ambiguous strings above, because both cuts are in the dictionary and the method has no way to look at the surrounding sentence. They also fail on every word that is not in the dictionary, which includes most new names.

Context models read the characters around each position and predict whether a boundary falls there. They learn that `เด็กคนนี้` is followed by a description and `เอาผ้าไป` by an action, and they cut `ตากลม` accordingly. They handle unknown words by shape, since a Thai word has a recognizable structure of consonant, vowel, and tone mark. Their cost is that they are models, with the training data and the failure cases that implies.

> The two families are often combined. A dictionary supplies the easy boundaries and a context model decides the rest. Whichever method a pipeline uses, the segmentation it produces is the segmentation every later stage inherits.

## What to do when you call an API with Thai text

- Send whole sentences or [segments](https://paxalabs.com/docs/translation). A fragment cut at an arbitrary character count can start or end inside a word, and the model then has to guess at both edges.
- Put brand names, product names, and place names in the glossary in the exact form you publish. A listed term is matched as a unit and never split.
- Use `do_not_translate` for strings that must survive untouched, and send `format` when the text carries markup. The model then preserves the tags on boundaries it can see.
- Request `timestamps` at the granularity the product needs. Sentence spans are stable; word spans are the model's own cut of the text.
- Segment queries with the same method that built the index. A mismatch between the two sides is the usual cause of a Thai search that misses obvious matches.
- Test the ambiguous strings from the table above in the [playground](https://paxalabs.com/app/playground) with the sentence around them, and read the output as a Thai speaker would.

Segmentation is the first decision any Thai pipeline makes, and the one every later output carries. The [translation](https://paxalabs.com/translation) and [text-to-speech](https://paxalabs.com/text-to-speech) models on this site make that decision inside the model, with the whole sentence in view. The fields above are how a caller keeps it from being made alone.
