# Seed Audio Multilingual

> Synthesize natural speech in 20 languages — pick a named voice or clone one from a reference audio.

## Overview

- **Model ID**: `seed-audio-1.0-multilingual`
- **Workflow**: `bytedance/text-to-speech`
- **Provider**: ByteDance
- **Category**: Text → Speech (audio)
- **Output**: An audio URL.
- **Tags**: 20 languages, voice cloning, reference audio
- **Unified endpoint**: `POST https://api.picsart.com/workflows/v1/models/execute` (model id in the body)
- **Compatibility endpoint**: `POST https://api.picsart.com/workflows/bytedance/text-to-speech/execute` (vendor's own parameters)
- **Execution**: long-running — use the async submit/poll pair or the SDK, which polls for you
- **Model page**: https://picsart.com/api-platform/models/seed-audio-1.0-multilingual

## Pricing

Rates are in USD. Every row below is an exact rate for the settings it names — the columns are the settings that change the price for this model. Every response reports what was actually charged in `response.usage.credits`.

| Rate |
| --- |
| $0.1875 / min |

Published rates. Volume pricing, invoicing and annual agreements: https://picsart.com/api-platform/contact-sales

## Authentication

The SDK and the REST API authenticate with a Picsart API key sent as a bearer token. Create a key in the console at https://picsart.com/api-platform/dashboard/api-keys, keep it in a server-side environment variable, and never ship it in browser code or commit it.

```bash
export PICSART_API_KEY="YOUR_KEY"
```

```http
Authorization: Bearer $PICSART_API_KEY
```

The CLI and the MCP server do not use an API key: `gen-ai login` signs in through the browser once per machine and stores a token locally.

## Interfaces

- **SDK** — `@picsart/ai-sdk` (TypeScript, Node 20+, ESM). Type-safe `ai.generate()` / `ai.generateText()` with per-model parameter types; polls long jobs for you.
- **REST** — the API gateway at `https://api.picsart.com`. Sync `/execute`, or async `/submit` + `/{taskId}/result`.
- **CLI** — `@picsart/gen-ai` (`gen-ai`). Generate from a terminal, quote cost before spending, emit JSON for pipelines.
- **MCP** — the same models inside Claude Code, Cursor, Windsurf and other MCP hosts. Setup: https://picsart.com/gen-ai-mcp/

```bash
npm install @picsart/ai-sdk      # SDK
npm install -g @picsart/gen-ai   # CLI (also drives the MCP server)
```

## Unified API (recommended)

One parameter set, used by the SDK and by REST alike: the names below are what `ai.generate('seed-audio-1.0-multilingual', …)` takes, and what goes inside the inner `params` of a REST call. Over REST the model id travels in the body, not the path — one workflow, `v1/models`, fronts the whole catalogue.

### Execution modes

- **Sync** — `POST /workflows/v1/models/execute` returns the result in one call. Only for jobs that finish within ~20 seconds; otherwise it times out.
- **Async** — `POST /workflows/v1/models/submit` returns a task id; poll `GET /workflows/v1/models/{taskId}/result` until `response.status` is `COMPLETED` or `FAILED`. Task statuses: `ACCEPTED` · `IN_PROGRESS` · `COMPLETED` · `FAILED`.
- **SDK** — `ai.generate()` always awaits the finished result; polling is hidden.

Audio jobs routinely outrun the sync limit: use async over REST, or the SDK, which polls for you.

### Input parameters

- **`prompt`** (`string`, _required_): Prompt
  - Max length: 3000 characters
- **`voiceId`** (`string`, _optional_): Voice
  - An id from the `bytedance/v1/catalog/voices` catalog (seed-audio-1.0-multilingual), fetched at runtime via `ai.catalogs`
  - Default: `en_male_tim_uranus_bigtts`
- **`audioUrls`** (`list<string>`, _optional_): Reference Audios
  - Accepts: audio URLs (max 3)
- **`imageUrls`** (`list<string>`, _optional_): Reference Image
  - Accepts: image URLs (max 1)
- **`format`** (`string`, _optional_): Format
  - Default: `"wav"`
  - Options: `wav`, `mp3`, `pcm`, `ogg_opus`
- **`sampleRate`** (`number`, _optional_): Sample Rate
  - Default: `44100`
  - Options: `8000`, `16000`, `24000`, `32000`, `44100`, `48000`
- **`speechRate`** (`number`, _optional_): Speech Rate
  - Default: `0`
  - Range: -50–100
- **`loudnessRate`** (`number`, _optional_): Loudness
  - Default: `0`
  - Range: -50–100
- **`pitchRate`** (`number`, _optional_): Pitch
  - Default: `0`
  - Range: -12–12
- **`aigcWatermark`** (`boolean`, _optional_): Watermark
  - Default: `false`

### Input JSON Schema

The inner `params` object. Over REST it is wrapped as `{ "params": { "model": "<id>", "params": <this> } }`; the SDK takes it directly.

```json
{
  "type": "object",
  "required": [
    "prompt"
  ],
  "properties": {
    "prompt": {
      "type": "string",
      "maxLength": 3000,
      "description": "Prompt"
    },
    "voiceId": {
      "type": "string",
      "description": "Voice — an id from the `bytedance/v1/catalog/voices` catalog (seed-audio-1.0-multilingual)",
      "default": "en_male_tim_uranus_bigtts"
    },
    "audioUrls": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uri",
        "description": "audio URL"
      },
      "maxItems": 3,
      "description": "Reference Audios"
    },
    "imageUrls": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uri",
        "description": "image URL"
      },
      "maxItems": 1,
      "description": "Reference Image"
    },
    "format": {
      "type": "string",
      "enum": [
        "wav",
        "mp3",
        "pcm",
        "ogg_opus"
      ],
      "default": "wav",
      "description": "Format"
    },
    "sampleRate": {
      "type": "number",
      "enum": [
        8000,
        16000,
        24000,
        32000,
        44100,
        48000
      ],
      "default": 44100,
      "description": "Sample Rate"
    },
    "speechRate": {
      "type": "number",
      "minimum": -50,
      "maximum": 100,
      "default": 0,
      "description": "Speech Rate"
    },
    "loudnessRate": {
      "type": "number",
      "minimum": -50,
      "maximum": 100,
      "default": 0,
      "description": "Loudness"
    },
    "pitchRate": {
      "type": "number",
      "minimum": -12,
      "maximum": 12,
      "default": 0,
      "description": "Pitch"
    },
    "aigcWatermark": {
      "type": "boolean",
      "default": false,
      "description": "Watermark"
    }
  },
  "additionalProperties": false
}
```

### Required parameters example

The required parameters plus the defaults that shape the output, as a REST body:

```json
{
  "params": {
    "model": "seed-audio-1.0-multilingual",
    "params": {
      "prompt": "A serene mountain lake at golden hour, ultra detailed"
    }
  }
}
```

### Response

The body is the gateway's status envelope: the output is at `response.result`, next to the task id, its status and the credits charged. Asset models return `url` plus an `items` array of results.

```json
{
  "status": "success",
  "response": {
    "id": "task_abc123",
    "status": "COMPLETED",
    "result": {
      "url": "https://cdn.picsart.com/…/result",
      "items": [
        {
          "url": "https://cdn.picsart.com/…/result"
        }
      ],
      "model": "seed-audio-1.0-multilingual"
    }
  }
}
```

What `ai.generate()` / `ai.generateText()` resolve to (the envelope already unwrapped):

```json
{
  "items": [
    {
      "url": "https://cdn.picsart.com/…/result"
    }
  ],
  "model": "seed-audio-1.0-multilingual"
}
```

### Usage examples

#### TypeScript (SDK)

```typescript
import { createClient } from '@picsart/ai-sdk';

const ai = createClient({
  apiKey: process.env.PICSART_API_KEY,
  apiUrl: 'https://api.picsart.com',
});

const result = await ai.generate('seed-audio-1.0-multilingual', {
  prompt: "A serene mountain lake at golden hour, ultra detailed"
});

console.log(result.url); // audio URL
```

#### cURL (sync)

```bash
curl -X POST 'https://api.picsart.com/workflows/v1/models/execute' \
  -H 'Authorization: Bearer $PICSART_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "params": {
    "model": "seed-audio-1.0-multilingual",
    "params": {
      "prompt": "A serene mountain lake at golden hour, ultra detailed"
    }
  }
}'
```

#### cURL (async: submit, then poll)

```bash
# 1. Submit the job
curl -X POST 'https://api.picsart.com/workflows/v1/models/submit' \
  -H 'Authorization: Bearer $PICSART_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "params": {
    "model": "seed-audio-1.0-multilingual",
    "params": {
      "prompt": "A serene mountain lake at golden hour, ultra detailed"
    }
  }
}'
# → { "status": "success", "response": { "id": "task_abc123" } }

# 2. Poll until response.status is COMPLETED
curl 'https://api.picsart.com/workflows/v1/models/task_abc123/result' \
  -H 'Authorization: Bearer $PICSART_API_KEY'
```

#### CLI

```bash
gen-ai login  # once per machine
gen-ai models info seed-audio-1.0-multilingual  # this model's parameters
gen-ai pricing seed-audio-1.0-multilingual  # quote before spending credits
gen-ai generate -m seed-audio-1.0-multilingual \
  -p "A serene mountain lake at golden hour"
```

## Compatibility API (vendor parameters)

Alongside the unified API, the `bytedance/text-to-speech` workflow takes ByteDance's own parameters exactly as the vendor defines them — nothing renamed or reshaped. It is the shortest path onto Picsart for request bodies already written against the vendor; the trade is that a request is written for one vendor, and the result comes back in the vendor's own shape. Same authentication.

- **Endpoint**: `POST https://api.picsart.com/workflows/bytedance/text-to-speech/execute` (sync) · `POST …/submit` + `GET …/{taskId}/result` (async)
- **SDK**: `ai.apis.run('bytedance/text-to-speech', params, { mode })` — params forwarded verbatim

### Vendor parameters

| Parameter | Type | Required | Default | Details |
| --- | --- | --- | --- | --- |
| `model` | `string` | no | `seed-audio-1.0` | Model version identifier. Both variants share the same request shape, limits, voice-cloning support and audio knobs — they differ only in language coverage and timing control, and each is billed under its own pricing entry.  - `seed-audio-1.0` (default) — English, Chinese only. - `seed-audio-1.0-multilingual` — 20 languages: English, Chinese, Japanese, Korean, Mexican Spanish, Castilian Spanish, Indonesian, German, Brazilian Portuguese, French, Thai, Vietnamese, Malay, Filipino, Italian, Russian, Dutch, Polish, Turkish, Swedish. Also advertised as supporting timing control (pacing the speech to fit a given time window); the vendor API reference documents no request parameter for it, so it is expressed through `text_prompt` — see the BytePlus docs for the prompt syntax.  Pick `seed-audio-1.0-multilingual` for any language other than English/Chinese. · Options: `seed-audio-1.0`, `seed-audio-1.0-multilingual` |
| `text_prompt` | `string` | yes | — | Prompt used to synthesize audio, or the text to be synthesized. Up to 3000 characters. Reference audio is addressed as @Audio1, @Audio2, ... matching the order of audio references. When an image reference is used, text_prompt may contain only the text to be synthesized. |
| `references` | `ReferenceResource[]` | no | — | Reference resources. Omit for text-only generation. Up to 3 audio references (speaker/audio_data/audio_url) OR exactly 1 image reference (image_data/image_url); audio and image references cannot be mixed. |
| └ `speaker` | `string` | no | — | Speaker ID — a predefined BytePlus TTS 2.0 voice or a cloned voice id. Provide exactly one of speaker, audio_data, or audio_url.  Any valid BytePlus voice id is accepted (the list below is a sample, not a whitelist). The `en_*` / `zh_*` voices work with both models; the other languages require `seed-audio-1.0-multilingual`. Speaking a voice's own language gives the best result.  Examples: - `en_male_tim_uranus_bigtts` — Tim — English, clear friendly mid-range male - `en_female_dacey_uranus_bigtts` — Dacey — English, warm engaging female - `en_female_stokie_uranus_bigtts` — Stokie — English, casual expressive young female - `zh_male_liufei_uranus_bigtts` — Felix — Chinese, clear energetic male - `zh_female_qingxinnvsheng_uranus_bigtts` — Celeste — Chinese, fresh clear female - `ja_female_minimi_uranus_bigtts` — Minimi — Japanese, sweet young female (multilingual only) - `ko_male_m03_uranus_bigtts` — Minho — Korean, professional narrator (multilingual only) - `de_male_seven_uranus_bigtts` — Sven — German, steady confident male (multilingual only) - `fr_male_usseau_uranus_bigtts` — Usseau — French, crisp articulate male (multilingual only) - `es_male_felipe_uranus_bigtts` — Felipe — Mexican Spanish, upbeat young male (multilingual only) - `it_male_enzo_uranus_bigtts` — Enzo — Italian, warm charismatic male (multilingual only) - `pt_male_martins_uranus_bigtts` — Martins — Brazilian Portuguese, expressive male (multilingual only) - `ru_male_pavel_uranus_bigtts` — Pavel — Russian, natural narrative male (multilingual only) - `ru_female_af07_uranus_bigtts` — Amelia — Russian, gentle graceful female (multilingual only) - `id_male_han_uranus_bigtts` — Han — Indonesian, smooth friendly male (multilingual only) - `ms_male_naim_uranus_bigtts` — Naim — Malay, calm refined male (multilingual only) - `tl_female_annika_uranus_bigtts` — Annika — Filipino female (multilingual only) - `th_female_bv568_neutral_uranus_bigtts` — Mildred — Thai, calm neutral female (multilingual only) - `vi_female_linh_uranus_bigtts` — Linh — Vietnamese, crisp decisive female (multilingual only) · e.g. `en_male_tim_uranus_bigtts` |
| └ `audio_data` | `string` | no | — | Base64-encoded reference audio (<=30s, <=10MB; wav/mp3/pcm/ogg_opus). |
| └ `audio_url` | `string` | no | — | Reference audio URL (<=30s, <=10MB; wav/mp3/pcm/ogg_opus). |
| └ `image_data` | `string` | no | — | Base64-encoded reference image (<=10MB; jpeg/png/webp). Cannot be combined with audio references. |
| └ `image_url` | `string` | no | — | Reference image URL (<=10MB; jpeg/png/webp). Cannot be combined with audio references. |
| `audio_config` | `object` | no | — | Output audio configuration. |
| └ `format` | `string` | no | — | Output format. Default wav. · Options: `wav`, `mp3`, `pcm`, `ogg_opus` |
| └ `sample_rate` | `number` | no | — | Output sample rate (Hz). Default: wav/pcm 40000, mp3 44100. · Options: `8000`, `16000`, `24000`, `32000`, `44100`, `48000` |
| └ `speech_rate` | `number` | no | — | Speech rate. Range [-50, 100]: 100 = 2.0x, -50 = 0.5x. Default 0. |
| └ `loudness_rate` | `number` | no | — | Volume. Range [-50, 100]: 100 = 2.0x, -50 = 0.5x. Default 0. |
| └ `pitch_rate` | `number` | no | — | Pitch. Range [-12, 12]. Default 0. |
| `watermark` | `object` | no | — | Watermark configuration. |
| └ `aigc_watermark` | `boolean` | no | — | Explicit watermark: adds an audio rhythm marker at the end. Default false. |
| └ `aigc_metadata` | `object` | no | — | Implicit watermark metadata added to the audio header. |
| └   `enable` | `boolean` | no | — | Enable the implicit watermark. Default false. |
| └   `content_producer` | `string` | no | — | — |
| └   `produce_id` | `string` | no | — | — |
| └   `content_propagator` | `string` | no | — | — |
| └   `propagate_id` | `string` | no | — | — |
| `options` | `object` | no | — | Options controlling safety checks and drive integration |
| └ `safety_checks` | `object` | no | — | Safety check settings |
| └   `enabled` | `boolean` | no | — | Whether to run content moderation. Defaults to true. |
| └ `drive` | `object` | no | — | Save result to Picsart Drive |
| └   `name` | `string` | yes | — | File name in Picsart Drive |
| └   `attributes` | `object` | no | — | Custom attributes to attach to the file |
| └   `folder` | `object` | no | — | Target folder in Picsart Drive |
| └ `inputs_transformation` | `object` | no | — | Input transformation settings |
| └   `downscale_oversized_images` | `boolean` | no | — | Whether to downscale oversized input images. Defaults to false. |

### Example request body

```json
{
  "params": {
    "text_prompt": "A serene mountain lake at golden hour, ultra detailed"
  }
}
```

### Usage examples

#### TypeScript (`ai.apis.run`)

```typescript
import { createClient, ApiRunMode } from '@picsart/ai-sdk';

const ai = createClient({
  apiKey: process.env.PICSART_API_KEY,
  apiUrl: 'https://api.picsart.com',
});

// Calls the 'bytedance/text-to-speech' workflow directly — params are sent as-is.
const { result, usage } = await ai.apis.run('bytedance/text-to-speech', {
  text_prompt: "A serene mountain lake at golden hour, ultra detailed"
}, {
  mode: ApiRunMode.SYNC,
});

console.log(result); // workflow-specific output
console.log(usage?.credits); // amount charged, in $
```

#### cURL (sync)

```bash
curl -X POST 'https://api.picsart.com/workflows/bytedance/text-to-speech/execute' \
  -H 'Authorization: Bearer $PICSART_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "params": {
    "text_prompt": "A serene mountain lake at golden hour, ultra detailed"
  }
}'
```

#### cURL (async: submit, then poll)

```bash
# 1. Submit the job
curl -X POST 'https://api.picsart.com/workflows/bytedance/text-to-speech/submit' \
  -H 'Authorization: Bearer $PICSART_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "params": {
    "text_prompt": "A serene mountain lake at golden hour, ultra detailed"
  }
}'
# → { "status": "success", "response": { "id": "wf_abc123" } }

# 2. Poll until response.status is COMPLETED
curl 'https://api.picsart.com/workflows/bytedance/text-to-speech/wf_abc123/result' \
  -H 'Authorization: Bearer $PICSART_API_KEY'
```

### Response

Over HTTP the vendor-shaped result arrives inside the gateway envelope at `response.result`:

```json
{
  "status": "success",
  "response": {
    "result": {
      "url": "https://cdn.picsart.com/…/result.mp3",
      "duration": 0,
      "format": "…",
      "driveFile": {}
    }
  }
}
```

`ai.apis.run()` unwraps that envelope and resolves to `{ result, usage }`:

```json
{
  "result": {
    "url": "https://cdn.picsart.com/…/result.mp3",
    "duration": 0,
    "format": "…",
    "driveFile": {}
  }
}
```

## Additional resources

- Model page: https://picsart.com/api-platform/models/seed-audio-1.0-multilingual
- Try it: https://picsart.com/api-platform/models/seed-audio-1.0-multilingual/playground
- SDK: https://picsart.com/api-platform/models/seed-audio-1.0-multilingual/sdk
- REST API (unified): https://picsart.com/api-platform/models/seed-audio-1.0-multilingual/api
- Compatibility API (vendor parameters): https://picsart.com/api-platform/models/seed-audio-1.0-multilingual/advanced
- Pricing: https://picsart.com/api-platform/models/seed-audio-1.0-multilingual/pricing
- This document: https://picsart.com/api-platform/models/seed-audio-1.0-multilingual/llms.txt
- All models: https://picsart.com/api-platform/models
- Docs — quickstart https://picsart.com/api-platform/docs/quickstart, authentication https://picsart.com/api-platform/docs/authentication, SDK https://picsart.com/api-platform/docs/sdk, REST https://picsart.com/api-platform/docs/api-reference, CLI https://picsart.com/api-platform/docs/cli, MCP https://picsart.com/api-platform/docs/mcp
- CLI reference: https://picsart.github.io/picsart-mcp-cli-docs/guide/introduction
