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
| Detail | Qwen3 TTS task |
|---|---|
| Required input | text, 1–2,000 characters |
| Delivery direction | instructions, up to 1,000 characters; not spoken, not billed |
| Default voice | Serena |
| Output | One 24 kHz mono MP3 |
| Price | $0.068 per 1,000 text characters, minimum 100 characters ($0.0068) |
| Uploaded voice reference | Not exposed |
| Several speakers in one request | Not exposed; generate each turn separately |
| Numeric speed or pitch | Not 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
| Preset | Published voice description | Native language |
|---|---|---|
| Serena | Warm, gentle female voice | Chinese |
| Vivian | Bright, slightly edgy female voice | Chinese |
| Uncle_Fu | Low, mellow male voice | Chinese |
| Dylan | Clear Beijing male voice | Chinese, Beijing dialect |
| Eric | Lively, slightly husky male voice | Chinese, Sichuan dialect |
| Ryan | Rhythmic male voice | English |
| Aiden | Clear American male voice | English |
| Ono_Anna | Light, playful female voice | Japanese |
| Sohee | Warm, expressive female voice | Korean |
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:
- In Text, paste only the words to be heard (the page's sample script is a good first test).
- Pick a name in Voice (Serena by default).
- Write the delivery note in Delivery instructions.
- Leave Language on Auto-detect, or choose English for an English script if detection is ambiguous.
- 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:
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.
spicyapiruns one task from a terminal (npx @spicyapi/cliworks without installing). Put the sameinputobject ininput.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), thenspicyapi_task_wait. - Skill.
npx skills add spicyapi-ai/spicy-skillinstalls 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 feeling | Instruction 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:
| Turn | Voice | Text | Direction |
|---|---|---|---|
| 1 | Serena | "Did you really think I'd leave without saying goodnight?" | Warm, relaxed question |
| 2 | Ryan | "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 length | Billable characters | Cost |
|---|---|---|
| 40 characters | 100 | $0.0068 |
| 80 characters | 100 | $0.0068 |
| 180 characters | 180 | $0.01224 |
| 1,000 characters | 1,000 | $0.068 |
| 2,000 characters | 2,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
| Problem | Change |
|---|---|
| A line is rushed | Add "Unhurried, with a natural pause after the first sentence" to instructions |
| A name is mispronounced | Spell it phonetically in text; keep the correct spelling in your public transcript |
| The note barely changes the timbre | Try another preset; delivery notes do not change a voice's basic character |
The request rejects speed, pitch or ref_audio | Remove 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.






