Skip to main content

Qwen3 TTS for Adult Character Voices: Presets, Prompts and Cost

Pick a Qwen3 TTS voice, direct the delivery and save one audio file. Prices from $0.0068 per line; adult scripts are read as written.

Author
Lydia
Published
Read
8 min read
Updated
Two adults beside a basket of pears and one separate pear in a fictional orchard

A voice message from a fictional character works when the voice matches the person and the delivery matches the moment. Qwen3 TTS turns an adult character's script into a single-voice MP3, and you steer the delivery with a plain-language note. The SpicyAPI task has nine preset voices and costs $0.068 per 1,000 text characters, with a 100-character minimum per request. Based on our September 2026 tests, explicit adult vocabulary in direct and audiobook-style passages was read as written. Use it for recorded voice messages and narration; this route has no voice cloning or live streaming.

What the hosted task includes

DetailQwen3 TTS task
Required inputtext, 1–2,000 characters
Delivery directioninstructions, up to 1,000 characters; not spoken, not billed
Default voiceSerena
OutputOne 24 kHz mono MP3
Price$0.068 per 1,000 text characters, minimum 100 characters ($0.0068)
Uploaded voice referenceNot exposed
Several speakers in one requestNot exposed; generate each turn separately
Numeric speed or pitchNot exposed; describe delivery in instructions

Select the preset and generate on the Qwen3 TTS task page. The Qwen team's repository also covers CustomVoice, Base (cloning) and VoiceDesign variants. Those are separate offerings: a library's ref_audio or speaker argument is not an input here, where the voice field is voice_id.

Choose a voice for the script you have

PresetPublished voice descriptionNative language
SerenaWarm, gentle female voiceChinese
VivianBright, slightly edgy female voiceChinese
Uncle_FuLow, mellow male voiceChinese
DylanClear Beijing male voiceChinese, Beijing dialect
EricLively, slightly husky male voiceChinese, Sichuan dialect
RyanRhythmic male voiceEnglish
AidenClear American male voiceEnglish
Ono_AnnaLight, playful female voiceJapanese
SoheeWarm, expressive female voiceKorean

Every preset can read every supported language, but the Qwen team recommends a voice's native language for best quality. For an English male character, start with Ryan or Aiden. For an English female character, try Serena or Vivian; the set has no native-English female voice, so audition before you commit.

Hear a Serena voice-message sample: a late-night "call me back" note read with a breathless, teasing instruction.

Try it in the Playground first

