# Seed Audio 1.0 (audio) > Text-to-audio from ByteDance: speech with 20 preset voices, or a read that matches up to three reference clips or one reference image. It is best at scene audio, multi-voice reads, and expressive delivery. Status: roasOS API v1.1. Catalog `model-catalog@2026-10-06.v5`, pricing `customer-pricing@2026-11-05.v15`. The endpoint `POST /v1/audio/seed-audio-1.0` is live. `POST /v1/generations` stays for one minor version as a deprecated alias (see "Today"). ## Endpoint POST https://api.roasos.com/v1/audio/seed-audio-1.0 Auth: Authorization: Bearer roasos_sk_… (scope api:write). Idempotency-Key required. quote_only / quote_id / webhook_url as in https://docs.roasos.com/llms.txt. ## Good at The only audio model in the roster that takes references. Give it up to three reference audio clips, name them `@Audio1`, `@Audio2`, `@Audio3` in the prompt, and it matches that timbre and delivery. Give it one reference image instead, and it reads the scene. fal lists it as text-to-audio, so the prompt can direct a whole piece: "Generate a short suspense radio drama in a late-night convenience store." It is the only audio endpoint that exposes `output_format` and `sample_rate`, so use it when you need WAV or PCM. It does not clone a voice into a saved `voice_id`, and it does not accept `avatar_id`. ## Pricing Unit: characters. Pricing key: `seed-audio-1.0`. | request | credits | |---|---| | `1000_characters` | 3 | | `2000_characters` | 6 | | `5000_characters` | 15 | Credits come from the roasOS pricing table (`MODEL_COSTS`) through the catalog. No other field changes the price. ## Modes - `text-to-speech` Provider endpoints: `bytedance/seed-audio-1.0`. ## Request fields | field | type | required | default | rule | |---|---|---|---|---| | `audio_urls` | string[] | no | — | ≤ 3 items | | `image_url` | string | no | — | https URL; ≤ 4,096 characters | | `output_format` | enum | no | `mp3` | `wav`, `mp3`, `pcm`, `ogg_opus` | | `pitch` | integer | no | `0` | -12–12 | | `quote_id` | string | no | — | UUID | | `quote_only` | boolean | no | `false` | — | | `sample_rate` | enum | no | `24000` | `8000`, `16000`, `24000`, `32000`, `44100`, `48000` | | `speed` | number | no | `1` | 0.5–2 | | `text` | string | yes | — | ≥ 1 character; ≤ 10,000 characters | | `voice` | enum | no | — | `vivi_mixed_en_zh_ja_es_id`, `mindy_en_es_id_pt_zh`, `kian_en_zh`, `cedric_en_zh`, `sophie_en_zh`, `jean_en_zh`, `magnus_en_zh`, `mabel_en_zh`, `nadia_en_zh`, `opal_en_zh`, `pearl_en_zh`, `quentin_en_zh`, `corinne_mixed_en_zh`, `esther_mixed_en_zh`, `lyla_mixed_en_zh`, `tracy_es_zh`, `sandy_es_mixed_en_zh`, `felix_zh`, `celeste_zh`, `monkey_king_zh` | | `volume` | number | no | `1` | 0.5–2 | | `wait_timeout_seconds` | integer | no | `0` | 0–60 | | `webhook_url` | string | no | — | https URL; ≤ 4,096 characters | The schema is strict: a field that is not in this table returns `400 unsupported_option`. Field names are the roasOS role names, one name per role across every family. ## Media - `image_url` — first frame (or the single source image) - `audio_urls` — reference or driving audio | role | items | max size | content types | duration | |---|---|---|---|---| | `audio_urls` | ≤ 3 | 15 MB | `audio/mp3`, `audio/mpeg`, `audio/wav`, `audio/wave`, `audio/x-wav` | — | | `image_url` | ≤ 1 | 10 MB | `image/jpeg`, `image/png`, `image/webp` | — | - Refused: `avatar_id`, `elements`, `product_id`, `product_images`, `references`, `reference_images`, `end_image_url`, `scene_id`, `scene_image`, `video_urls`, `video_url`, `audio_url`, `voice_id`. A refused role returns `400 unsupported_option`. - Every URL must be an immutable object on `https://cdn.roasos.com/…` that your workspace owns; any other URL is `400 reference_media_not_workspace_owned`. Upload with `POST /v1/uploads` (direct POST of the bytes to `put_url`, or a `source_url` import), then use the returned CDN URL. ## Prompt `text` limit 10,000 characters. roasOS adds no wrapper and no tags. - Tag syntax: `@Audio1`, `@Audio2`, `@Audio3`, each once, in the order of `audio_urls`: "Read this in the voice of @Audio1: …". - With no reference, write the spoken words and pick a `voice` whose suffix includes the language of the text. - For scene audio, describe the place, the mood, and the speakers in one sentence before the lines. - For a multi-voice read, label the speakers in the text and give one reference clip per speaker. - Keep `speed` near 1; the reservation assumes 12.5 characters per second. - Choose `output_format: "wav"` and `sample_rate: 48000` for a master you will edit further. ## Not exposed - `multilingual`: pinned to `false`. - `audio_urls`: values not exposed — `PCM containers`, `Ogg Opus containers`. - `references`: not accepted by this public endpoint. - `avatar_id`: not accepted by this public endpoint. - `product_id`: not accepted by this public endpoint. - `video_urls`: not accepted by this public endpoint. - `voice_id`: pinned to `the model has no provider voice-clone registry`. - `language`: not accepted by this public endpoint. - `emotion`: not accepted by this public endpoint. - `temperature`: not accepted by this public endpoint. ## Result Result kind `audio`. Always present: `url`. Present when the run produces it: `timestamps`. ```json { "data": { "id": "gen_…", "kind": "audio", "model": "seed-audio-1.0", "status": "completed", "result": {"timestamps":[{}],"url":"https://cdn.roasos.com/workspaces/ws_01/result"} } } ``` Files live on `https://cdn.roasos.com` and are immutable; a result URL can be a media input to the next call. Poll `GET /v1/jobs/{id}/status` → `{ id, status, updated_at }`, then `GET /v1/jobs/{id}/result` (`409 run_not_completed` until the job is `completed`, `failed` or `canceled`). Statuses: `queued → processing → completed | failed | canceled`. ## Example ```bash # 1. quote — nothing is spent curl -X POST https://api.roasos.com/v1/audio/seed-audio-1.0 \ -H "Authorization: Bearer roasos_sk_live_…" \ -H "Idempotency-Key: 0f1c9e2a-seed-audio-1.0-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": 3, "expires_at": "…", "confirmation": { "model": "seed-audio-1.0", "example": "1000_characters" } } } # 2. run — the same body and the same Idempotency-Key, quote_id instead of quote_only curl -X POST https://api.roasos.com/v1/audio/seed-audio-1.0 \ -H "Authorization: Bearer roasos_sk_live_…" \ -H "Idempotency-Key: 0f1c9e2a-seed-audio-1.0-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_…", "kind": "audio", "model": "seed-audio-1.0", "status": "queued", "credits_reserved": 3, "links": { "status": "/v1/jobs/gen_…/status", "result": "/v1/jobs/gen_…/result" } } } # 3. poll 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_…" ``` ## Today `POST /v1/audio/seed-audio-1.0` is the endpoint. `POST /v1/generations` still works with `{ "type": "audio", "model": "seed-audio-1.0", "prompt": "", "options": { "voice": "kian_en_zh", "audio_urls": ["…"], "output_format": "wav", "sample_rate": "44100", "speed": 1, "volume": 1, "pitch": 0 } }`; there the script goes in `prompt`. Every reference must be a workspace-owned `cdn.roasos.com` object on both surfaces. `options.stability` must be 0.5 and `options.similarity_boost` must be 0.75 (no-op). ## See also https://docs.roasos.com/models/audio/seed-audio-1.0 · https://api.roasos.com/v1/catalog/audio/seed-audio-1.0 · bytedance/seed-audio-1.0