roasOS
ModelsAudio

Qwen3-TTS

Text-to-speech with nine natural preset voices and a zero-shot cloned voice from a speaker embedding. It is best at a brand voice that never expires and needs no provider-side registry.

Family audio · model qwen3-tts · catalog model-catalog@2026-10-06.v5 · pricing customer-pricing@2026-11-05.v15.

Endpoint

POST https://api.roasos.com/v1/audio/qwen3-tts

Send your API key as a bearer token. The key needs the scope api:write. Every paid request also needs an Idempotency-Key header.

The envelope fields quote_only, quote_id, webhook_url and wait_timeout_seconds behave the same on each model endpoint. Refer to Jobs and Quotes and credits.

Good at

The clone path is the strength. POST /v1/voices { model: "qwen3-voice-clone" } returns a speaker embedding that roasOS stores in a private bucket; this endpoint synthesizes from it, so nothing expires and no provider holds your voice. Nine presets cover English, Chinese, Japanese, and Korean speakers. A free-text style_instruction steers the delivery of a preset voice ("Very happy."). Set language when you know it. It does not accept image, video, or audio media. style_instruction is ignored by the provider when a cloned voice_id is present.

Pricing

The unit is one characters. Pricing key: qwen3-tts.

RequestCredits
1000_characters2
2000_characters3
5000_characters6

The credits come from the roasOS pricing table. No other field changes the price. To get the exact price of your request, send it with quote_only: true first.

Modes

  • text-to-speech

Provider endpoints: fal-ai/qwen-3-tts/text-to-speech/1.7b.

Request fields

FieldTypeRequiredDefaultRule
languageenumnoautoauto, en, zh, es, fr, de, it, ja, ko, pt, ru
quote_idstringno—UUID
quote_onlybooleannofalse—
reference_textstringno—≥ 1 character; ≤ 10,000 characters
style_instructionstringno—≥ 1 character; ≤ 2,000 characters
temperaturenumberno0.90–1
textstringyes—≥ 1 character; ≤ 10,000 characters
voiceenumnoAidenAiden, Dylan, Ryan, Eric, Vivian, Serena, Sohee, Ono_Anna, Uncle_Fu
voice_idstringno—UUID
wait_timeout_secondsintegerno00–60
webhook_urlstringno—https URL; ≤ 4,096 characters

The schema is strict. A field that is not in this table gets 400 unsupported_option. The field names are the roasOS role names. One role has one name in every family.

Media

This endpoint accepts these media roles:

  • voice_id — a saved voice clone

Every other role is refused: avatar_id, elements, product_id, product_images, references, reference_images, image_url, end_image_url, scene_id, scene_image, video_urls, video_url, audio_urls, audio_url. A refused role gets 400 unsupported_option.

Each media URL must be an immutable object on https://cdn.roasos.com that your workspace owns. Any other URL gets 400 reference_media_not_workspace_owned. Refer to Reference media and uploads to learn how to put a file there.

Prompt

text limit 10,000 characters; style_instruction limit 2,000. roasOS adds no wrapper.

  • Write text as spoken words. Numbers and units read best when spelled out.
  • Use style_instruction for delivery, not content: "Calm, slow, a little tired." or "Very happy, fast."
  • Do not send style_instruction with voice_id; the provider ignores it and roasOS gives no signal today (spec gap 2).
  • Send reference_text with a cloned voice; the exact transcript of the sample improves the clone.
  • Set language when the text is not English; auto can guess wrong on short lines.
  • Keep the text short. The provider default token budget (200 codec tokens) can truncate a long read (spec gap 1).

Not exposed

These catalog entries describe omitted inputs, pinned values and source constraints. They do not imply that the provider accepts every listed field.

  • top_k — pinned to 50.
  • top_p — pinned to 1.
  • repetition_penalty — pinned to 1.05.
  • subtalker_dosample — pinned to true.
  • subtalker_top_k — pinned to 50.
  • subtalker_top_p — pinned to 1.
  • subtalker_temperature — pinned to 0.9.
  • max_new_tokens — pinned to 200 codec tokens, the fal default; it caps the clip length.
  • speaker_voice_embedding_file_url — pinned to server-minted from voice_id; never a caller field.
  • temperature — pinned to the 0-1 clamp is ours; fal documents only the default.
  • references — not accepted by this public endpoint.
  • avatar_id — not accepted by this public endpoint.
  • product_id — not accepted by this public endpoint.
  • audio_urls — not accepted by this public endpoint.
  • image_url — not accepted by this public endpoint.
  • speed — not accepted by this public endpoint.
  • pitch — not accepted by this public endpoint.
  • emotion — not accepted by this public endpoint.

Result

The result kind is audio. Always present: url. Present when the run makes it: timestamps.

{
  "data": {
    "id": "gen_…",
    "kind": "audio",
    "model": "qwen3-tts",
    "status": "completed",
    "result": {
      "timestamps": [
        {}
      ],
      "url": "https://cdn.roasos.com/workspaces/ws_01/result"
    }
  }
}

The files are immutable objects on https://cdn.roasos.com. A result URL is a valid media input for your next request.

Example

The three steps are always the same: quote, run, poll.

# 1. Quote. Nothing is spent.
curl -X POST https://api.roasos.com/v1/audio/qwen3-tts \
  -H "Authorization: Bearer roasos_sk_live_..." \
  -H "Idempotency-Key: 0f1c9e2a-qwen3-tts-0001" \
  -H "Content-Type: application/json" \
  -d '{"quote_only":true,"text":"Two drops, morning and night. That is the whole routine."}'
# 200 { "data": { "kind": "quote", "quote_id": "q_7Hk...", "credits": 2, "expires_at": "...",
#        "confirmation": { "model": "qwen3-tts", "example": "1000_characters" } } }

# 2. Run. Same body, same Idempotency-Key, quote_id in place of quote_only.
curl -X POST https://api.roasos.com/v1/audio/qwen3-tts \
  -H "Authorization: Bearer roasos_sk_live_..." \
  -H "Idempotency-Key: 0f1c9e2a-qwen3-tts-0001" \
  -H "Content-Type: application/json" \
  -d '{"quote_id":"q_7Hk...","text":"Two drops, morning and night. That is the whole routine."}'
# 201 { "data": { "id": "gen_...", "status": "queued", "credits_reserved": 2 } }

# 3. Poll, then read the result.
curl https://api.roasos.com/v1/jobs/gen_.../status -H "Authorization: Bearer roasos_sk_live_..."
curl https://api.roasos.com/v1/jobs/gen_.../result -H "Authorization: Bearer roasos_sk_live_..."

The deprecated path

POST /v1/generations still reaches this model for one minor version. It is deprecated. This is how it maps:

POST /v1/audio/qwen3-tts is the endpoint. POST /v1/generations still works with { "type": "audio", "model": "qwen3-tts", "prompt": "<text>", "options": { "voice": "Serena", "language": "en", "style_instruction": "Very happy.", "temperature": 0.9 } }; there the script goes in prompt. voice_id names a saved clone from POST /v1/voices, and reference_text travels with it. options.speed, pitch, stability, and similarity_boost have no provider field and are accepted at their default values only.

See also

  • llms.txt for this model — the same facts as one plain-text file for an agent.
  • GET https://api.roasos.com/v1/catalog/qwen3-tts — the machine-readable form: enums, defaults, limits and prices. Refer to the API reference.
  • Jobs — how to poll a job and read its result.
  • Provider endpoints: fal-ai/qwen-3-tts/text-to-speech/1.7b.

On this page