Open the Qwen3 TTS task page and use the Playground tab:

  1. In Text, paste only the words to be heard (the page's sample script is a good first test).
  2. Pick a name in Voice (Serena by default).
  3. Write the delivery note in Delivery instructions.
  4. Leave Language on Auto-detect, or choose English for an English script if detection is ambiguous.
  5. Run it, then play the result in Output and download the MP3.

A fictional adult after a date: Text "I had a good time tonight. More than I expected, actually. Call me tomorrow? I'd like to see you again.", Voice Serena, Delivery instructions "Warm and slightly shy, speaking quietly to one adult listener. Keep the final question conversational." Do not start the text with Serena: or "Read this in a soft voice"; both would be spoken. Audition two or three voices and notes here before you write any code; the price is shown before you run.

language accepts auto, zh, en, de, fr, es, it, pt, ru, ja and ko. It chooses how your text is read; it does not translate.

Then call it from code

Install the Python SDK (pip install spicyapi), set SPICY_API_KEY in the environment, and run:

python
import urllib.request
import uuid

from spicyapi import SpicyClient, output_assets

client = SpicyClient()  # reads SPICY_API_KEY from the environment

task = client.create_task(
    model="alibaba/qwen-3-tts/text-to-speech",
    input_data={
        "text": "I had a good time tonight. More than I expected, actually. Call me tomorrow? I'd like to see you again.",
        "voice_id": "Serena",
        "language": "en",
        "instructions": "Warm and slightly shy, speaking quietly to one adult listener. Keep the final question conversational.",
    },
    idempotency_key=str(uuid.uuid4()),  # new key per new request; reuse only to retry the same one
)

final = client.wait_for_terminal(task["taskId"])
if final["state"] != "succeeded":
    raise RuntimeError(f"Task {task['taskId']} ended as {final['state']}")

urllib.request.urlretrieve(output_assets(final)[0]["url"], "voice-message.mp3")

Waiting, retries, quotes and errors are in the Python SDK reference and the asynchronous tasks guide.

Or let an Agent run it

If an assistant should voice your lines, give it the CLI or the MCP server. Both show the price and ask you to confirm before a paid call. The Skill adds instructions on top of either.

  • CLI. spicyapi runs one task from a terminal (npx @spicyapi/cli works without installing). Put the same input object in input.json:

``bash spicyapi tasks create --model alibaba/qwen-3-tts/text-to-speech \ --input-file input.json --idempotency-key voice-message-take-1 --wait ``

  • MCP server. Add the MCP server to your assistant and ask: "Read this line with Qwen3 TTS, Serena, warm and slightly shy." It calls spicyapi_task_create (which stops for your price confirmation), then spicyapi_task_wait.
  • Skill. npx skills add spicyapi-ai/spicy-skill installs the Agent Skill, which teaches a coding assistant to read the live schema and reuse idempotency keys. It cannot run tasks by itself, so use it with the CLI or MCP.

Direct the same line three ways

Keep the text and voice fixed and change only the note. For "I thought you'd forgotten":

Intended feelingInstruction to try
Relieved"Soft exhale of relief, smiling, a little quieter on the last word"
Hurt"Quiet and guarded, slower, no smile"
Teasing"Light and playful, slight lift at the end, as if hiding a grin"

Change one thing at a time. "Remove the whisper" or "slower after the first sentence" fixes a take; "more emotional, more human" does not. If the result is too theatrical, shorten the note to "Natural conversational delivery."

Can it read an NSFW script?

The tests covered a direct adult passage, an audiobook-framed passage and a cue-heavy passage, using Serena or Ryan with delivery instructions. The direct and audiobook transcripts matched the script word for word, adult vocabulary included, and the instruction text was never spoken.

The cue-heavy passage kept its adult vocabulary but diverged more from the script because of non-word vocalization. Treat breaths and laughs as something to audition, not control: if a scene depends on one, generate that moment first, and do not assume another model's bracket or parenthesis syntax works.

Make a two-character scene

One request gets one voice. For two fictional adults, generate each turn separately:

TurnVoiceTextDirection
1Serena"Did you really think I'd leave without saying goodnight?"Warm, relaxed question
2Ryan"No. I was hoping you would come find me."Quiet, amused answer

Multi-speaker ComfyUI tutorials parse speaker names, gaps and overlaps in an extra node; those tags are not input fields here. Strip names from the spoken text, send each turn with its own voice_id, then set the gaps in your editor. Start with a short gap and move the second clip until the reply sounds natural. Putting both names in one text field gets you one preset reading the labels and both lines. To script the whole exchange and join the clips automatically, see the Seed Speech 2.0 dialogue workflow; its join script works with any voice.

For a long single-voice story, split at sentence or paragraph boundaries before 2,000 characters and reuse the same voice and note for every section. To replace a phrase, regenerate the whole surrounding sentence and cut at the neighbouring pauses, so volume and pacing still match.

The minimum charge matters for short replies

Cost is max(text characters, 100) × $0.068 / 1,000, counting spaces and punctuation. Instructions are free.

Input lengthBillable charactersCost
40 characters100$0.0068
80 characters100$0.0068
180 characters180$0.01224
1,000 characters1,000$0.068
2,000 characters2,000$0.136

Ten separate 40-character replies cost $0.068, although their text totals only 400 characters; one same-voice 400-character request costs $0.0272. Merge contiguous narration from one voice when your edit allows it, but do not merge different characters to dodge the minimum.

Fix a disappointing result

ProblemChange
A line is rushedAdd "Unhurried, with a natural pause after the first sentence" to instructions
A name is mispronouncedSpell it phonetically in text; keep the correct spelling in your public transcript
The note barely changes the timbreTry another preset; delivery notes do not change a voice's basic character
The request rejects speed, pitch or ref_audioRemove them and use the four fields above

If you need uploaded-voice cloning or live conversation, pick a task that exposes it; to compare other speech models for adult scripts, see our text-to-speech API comparison.

Also in 日本語 · 한국어 · Deutsch · Français · Español · Português (Brasil) · Русский · Italiano · Polski

Try it yourself

Pay only for what you run — no plan, no subscription.

Made with MiniMax H3 · ByteDance Seedance 2.0 Fast