MiniMax Speech 2.8 Turbo · Text to Speech
The Cheap One. For Most Scripts, Take It.
- audio
- task id
Same 472 voices, same emotion dial, same sound tags, 40% cheaper than the HD sibling: $0.072 per 1,000 characters against $0.12. Unless you're cutting a broadcast spot, start here.
What it is
MiniMax's speech line has been positioned against ElevenLabs since 2025 - the London voice company whose closed TTS is the quality bar everything open gets measured against - and it's the reason the API route still wins "I need reliable multi-language narration today" in this ecosystem's audio discussions. Turbo is the speed-and-cost variant of Speech 2.8; HD is the fidelity one. You get a system voice, an emotion, and a 32 kHz mono MP3 by default, straight into your graph as a ComfyUI AUDIO.
The relevant context if you're weighing local: the open TTS field is genuinely good now - Chatterbox closed a lot of the gap, Kokoro runs in real time on a CPU - but every local option comes with an install story and a dependency-churn tax that the people maintaining those node packs complain about openly. Metered text-to-speech is what you reach for when you want a voiceover, not a project.
The inputs, and which ones actually change the result
Required, in the sense that they always exist on the node: text (the script, billed per 1,000 characters; (sighs), (laughs) and friends are performed rather than read aloud), voice_id (default Calm_Woman; the label carries the voice's name and language where known), emotion (default neutral), speed (0.5–2, default 1), pitch (−12 to +12 semitones), volume, language (auto detects from the text), output_format (mp3; pcm is headerless 16-bit little-endian), and the three format knobs - sample_rate, bitrate, audio_channels - each sitting on model default, which resolves to 32000 Hz, 128000 bps and mono.
Then the two that most people never find and should:
- english_normalization - off by default. Turn it on and numbers, dates and abbreviations are read like a person would read them. Test it on a script containing "$1,250" and you'll hear the difference immediately.
- pronunciation_dict - a JSON string: a list of objects with
"alias"and"pronunciation", where each alias in your text gets read as the pronunciation. Names, brand words, anything the model mangles. This is the escape hatch for the specific words you actually care about.
If you're choosing between this and HD: the difference is in the voice's fidelity, and it's most audible on longer, slower reads. For a 15-second line under a video, you will probably not notice. Spend the 40%.
Outputs: audio and task id. audio goes into Save Audio; if the model returns several clips they arrive as a batch and Save Audio writes a file for each.
Installing it
ComfyUI Manager → search SpicyAPI → install → restart. Manual route:
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 → restart once more so your node list is built from your account. Remote or headless box? SPICY_API_KEY in the environment replaces the settings field, and the pack honours HTTPS_PROXY if you're behind one. Nothing else installs: the pack has no dependencies, so it can't break your torch or transformers versions the way local TTS packs sometimes do.
Traps and errors
Billing is by characters, so the only way to run up a tab is a long script - but set Max cost per run in Settings > SpicyAPI anyway; the node quotes first and refuses anything over your ceiling before creating a task. 40310 is simply an unverified email on your SpicyAPI account. 40004 means the model has no deployment for that exact parameter combination, and the message names the option to change - change it rather than re-queueing. And if you cancel a run, it keeps generating server-side: charged if it succeeds, retrievable in your console for up to 14 days.
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. |