Fish Audio Drama 3 is a text-to-speech model for performed speech: you write stage directions into the text, voice up to 16 speakers in one request, and pin the pronunciation of names and terms with phoneme tags. 83 languages, billed per 1,000 UTF-8 bytes: $0.065, with a special price of $0.025 until November 12, 2026.
Like S2.1 Pro, Drama 3 is billed on the UTF-8 byte length of the input text, not on characters. A Latin letter is one byte; Cyrillic and accented letters are two; Chinese, Japanese and Korean characters are three. Bracketed directions and tags such as <whisper> are part of the text and are billed too.
| Text | Bytes | Price | Special price (to Nov 12) |
|---|---|---|---|
| 1,000 English characters | 1,000 | $0.065 | $0.025 |
| 1,000 Cyrillic letters | 2,000 | $0.13 | $0.05 |
| 1,000 Chinese, Japanese or Korean characters | 3,000 | $0.195 | $0.075 |
The special price ends at 2026-11-12 00:00 UTC; billing returns to $0.065 automatically, with no change needed on your side. Texts under 100 bytes are charged as 100 bytes. Failed requests are not charged.
Fish Audio licensed voices (licensed: true in the voice library) are billed at 2.5 times the rate: $0.1625 per 1,000 bytes, or $0.0625 during the special. Community voices and your own clones are billed at the normal rate. If any voice in a multi-speaker request is licensed, the whole request is billed at the licensed rate.
Put a bracketed note before a line to set its emotion, intent or pacing, and the whole line is delivered that way. Directions can be written in English or in your own language; they do not need to match the language of the line.
[barely holding it together, forcing a smile] I'm fine. [强忍着、挤出笑容] 我没事。
To change only a few words, wrap them in a paired tag. Supported tags:
<whisper>…</whisper><emphasis>…</emphasis><soft>…</soft><fast>…</fast><slow>…</slow><stress>…</stress><forceful>…</forceful>Really. <whisper>Go on without me.</whisper>
When a name, brand or term comes out wrong, pin its pronunciation with a phoneme tag. English uses CMU Arpabet (the digit after a vowel marks stress: 1 primary, 0 unstressed), Chinese uses pinyin and Japanese uses romaji:
<|phoneme_start|>EH1 N JH AH0 N IH0 R<|phoneme_end|>
To switch language mid-line, wrap only the words that change language in a language tag, for example:
Thanks for coming. <french>Je voudrais une table pour deux, s'il vous plaît.</french>
Fish Audio labels language tags experimental: they are not guaranteed for every language or voice, and the model may switch language on its own. Voices cloned from a speaker fluent in both languages work best.
# ─── 一个音色,带表演指示 ─────────────────────────────────
curl -X POST https://api.apimodels.app/v1/audio/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "fish-drama-3",
"text": "[barely holding it together, forcing a smile] I am fine. Really. <whisper>Go on without me.</whisper>",
"reference_id": "VOICE_ID",
"format": "mp3"
}'
# { "code": 200, "data": { "taskId": "clxxx", "state": "pending" } }
# ─── 两个人的对白:reference_id 传数组,<|speaker:N|> 切换 ─────
curl -X POST https://api.apimodels.app/v1/audio/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "fish-drama-3",
"text": "<|speaker:0|>[tired, keeping her voice down] Did you lock the door?<|speaker:1|>[too quickly] Of course I did.<|speaker:0|>[a long pause] Then why is it open?",
"reference_id": ["VOICE_ID_A", "VOICE_ID_B"],
"format": "wav"
}'
# ─── 取结果 ─────────────────────────────────────────────
curl "https://api.apimodels.app/v1/audio/generations?task_id=TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# { "code": 200, "data": { "state": "completed", "resultUrls": ["https://r2.apimodels.app/..."] } }| Field | Required | Type | Description |
|---|---|---|---|
| model | Yes | string | fish-drama-3 |
| text | Yes | string | The script, including directions, tags and <|speaker:N|> markers; up to 100,000 UTF-8 bytes per request |
| reference_id | No | string | string[] | One voice id, or an array of up to 16 for multi-speaker dialogue. voice_id is accepted as an alias. |
| format | No | string | mp3 (default) / wav / pcm / opus |
| callback_url | No | string | Webhook URL called when the task completes |
The other S2.1 Pro parameters (prosody, mp3_bitrate, sample_rate, latency, chunk_length) are passed to the model unchanged; ranges are listed in the S2.1 Pro docs.
Try it in the Playground
Put a bracketed note before a line, such as "[barely holding it together, forcing a smile] I'm fine.", and the whole line is delivered that way. To change a few words only, wrap them in <whisper>, <emphasis>, <soft>, <fast>, <slow>, <stress> or <forceful>. Directions can be written in English or in your own language.
Pass reference_id as an array of up to 16 voice ids and start each turn with <|speaker:N|>, where N is the array index counting from 0. The ids can be Fish library voices or your own clones. Arrays are accepted on fish-drama-3 only; fish-s2.1-pro returns a 400.
$0.065 per 1,000 UTF-8 bytes, with a special price of $0.025 until November 12, 2026. A Latin letter is one byte and a Chinese character three, so 1,000 English characters cost $0.065 and 1,000 Chinese characters $0.195 ($0.025 and $0.075 during the special). Texts under 100 bytes are charged as 100 bytes, and failed requests are not charged.