# Paxa TTS Flash now reads emotion tags, on two new voices

Khanom Chan and Kaprao join Paxa TTS Flash as experimental voices that read 26 emotion tags written into the text, with a weight for how strongly each one lands.

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

A Thai reply carries its warmth in the words. Read in the level tone of a delivery update, ดีใจด้วยนะ sounds like someone reading a script. From September 25, two voices in Paxa TTS Flash take the delivery from the text as well. Write [happy] before the line, and the line is spoken happy.

The two voices, with no tags:

- [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/khanomchan.m4a
- [Kaprao](https://paxalabs.com/voices/kaprao), Emotion tags: https://paxalabs.com/audio/kaprao.m4a

## What changed

- [Khanom Chan](https://paxalabs.com/voices/khanomchan) (`khanomchan`) and [Kaprao](https://paxalabs.com/voices/kaprao) (`kaprao`) join the roster as experimental voices, for 34 in all.
- Both read 26 emotion tags written into `text`, such as `[happy]`, `[sad]`, and `[furious]`. The other voices skip them.
- A weight after a colon, as in `[sad:0.5]`, sets how strongly a tag lands.
- `GET /v1/voices` adds `experimental` and `emotion_tags` to every voice.
- The model id stays `paxa-tts-flash-v1`, and the speech rate does not change.

## How a tag reads

A tag sets the delivery from where it stands until the next tag. Text before the first tag keeps the voice's own delivery, and one request changes delivery as often as its text needs.

one request, two deliveries:

```
POST /v1/tts

{ "model": "paxa-tts-flash-v1", "voice": "khanomchan",
  "text": "[happy] สอบผ่านแล้ว [sad:0.6] แต่คงคิดถึงที่นี่" }
```

The request above, in Khanom Chan:

- [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/request.m4a

## The tags

The tags are everyday words for how a line should feel. Five name the broad emotions: `[neutral]`, `[happy]`, `[sad]`, `[angry]`, and `[afraid]`. The rest name a closer shade of one, such as `[annoyed]` or `[crying]`.

The five broad emotions on one line, in Khanom Chan:

- [neutral], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/khanomchan-neutral.m4a
- [happy], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/khanomchan-happy.m4a
- [sad], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/khanomchan-sad.m4a
- [angry], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/khanomchan-angry.m4a
- [afraid], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/khanomchan-afraid.m4a

The same line and tags in Kaprao:

- [neutral], [Kaprao](https://paxalabs.com/voices/kaprao), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/kaprao-neutral.m4a
- [happy], [Kaprao](https://paxalabs.com/voices/kaprao), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/kaprao-happy.m4a
- [sad], [Kaprao](https://paxalabs.com/voices/kaprao), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/kaprao-sad.m4a
- [angry], [Kaprao](https://paxalabs.com/voices/kaprao), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/kaprao-angry.m4a
- [afraid], [Kaprao](https://paxalabs.com/voices/kaprao), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/kaprao-afraid.m4a

Inside a group, the other words set how far the delivery goes. `[annoyed]` is a lighter angry, and `[shouting]` is the loudest. `[disappointed]` is a lighter sad, and `[crying]` sounds close to tears.

The angry group from lightest to loudest, in Kaprao:

- [annoyed], [Kaprao](https://paxalabs.com/voices/kaprao), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/kaprao-annoyed.m4a
- [angry], [Kaprao](https://paxalabs.com/voices/kaprao), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/kaprao-angry.m4a
- [furious], [Kaprao](https://paxalabs.com/voices/kaprao), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/kaprao-furious.m4a
- [shouting], [Kaprao](https://paxalabs.com/voices/kaprao), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/kaprao-shouting.m4a

The sad group, in Khanom Chan:

- [disappointed], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/khanomchan-disappointed.m4a
- [sad], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/khanomchan-sad.m4a
- [sorrowful], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/khanomchan-sorrowful.m4a
- [crying], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/khanomchan-crying.m4a

| Group | Tags |
| --- | --- |
| Neutral | `[neutral]`, `[calm]`, `[normal]`, `[plain]` |
| Happy | `[happy]`, `[excited]`, `[cheerful]`, `[joyful]`, `[amazed]`, `[laughing]` |
| Sad | `[sad]`, `[crying]`, `[sorrowful]`, `[gloomy]`, `[disappointed]` |
| Angry | `[angry]`, `[shouting]`, `[furious]`, `[annoyed]`, `[frustrated]` |
| Afraid | `[afraid]`, `[scared]`, `[fearful]`, `[nervous]`, `[terrified]`, `[anxious]` |

The [emotional voices page](https://paxalabs.com/emotional-voices) plays all 26 tags in both voices, and the [emotion tags guide](https://paxalabs.com/docs/emotion-tags) covers the grammar.

## How strongly a tag lands

A weight after a colon sets how strongly the tag applies, from 0 to 1. `[sad:0.5]` and `[sad:50%]` read the same. A weight past either end reads as that end, and a tag at 0 does not apply.

[sad] from 0 to 1, in Khanom Chan:

- [sad:0], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/dial-w0.m4a
- [sad:0.25], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/dial-w25.m4a
- [sad:0.5], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/dial-w50.m4a
- [sad:0.75], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/dial-w75.m4a
- [sad], [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/dial-w100.m4a

## Tags in real lines

Each line below is the `text` of one request, sent as written. The clips are the audio those requests returned.

A companion's reply turns from congratulations to missing someone, then settles on a plan. The [AI companion guide](https://paxalabs.com/ai-companion) covers the register the words already carry.

text:

```
[happy] ได้ข่าวว่าสอบผ่านแล้ว ดีใจด้วยจริง ๆ นะ
[sad:0.6] แต่ก็ใจหายเหมือนกัน ต่อไปคงไม่ค่อยได้เจอกันแล้ว
[calm] ไม่เป็นไร เดี๋ยวเรานัดกินข้าวกันนะ
```

A companion's reply:

- [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/companion.m4a

A guard in a text adventure snaps about an open gate, then worries about the captain. [Interactive fiction](https://paxalabs.com/use-cases/interactive-fiction) covers voicing a cast of characters.

text:

```
[furious] ใครเปิดประตูค่ายทิ้งไว้
[anxious:0.7] ถ้าหัวหน้ารู้เข้า พวกเราโดนหนักแน่
```

A guard in a game:

- [Kaprao](https://paxalabs.com/voices/kaprao), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/game.m4a

An audio novel keeps the narration calm until the back door opens. [Audio novels](https://paxalabs.com/use-cases/audio-novels) covers long chapters read in one voice.

text:

```
[calm] คืนนั้นฝนตกทั้งคืน บ้านทั้งหลังเงียบสนิท
[terrified] จนกระทั่งประตูหลังบ้านค่อย ๆ เปิดออกเอง
```

A line of narration:

- [Kaprao](https://paxalabs.com/voices/kaprao), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/story.m4a

A support agent apologizes for a late parcel, then gives the new delivery date. [Voice agents](https://paxalabs.com/use-cases/voice-agents) covers speech for phone and chat assistants.

text:

```
[disappointed:0.4] ขออภัยค่ะ พัสดุของคุณส่งช้ากว่ากำหนด
[cheerful] ตอนนี้ออกจากคลังแล้ว คาดว่าจะถึงพรุ่งนี้ค่ะ
```

A support reply:

- [Khanom Chan](https://paxalabs.com/voices/khanomchan), Emotion tags: https://paxalabs.com/audio/blog/emotion-tags-for-thai-speech/support.m4a

## Where tags work

- `POST /v1/tts`, buffered or streamed. With timestamps on, the spans cover the spoken text, and a tag takes none.
- `POST /v1/audio/speech`, the [OpenAI-compatible route](https://paxalabs.com/docs/openai-compatibility), reads tags in `input`.
- The [live socket](https://paxalabs.com/docs/live-streaming) reads a tag split across two frames whole. Each leg opens in the delivery the last one ended in, until `cancel` resets it.
- The Speech tool in the console has an Emotion panel with every tag and an intensity slider, and draws each tag in the voice's color as you type.

## What the API refuses

On the two voices, a bracketed word outside the list, such as `[laughs]`, or a weight that is not a number, such as `[sad:half]`, answers 400 `tag_invalid` before any charge. A word outside the list followed by a colon, such as `[Fig:2]`, is ordinary text and is spoken. Text made only of tags answers 422 `unspeakable_text` before any charge.

The other voices refuse no tag. They drop the tags on the list and read a bracketed word outside it aloud.

## What tags cost

Tags are text, and their characters bill at the [one speech rate](https://paxalabs.com/pricing), 10 credits per 1,000 characters. The request above is 47 characters with its tags, and it costs 0.47 credits.

## What experimental means

The voice ids and the tag list stay as they are. How each tag sounds may change while we tune the two voices, and a line generated later may sound different from the same line today. Every other voice keeps its delivery.

## Try it

- Open the Speech tool, pick Khanom Chan or Kaprao, and open the Emotion panel.
- Read the [emotion tags guide](https://paxalabs.com/docs/emotion-tags) for the grammar, the weights, and the live socket.
