Seed Speech 2.0 reads one preset voice per request, so a two-character adult conversation is one task per line, joined in a short audio edit. Each task costs $0.072 per 1,000 characters of spoken text with no minimum, and the delivery note is free.
It suits character voice messages, audiobook narration and dialogue where you want to redo one line without touching the other. If you want both voices and background sound in one file, use Seed Audio 1.0 instead.
What one request gives you
| Item | Seed Speech 2.0 |
|---|---|
| Required field | text, 1-5,000 characters |
| Voice | One voice_id of 41 presets; default stokie_en |
| Delivery note | instructions, up to 1,000 characters; not spoken, not billed |
| Output | One mono MP3 at 24 kHz, or Ogg Opus (opus); no word timings or subtitles |
| Length and speed | About 11 characters per second of speech; about 8 seconds to generate 300 characters |
| Storage | Kept for 14 days, so download it |
| Cost | $0.072 per 1,000 characters; 5,000 characters is $0.36; an expired task is not charged |
| Not available | Reference voice upload, a multi-speaker array |
Choose a preset and try a line on the Seed Speech 2.0 task page. Voice cloning, streaming and speech recognition from BytePlus's wider Seed Speech family are not part of this task. To hear the voice first, listen to the published late-night voice note; it uses stokie_en with a soft, intimate delivery note.
Try the two turns in the Playground first
On that page, use the Playground tab. For each turn of two fictional adults after a date:
- Paste only the words to be heard into Text. Do not write speaker names ("Anna:") or stage directions ("she smiles"): they are read aloud, and putting both characters in one request gives you one voice reading both lines and the names.
- Choose a name in Voice (Stokie · English by default).
- Write the delivery in Delivery instructions; it is not spoken and not billed.
- Leave Language on Auto, run it, play the result and download the MP3.
| Turn | Voice | Text | Delivery instructions |
|---|---|---|---|
| 1 | Stokie (stokie_en) | "You don't have to go yet. Stay for another coffee? I like talking to you when we're not watching the clock." | Warm and slightly playful. Speak quietly to one adult listener, with a natural question rather than a sales pitch. |
| 2 | Tim (tim_en) | "Then I'll stay. I was hoping you would give me a reason." | Low, relaxed and amused. Answer an invitation naturally; do not sound like an announcer. |
Join the two downloads in any audio editor, leaving a short gap. To automate the join, use the script below.
Then script the whole exchange
Install the Python SDK (pip install spicyapi) and ffmpeg, set SPICY_API_KEY, and run this. It sends one task per turn, downloads each MP3, then joins them with 0.35 seconds of silence after each turn and evened-out levels.
import subprocess, urllib.request
from spicyapi import SpicyClient, output_assets
client = SpicyClient() # reads SPICY_API_KEY from the environment
GAP = 0.35 # seconds of silence after each turn
TURNS = [
{"text": "You don't have to go yet. Stay for another coffee? I like talking to you when we're not watching the clock.",
"voice_id": "stokie_en",
"instructions": "Warm and slightly playful. Quiet, to one adult listener."},
{"text": "Then I'll stay. I was hoping you would give me a reason.",
"voice_id": "tim_en",
"instructions": "Low, relaxed and amused. Answer naturally, not like an announcer."},
]
files = []
for i, turn in enumerate(TURNS, 1):
task = client.create_task(
model="bytedance/seed-speech-2.0/text-to-speech",
input_data=dict(turn, language="en", output_format="mp3"),
idempotency_key=f"dialogue-take-1-turn-{i}", # new keys for a new take
)
final = client.wait_for_terminal(task["taskId"])
if final["state"] != "succeeded":
raise RuntimeError(f"Turn {i} ended as {final['state']}")
files.append(f"turn-{i:02d}.mp3")
urllib.request.urlretrieve(output_assets(final)[0]["url"], files[-1])
cmd = ["ffmpeg", "-y"] + [x for f in files for x in ("-i", f)]
chains = [f"[{i}:a]loudnorm=I=-18,apad=pad_dur={GAP}[a{i}]" for i in range(len(files))]
graph = ";".join(chains) + ";" + "".join(f"[a{i}]" for i in range(len(files))) + f"concat=n={len(files)}:v=0:a=1"
subprocess.run(cmd + ["-filter_complex", graph, "-ar", "24000", "-b:a", "128k", "dialogue.mp3"], check=True)Adjust GAP until the reply lands naturally. If one line has an awkward start, regenerate the whole sentence rather than patching a word, and rebuild the file. Waiting, retries and errors are in the Python SDK reference and the asynchronous tasks guide; polling versus webhooks covers recovery at scale.
Or let an Agent run it
If an assistant should voice the script, 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 turn per call (npx @spicyapi/cliworks without installing). Put the turn'sinputobject inturn-1.json:
``bash spicyapi tasks create --model bytedance/seed-speech-2.0/text-to-speech \ --input-file turn-1.json --idempotency-key dialogue-take-1-turn-1 --wait ``
- MCP server. Add the MCP server to your assistant and ask: "Read these two lines with Seed Speech 2.0, stokieen then timen, and join them with a short gap." It calls
spicyapi_task_create(which stops for your price confirmation) andspicyapi_task_waitfor each turn. - 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.
Pick voices and language together
The suffix of each voice ID lists the languages it is built for. English presets include stokie_en, dacey_en and tim_en. Others cover Japanese (minimi_ja), German (sven_de), French (usseau_fr), Korean (shane_ko) and Spanish (felipe_es); jess_ja_es_id_pt_en_zh speaks six languages. The list does not say which voices are male or female, so audition: the same 100-character line through five candidates costs about $0.036 in total. Keep the winning voice_id and instructions for every later line of that character.
language accepts zh, en, ja, es-mx, id, pt-br, ko, it, de and fr. Leave it out for automatic detection, and set it when a short or mixed-language line is read in the wrong one. Spanish is es-mx and Portuguese is pt-br. It does not translate: write the line in the target language.
Adult scripts and non-verbal sounds
Based on our September 2026 tests, SpicyAPI adds no content filter to this model, and direct and audiobook-style adult passages came back word for word, with the instruction text never spoken. A cue-heavy passage kept its vocabulary but added non-word vocalization of its own. The task has no sound-tag field: write a sound as a word ("Mm...", "Ah...") and describe the breathing or tone in instructions. If a scene depends on performed breaths and moans, Gemini 3.8 Flash, Grok and MiniMax perform inline cues as sounds; Seed Speech does not.
Settings that fix a real problem
| Setting | Range | Use it when |
|---|---|---|
speed | 0.5-2, default 1 | A line is rushed: try 0.9. If only one phrase is, shorten the sentence or add a full stop |
pitch | -12 to +12 semitones | A small nudge after casting; for a different character, change the preset instead |
volume | 0.5-2, default 1 | A replacement line is louder or quieter than its neighbours |
sample_rate | 8,000 to 48,000 Hz | Your editing project needs a rate other than 24 kHz |
output_format | mp3 or opus | Opus for smaller files if your player handles Ogg Opus; WAV is not offered, so convert locally |
A line that sounds theatrical usually has too long an instruction: replace it with "Quiet, natural conversational delivery." A voice with the wrong character at its core needs another preset before any pitch change. An unusual name is sometimes mispronounced, and there is no pronunciation dictionary, so spell it as it sounds in text.
Captions need alignment against the finished file, since the task returns no timestamps.
Budget the script, revisions included
Price follows characters in text, including spaces, punctuation and line breaks; instructions is free and the quote shown before a run is final. A 200-character line costs $0.0144 and is about 18 seconds of speech; a 2,000-character scene across both speakers costs $0.144, and three full takes of it cost $0.432. Two speakers add no surcharge. Replacing one 200-character answer costs $0.0144, much less than regenerating the scene, so keep the same preset and settings for the pickup.
Pick Seed Speech for affordable preset voices and lines you can redo one at a time; pick Seed Audio 1.0 when you want both voices and ambience in one file.






