# Tada API

> Chuyển văn bản thành giọng nói bằng cách sao chép giọng, đọc văn bản bằng giọng của đoạn tham chiếu, với 10 mã ngôn ngữ

Sao chép giọng của người nói từ đoạn tham chiếu (`audio_url`) và đọc văn bản `prompt` bằng giọng đó. Tùy chọn `language` chấp nhận en, ar, ch, de, es, fr, it, ja, pl và pt. Với đoạn tham chiếu không phải tiếng Anh, hãy cung cấp `transcript` vì tính năng nhận dạng tích hợp chỉ hỗ trợ tiếng Anh. Có thể điều chỉnh tốc độ từ 0.5 đến 2, đầu ra là wav hoặc mp3.

- Model id: `tada/3b/text-to-speech`
- Made by: Open model
- Category: Text to Speech
- Output: audio
- Price: $0.08 / 1000 characters (cheapest run $0.08 (80 API credits))
- Run: `POST https://api.doitong.com/v1/run/tada/3b/text-to-speech`
- Quote: `POST https://api.doitong.com/v1/quote/tada/3b/text-to-speech`
- Docs page: https://doitong.com/vi/developers/models/tada/3b/text-to-speech

## Pricing

Price: **$0.08 / 1000 characters**. Billed per character of `prompt` (the price is per 1000 characters).

The full example input below costs $0.004 = 4 API credits (50 characters × 80 API credits / 1000 characters).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.com/v1/quote/tada/3b/text-to-speech` with the same JSON body returns the exact price for that input; the quote is exactly what a run charges. Invalid input is never charged and failed or canceled requests are refunded automatically.

## Input parameters

Send either the canonical name or the native field name (not both). Canonical names are the same across models.

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `audio_url` | `audio` | string (audio URL) | yes |  |  | Nguồn sao chép giọng nói được cung cấp dưới dạng URL tệp âm thanh, xác định người nói có đặc điểm giọng mà mô hình cần tái tạo. |
| `transcript` |  | string | no | `` |  | Bản chép lời của âm thanh tham chiếu, bắt buộc với bản ghi bằng ngôn ngữ khác tiếng Anh; tính năng chép lời tự động chỉ tích hợp cho tiếng Anh. |
| `prompt` |  | string | yes |  |  | Nội dung lời nói được cung cấp dưới dạng văn bản; người nói tham chiếu cung cấp giọng dùng để kết xuất. |
| `language` |  | enum (string) | no | `en` | `en`, `ar`, `ch`, `de`, `es`, `fr`, `it`, `ja`, `pl`, `pt` | Mã ngôn ngữ căn chỉnh văn bản, phải tương ứng với ngôn ngữ tổng hợp khi tạo lời nói bằng ngôn ngữ khác tiếng Anh. |
| `num_extra_steps` |  | integer | no | `0` | 0 – 50 | Số bước tự hồi quy bổ sung để thêm ngữ điệu hoặc khoảng lặng ở cuối bằng cách tiếp tục lời nói sau phần văn bản được cung cấp. |
| `temperature` |  | number | no | `0.6` | ≤ 2, > 0 | Nhiệt độ lấy mẫu token văn bản: tăng giá trị sẽ tăng sự đa dạng của đầu ra, còn 0 hoặc thấp hơn không được phép. |
| `top_p` |  | number | no | `0.9` | 0 – 1 | Cài đặt lấy mẫu Top-p (nucleus) dùng để tạo văn bản. |
| `repetition_penalty` |  | number | no | `1.1` | 1 – 2 | Mức phạt lặp token trong khi tạo đầu ra. |
| `acoustic_cfg_scale` |  | number | no | `1.6` | 0 – 10 | Cường độ hướng dẫn không cần bộ phân loại dùng để tạo đặc trưng âm học. |
| `noise_temperature` |  | number | no | `0.9` | 0 – 2 | Nhiệt độ nhiễu dùng trong khuếch tán khớp dòng. |
| `num_inference_steps` |  | integer | no | `20` | 1 – 50 | Số bước bộ giải ODE dùng để tạo âm học qua khớp dòng. |
| `speed_up_factor` |  | number | no | `1` | 0.5 – 2 | Hệ số tốc độ lời nói: lời nói được tạo chậm hơn khi dưới 1.0 và nhanh hơn khi trên 1.0. |
| `output_format` |  | enum (string) | no | `wav` | `wav`, `mp3` | Định dạng tệp của âm thanh được tạo. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Có thể nới lỏng việc kiểm duyệt bằng cách đặt thành false, nếu người gọi được cấp quyền. |

File parameters (`audio`) take a public `https://` URL, a `data:` URI up to 10 MB, or the `file_url` of an upload from `POST /files`.

## Example input

Required parameters only:

```json
{
  "audio": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3",
  "prompt": "Hello from Doitong. This is a short test sentence."
}
```

A fuller example:

```json
{
  "audio_url": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3",
  "prompt": "Hello from Doitong. This is a short test sentence."
}
```

## Run it

Set `DOITONG_API_KEY` to a key from https://doitong.com/developers/dashboard#keys. `?wait=20` returns the finished request in the same call when it is ready within 20 seconds; otherwise poll `GET /requests/{id}` (it also accepts `?wait=`), or pass `webhook_url`.

### curl

