MiniMax Speech 2.8 HD · Text to Speech
472 Voices, an Emotion Dial, and (sighs) Actually Performed
- audio
- task id
If you want a voiceover and you don't want to clone anything, this is the no-fuss lane. Paste a script, pick one of 472 system voices, choose an emotion, and get a 32 kHz mono MP3 back at $0.12 per 1,000 characters. No reference audio, no speaker encoder, no 20-minute local install.
Where this sits
The KB's audio survey splits speech work into three jobs and notes that the API still wins the one where reliability matters most: best-in-class multi-language TTS. The local options are genuinely good now - Chatterbox made open TTS competitive, Kokoro is the lightweight pick - but each has a setup story, and Chatterbox's own pack maintainers describe the dependency churn as a standing tax. MiniMax's voice line has been benchmarked against ElevenLabs by MiniMax itself since 2025, and this HD model is the higher-fidelity variant of the pair. So: reach for this when the words matter more than the plumbing, and reach for a local model when you're generating thousands of lines a day and the per-character bill starts to look like rent.
The inputs worth understanding
- text (required) - read exactly as written, billed per 1,000 characters. Sound tags like
(sighs)or(laughs)are performed rather than spoken, which is a cheap way to make a read sound human. - voice_id - default
Calm_Woman. The label shows the voice name plus the language it was built for where known. Browse before you commit; the wrong voice is the most common reason a take feels off. - emotion - default
neutral. This is the dial that actually changes a performance, more than speed or pitch will. - speed (0.5–2, default 1), pitch (−12 to +12 semitones, default 0), volume (0.1–10, default 1).
- language -
autoby default, which detects from the text. Setting it explicitly is a pronunciation hint, useful for short lines that don't give the detector much to work with. - output_format -
mp3by default;pcmis headerless 16-bit little-endian samples, which you probably don't want unless you're feeding a pipeline. - sample_rate, bitrate, audio_channels - all
model default. The model uses 32000, 128000 and mono respectively when you leave them alone. - english_normalization - off by default. Turn it on and numbers, dates and abbreviations get read the way a person would say them, which matters the moment your script contains "$4.99" or "Dr.".
- pronunciation_dict - a JSON field for words the model gets wrong. Each entry is an object with
"alias"and"pronunciation", and every occurrence of the alias in your text is read as the pronunciation. This is the fix for names.
Outputs are audio and task id. Wire audio into Save Audio; if several clips come back they're batched and Save Audio writes one file each.
Installing it
ComfyUI Manager → search SpicyAPI → install → restart. Otherwise:
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart ComfyUI, then Settings > SpicyAPI → paste a key from spicyapi.ai/console/keys, then restart once more so the node list is built from your account. Server install? Use SPICY_API_KEY. The pack installs nothing - no dependencies, no model downloads, no TTS engine to break your transformers version.
Cost and gotchas
Billing is per 1,000 characters, so a long script is the only real expense; rewriting a paragraph to test an emotion costs a fraction of a cent. If you're iterating on a long read, set Max cost per run in Settings > SpicyAPI anyway - the node checks the quote against it and stops before anything is charged.
Two failures are worth recognising by code. 40310 means your SpicyAPI account hasn't verified its email yet - click the link from sign-up, that's all. And 40004 means the model has no deployment for the exact parameter combination you asked for; the message names the offending option, so change that rather than re-queueing. There's no seed here: every run is a fresh performance, and every run is billed.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | The words to be spoken, exactly as written. Sound tags such as (sighs) or (laughs) are performed. Billed per 1,000 characters. | |
| voice_id | COMBO | Calm_Woman | System voice. The label shows the voice name and, where known, the language it is built for. |
| emotion | COMBO | neutral | Emotion of the reading. |
| speed | FLOAT | 1.000.5–2 | Speaking rate; 1 is the voice's normal pace. |
| pitch | INT | 0-12–12 | Pitch shift in semitones; 0 keeps the voice's own pitch. |
| volume | FLOAT | 1.00.1–10 | Loudness multiplier; 1 is the normal level. |
| language | COMBO | auto | Language hint that improves pronunciation; auto detects it from the text. |
| output_format | COMBO | mp3 | File format of the result; pcm is headerless 16-bit little-endian samples. |
| sample_rate | COMBO | model default | Sample rate in Hz. The model uses 32000 when omitted. |
| bitrate | COMBO | model default | MP3 bitrate in bits per second; ignored for other formats. The model uses 128000 when omitted. |
| audio_channels | COMBO | model default | Mono or stereo output. Mono when omitted. |
| english_normalization | BOOLEAN | false | Read numbers, dates and abbreviations in English text the way a person would say them. |
| pronunciation_dict | STRING | Custom pronunciations: each alias in the text is read as its pronunciation. JSON. A list of objects with "alias", "pronunciation". | |
| seed | INT | 00–2147483647 | This model takes no seed, so the number is never sent. Changing it makes ComfyUI run the node again: set 'control after generate' to randomize for a new result on every run; every run is billed. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | Several results come back as a batch; Save Audio writes one file each. |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |