# MiniMax Speech 2.8 HD API

> Synthèse vocale haute définition de MiniMax dans plus de 30 langues, avec contrôle des pauses, des émotions et de la prononciation.

MiniMax Speech 2.8 HD vocalise du texte dans plus de 30 langues avec un contrôle précis : marqueurs de pause inline, vitesse vocale, tonalité et volume, dictionnaires de prononciation personnalisés et effets vocaux. Choisissez parmi les voix intégrées, ainsi que la fréquence d’échantillonnage et le format de sortie.

- Model id: `minimax/speech-2.8-hd`
- Made by: MiniMax
- Category: Text to Speech
- Output: audio
- Price: $0.10 / 1000 characters (cheapest run $0.10 (100 API credits))
- Run: `POST https://api.doitong.com/v1/run/minimax/speech-2.8-hd`
- Quote: `POST https://api.doitong.com/v1/quote/minimax/speech-2.8-hd`
- Docs page: https://doitong.com/fr/developers/models/minimax/speech-2.8-hd

## Pricing

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

The full example input below costs $0.008 = 8 API credits (79 characters × 100 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/minimax/speech-2.8-hd` 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

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `prompt` |  | string | yes |  | 1 – 10000 characters | Texte pour la synthèse vocale, avec des pauses spécifiées par `<#x#>` où x va de 0.01 à 99.99 secondes. Les balises d’interjection disponibles sont `(laughs)`, `(sighs)`, `(coughs)`, `(clears throat)`, `(gasps)`, `(sniffs)`, `(groans)` et `(yawns)`. |
| `voice_setting` |  | object {voice_id, speed, vol, pitch, emotion, english_normalization} | no | `{"english_normalization":false,"pitch":0,"speed":1,"voice_id":"Wise_Woman","vol":1}` |  | Paramètres de configuration de la voix. |
| `voice_setting.voice_id` |  | string | no | `Wise_Woman` | ≥ 1 characters | Identifiant de voix prédéfini utilisé pour la synthèse vocale. |
| `voice_setting.speed` |  | number | no | `1` | 0.5 – 2 | Débit de parole, compris entre 0.5 et 2.0. |
| `voice_setting.vol` |  | number | no | `1` | 0.01 – 10 | Volume de sortie, compris entre 0 et 10. |
| `voice_setting.pitch` |  | integer | no | `0` | -12 – 12 | Hauteur de la voix, comprise entre -12 et 12. |
| `voice_setting.emotion` |  | enum (string) \| null | no |  | `happy`, `sad`, `angry`, `fearful`, `disgusted`, `surprised`, `neutral` | Tonalité émotionnelle de la parole synthétisée. |
| `voice_setting.english_normalization` |  | boolean | no | `false` |  | Option de normalisation du texte anglais qui échange une légère latence supplémentaire contre une meilleure lecture des nombres. |
| `audio_setting` |  | object {sample_rate, bitrate, format, channel} | no |  |  | Paramètres de configuration de l'audio. |
| `audio_setting.sample_rate` |  | enum (integer) | no | `32000` | `8000`, `16000`, `22050`, `24000`, `32000`, `44100` | Fréquence d'échantillonnage de l'audio généré. |
| `audio_setting.bitrate` |  | enum (integer) | no | `128000` | `32000`, `64000`, `128000`, `256000` | Débit binaire de l'audio généré. |
| `audio_setting.format` |  | enum (string) | no | `mp3` | `mp3`, `pcm`, `flac` | Format de l'audio. |
| `audio_setting.channel` |  | enum (integer) | no | `1` | `1`, `2` | Nombre de canaux audio : 1 pour mono ou 2 pour stéréo. |
| `language_boost` |  | enum (string) \| null | no |  | `Chinese`, `Chinese,Yue`, `English`, `Arabic`, `Russian`, `Spanish`, `French`, `Portuguese`, `German`, `Turkish`, `Dutch`, `Ukrainian`, `Vietnamese`, `Indonesian`, `Japanese`, `Italian`, `Korean`, `Thai`, `Polish`, `Romanian`, `Greek`, `Czech`, `Finnish`, `Hindi`, `Bulgarian`, `Danish`, `Hebrew`, `Malay`, `Slovak`, `Swedish`, `Croatian`, `Hungarian`, `Norwegian`, `Slovenian`, `Catalan`, `Nynorsk`, `Afrikaans`, `auto` | Améliore la reconnaissance pour les langues et dialectes sélectionnés. |
| `output_format` |  | enum (string) | no | `hex` | `url`, `hex` | Format du contenu de sortie ; s’applique uniquement aux réponses non diffusées en continu. |
| `pronunciation_dict` |  | object {tone_list} \| null | no |  |  | Dictionnaire personnalisé des prononciations utilisé pour remplacer le texte. |
| `pronunciation_dict.tone_list` |  | array of string | no |  |  | Liste de remplacements de prononciation utilisant la syntaxe ['text/(pronunciation)', ...], par exemple ['燕少飞/(yan4)(shao3)(fei1)']. Les numéros de ton chinois vont de 1 à 5. |
| `normalization_setting` |  | object {enabled, target_loudness, target_range, target_peak} | no |  |  | Paramètres contrôlant la normalisation du volume audio. |
| `normalization_setting.enabled` |  | boolean | no | `true` |  | Active la normalisation du volume audio. |
| `normalization_setting.target_loudness` |  | number | no | `-18` | -70 – -10 | Volume souhaité, mesuré en LUFS ; valeur par défaut : -18.0. |
| `normalization_setting.target_range` |  | number | no | `8` | 0 – 20 | Plage de volume souhaitée, mesurée en LU ; valeur par défaut : 8.0. |
| `normalization_setting.target_peak` |  | number | no | `-0.5` | -3 – 0 | Niveau de crête souhaité, mesuré en dBTP ; valeur par défaut : -0.5. |
| `voice_modify` |  | object {pitch, intensity, timbre} \| null | no |  |  | Paramètres de modification de la hauteur, de l’intensité et du timbre de la voix. |
| `voice_modify.pitch` |  | integer | no | `0` | -100 – 100 | Contrôle de la hauteur mesuré en demi-tons : utilisez une valeur négative pour abaisser la voix ou une valeur positive pour l’élever. Les valeurs autorisées vont de -100 à 100. |
| `voice_modify.intensity` |  | integer | no | `0` | -100 – 100 | Contrôle de l’énergie vocale qui rend la parole plus énergique à mesure que le réglage augmente. Sa plage autorisée va de -100 à 100. |
| `voice_modify.timbre` |  | integer | no | `0` | -100 – 100 | Réglage du timbre vocal de -100 à 100, contrôlant sa tonalité. |

## Example input

Required parameters only:

```json
{
  "prompt": "Hello! Welcome to our new studio. <#0.5#> Let's make something wonderful today."
}
```

A fuller example:

```json
{
  "prompt": "Hello! Welcome to our new studio. <#0.5#> Let's make something wonderful today."
}
```

## 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/minimax/speech-2.8-hd?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Hello! Welcome to our new studio. <#0.5#> Let'\''s make something wonderful today."
  }'