```bash
# Run the model; wait up to 20 s for the finished result in the same call
curl -X POST "https://api.doitong.com/v1/run/tada/3b/text-to-speech?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "audio_url": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3",
    "prompt": "Hello from Doitong. This is a short test sentence."
  }'

# Still "queued" or "running"? Poll with the id from the response:
curl "https://api.doitong.com/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.com/v1";
const headers = {
  "Authorization": "Bearer " + process.env.DOITONG_API_KEY,
  "Content-Type": "application/json",
};

// Run the model; wait up to 20 s for the finished result in the same call
let res = await fetch(API + "/run/tada/3b/text-to-speech?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "audio_url": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3",
    "prompt": "Hello from Doitong. This is a short test sentence."
  }),
});
let request = await res.json();
if (!res.ok) throw new Error(request.error.code + ": " + request.error.message);

// Not finished yet: long-poll until it is
while (request.status === "queued" || request.status === "running") {
  res = await fetch(API + "/requests/" + request.id + "?wait=20", { headers });
  request = await res.json();
}
if (request.status !== "succeeded") throw new Error(JSON.stringify(request.error));
console.log(request.outputs.map((o) => o.url), request.cost.credits + " API credits ($" + request.cost.usd + ")");
```

### Python

```python
import os
import requests

API = "https://api.doitong.com/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "audio_url": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3",
    "prompt": "Hello from Doitong. This is a short test sentence.",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/tada/3b/text-to-speech", params={"wait": 20}, json=payload, headers=headers)
request = r.json()
if not r.ok:
    raise RuntimeError(request["error"]["code"] + ": " + request["error"]["message"])

# Not finished yet: long-poll until it is
while request["status"] in ("queued", "running"):
    request = requests.get(API + "/requests/" + request["id"], params={"wait": 20}, headers=headers).json()
if request["status"] != "succeeded":
    raise RuntimeError(request["error"])
print([o["url"] for o in request["outputs"]], request["cost"]["credits"], "API credits", "$" + request["cost"]["usd"])
```

### MCP

The MCP server at `https://api.doitong.com/v1/mcp` exposes the tools `search_models`, `get_model`, `quote`, `run`, `get_request`, `cancel_request`, `list_requests`, `create_upload` and `get_account`. A `run` call for this model:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run",
    "arguments": {
      "model_id": "tada/3b/text-to-speech",
      "input": {
        "audio_url": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3",
        "prompt": "Hello from Doitong. This is a short test sentence."
      },
      "wait_seconds": 20
    }
  }
}
```

## Response

Every call returns a request object. `status` is one of `queued`, `running`, `succeeded`, `failed`, `canceled`. `outputs` lists the generated files with URLs on our storage (kept forever, or 7 days with `?storage=temporary`; `storage` says which); `output` is the model's own result object with the same URLs.

```json
{
  "id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
  "object": "request",
  "model": "tada/3b/text-to-speech",
  "status": "succeeded",
  "created_at": "2026-10-20T12:00:00Z",
  "started_at": "2026-10-20T12:00:02Z",
  "completed_at": "2026-10-20T12:00:09Z",
  "queue_position": null,
  "cost": {
    "credits": 4,
    "usd": "0.004",
    "charged": 4,
    "refunded": 0
  },
  "input": {
    "audio_url": "https://content.doitong.com/audio/showcase/v3/tools/dub_es.mp3",
    "prompt": "Hello from Doitong. This is a short test sentence."
  },
  "output": {
    "audio": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp3",
      "content_type": "audio/mpeg",
      "file_name": "0-output.mp3",
      "file_size": 1843200,
      "duration": 5,
      "channels": 1,
      "sample_rate": 1,
      "bitrate": "string"
    }
  },
  "outputs": [
    {
      "type": "audio",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp3",
      "content_type": "audio/mpeg",
      "file_size": 1843200,
      "duration": 12,
      "stored": true
    }
  ],
  "error": null,
  "metrics": {
    "inference_seconds": 6.8
  },
  "urls": {
    "self": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `audio` | object {url, content_type, file_name, file_size, duration, channels, sample_rate, bitrate} | Tệp âm thanh chứa lời nói đã tổng hợp. |

## Related models

- [Tada TTS 1B](https://doitong.com/developers/models/tada/1b/text-to-speech.md) (`tada/1b/text-to-speech`): $0.05 / 1000 characters
- [Eleven v4 Text to Speech](https://doitong.com/developers/models/elevenlabs/tts/eleven-v4.md) (`elevenlabs/tts/eleven-v4`): $0.08 / 1000 characters
- [MiniMax Speech 2.8 HD](https://doitong.com/developers/models/minimax/speech-2.8-hd.md) (`minimax/speech-2.8-hd`): $0.10 / 1000 characters
- [F5 TTS](https://doitong.com/developers/models/f5-tts.md) (`f5-tts`): $0.05 / 1000 characters
- [Async Text to Speech Pro V1.0](https://doitong.com/developers/models/async/tts-pro/v1.0.md) (`async/tts-pro/v1.0`): $0.01 / 1000 characters
- [Bytedance Seed Speech Text to Speech](https://doitong.com/developers/models/bytedance/seed-speech/tts/v2.md) (`bytedance/seed-speech/tts/v2`): $0.03 / 1000 characters
- [Chatterbox · Speech to Speech](https://doitong.com/developers/models/chatterbox/speech-to-speech.md) (`chatterbox/speech-to-speech`): $0.015 / minute of input audio
- [Chatterbox · Text to Speech](https://doitong.com/developers/models/chatterbox/text-to-speech.md) (`chatterbox/text-to-speech`): $0.025 / 1000 characters

## Links

- HTML page: https://doitong.com/developers/models/tada/3b/text-to-speech
- All models and guides for AI agents: https://doitong.com/developers/llms.txt
- OpenAPI 3.1 with this model's typed request body: https://doitong.com/developers/openapi.json?model=tada/3b/text-to-speech
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/tada/3b/text-to-speech