# 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/minimax/speech-2.8-hd?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "prompt": "Hello! Welcome to our new studio. <#0.5#> Let's make something wonderful today."
  }),
});
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 = {
    "prompt": "Hello! Welcome to our new studio. <#0.5#> Let's make something wonderful today.",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/minimax/speech-2.8-hd", 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": "minimax/speech-2.8-hd",
      "input": {
        "prompt": "Hello! Welcome to our new studio. <#0.5#> Let's make something wonderful today."
      },
      "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": "minimax/speech-2.8-hd",
  "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": 8,
    "usd": "0.008",
    "charged": 8,
    "refunded": 0
  },
  "input": {
    "prompt": "Hello! Welcome to our new studio. <#0.5#> Let's make something wonderful today."
  },
  "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_ms": 1
  },
  "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} | Fichier audio produit par la génération. |
| `duration_ms` | integer | Durée de l’audio, mesurée en millisecondes. |

## Related models

- [MiniMax Speech 2.6 \[HD\]](https://doitong.com/developers/models/minimax/speech-2.6-hd.md) (`minimax/speech-2.6-hd`): $0.10 / 1000 characters
- [MiniMax Speech 2.6 \[Turbo\]](https://doitong.com/developers/models/minimax/speech-2.6-turbo.md) (`minimax/speech-2.6-turbo`): $0.06 / 1000 characters
- [MiniMax Speech 2.8 \[Turbo\]](https://doitong.com/developers/models/minimax/speech-2.8-turbo.md) (`minimax/speech-2.8-turbo`): $0.06 / 1000 characters
- [MiniMax Speech-02 HD](https://doitong.com/developers/models/minimax/speech-02-hd.md) (`minimax/speech-02-hd`): $0.10 / 1000 characters
- [MiniMax Speech-02 Turbo](https://doitong.com/developers/models/minimax/speech-02-turbo.md) (`minimax/speech-02-turbo`): $0.06 / 1000 characters
- [MiniMax Voice Cloning](https://doitong.com/developers/models/minimax/voice-clone.md) (`minimax/voice-clone`): $1.5198 / run
- [MiniMax Voice Design](https://doitong.com/developers/models/minimax/voice-design.md) (`minimax/voice-design`): $3.00 / run
- [Eleven v4 Text to Speech](https://doitong.com/developers/models/elevenlabs/tts/eleven-v4.md) (`elevenlabs/tts/eleven-v4`): $0.08 / 1000 characters

## Links

- HTML page: https://doitong.com/developers/models/minimax/speech-2.8-hd
- 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=minimax/speech-2.8-hd
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/minimax/speech-2.8-hd
