arkennemasis fal · MiniMax Speech 02 HD · $0.1/1k chars
$0.10 per 1,000 Characters, No Voice Clone Required
- audio
- audio_path
- duration_ms
- info
Speech 02 HD is MiniMax's flagship TTS - the model line the lab launched in January 2025 and benchmarked, openly, against ElevenLabs. This node is the fal endpoint wrapped for ComfyUI, priced at $0.10 per 1,000 characters. Paste a script, get an MP3 with a waveform you can play on the node.
Why you'd use it instead of a local TTS
Local TTS got genuinely good - Chatterbox at ElevenLabs-adjacent quality, Kokoro for speed, and both run on your own card. The KB's honest split is that the API still wins the two jobs where reliability matters most: best-in-class multi-language output, and production-grade delivery where a mispronounced name is expensive. MiniMax's own positioning is exactly that lane. If you're narrating in one language with a generic voice and it's not a paid deliverable, use Chatterbox and keep your money. If you need Arabic and German from the same script, or a specific predefined voice, this is the node.
How it works
The usual pack plumbing: FAL_KEY from the .env beside your launcher, input validation, a cost estimate sized from the character count of your text, one billed submit to fal, polling, then download into output/fal/fal-ai_minimax_speech-02-hd/. Nothing before the submit costs anything - and there are no uploads here at all, so a rejected input is entirely free.
Inputs
text- note the field name:text, notprompt, and capped at 5000 characters. The price is straight arithmetic on this box, so a 500-word narration (~2,600 characters) is about 26 cents.voice_setting_voice_id- a free-text box defaulting toWise_Woman, one of MiniMax's predefined voice IDs. Empty leaves the choice to the model. This is a predefined-voice picker, not a clone slot.voice_setting_emotion-(not set),happy,sad,angry,fearful,disgusted,surprised,neutral.(not set)lets the model decide from your text, which is usually the right default.voice_setting_speed(0.5–2.0),voice_setting_pitch(−12 to 12),voice_setting_vol(0.01–10) - the small dials. Speed is the one people actually use; 1.05 or 1.1 often cleans up a narration read that drags.language_boost- an explicit language picker (English, Chinese, Japanese, German, Arabic and a long tail, plusauto). Worth setting: it tells the model what language it's reading, which is how you stop numbers and names from being read with the wrong accent.voice_setting_english_normalization- off by default; turn it on if your script is number-heavy and reads badly.audio_setting_format(mp3,pcm,flac),audio_setting_bitrate(32000–256000),audio_setting_sample_rate(8000–44100),audio_setting_channel(1 = mono, 2 = stereo).pronunciation_dict- a JSON box for text replacements, which is the escape hatch for a name the model keeps mangling. Empty leaves it out.output_format-urlorhex, defaulthex, non-streaming only. Leave it as shipped.
Optional: max_cost_usd (default $20; the run halts before sending if the estimate is over it, 0 = off), max_concurrent (default 1), reuse_identical_run (identical text and settings return the file you already paid for, restart included), extra_json.
Outputs: audio (waveform + sample rate, playable on the node), audio_path, duration_ms - an integer you can wire into the pack's Narration Length or Word Timings to time shots and captions to the real read - and info.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install httpx
Or ComfyUI Manager → Install via Git URL. Then:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
in the .env next to run_nvidia_gpu.bat. Restart, and it's under arkennemasis/fal/Audio/MiniMax.
The tier question
HD at $0.10/1,000 characters versus Turbo at $0.06. Same model family, same inputs, same voice list. Turbo is the one for "does this script read well?" - you're paying 60% for a check. HD earns its price on the final render, where the difference in warmth and breathing is the thing people notice. Iterate cheap, deliver HD.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | Text to convert to speech (max 5000 characters, minimum 1 non-whitespace character) | |
| voice_setting_speed | FLOAT | 1.000.5–2 | Speech speed (0.5-2.0) |
| voice_setting_vol | FLOAT | 1.000.01–10 | Volume (0-10) |
| voice_setting_english_normalization | BOOLEAN | false | Enables English text normalization to improve number reading performance, with a slight increase in latency |
| voice_setting_pitch | INT | 0-12–12 | Voice pitch (-12 to 12) |
| voice_setting_emotion | COMBO | (not set) | Emotion of the generated speech '(not set)' leaves it to the model. |
| voice_setting_voice_id | STRING | Wise_Woman | Predefined voice ID to use for synthesis Empty leaves it out. |
| audio_setting_format | COMBO | mp3 | Audio format |
| audio_setting_bitrate | COMBO | 128000 | Bitrate of generated audio |
| audio_setting_sample_rate | COMBO | 32000 | Sample rate of generated audio |
| audio_setting_channel | COMBO | 1 | Number of audio channels (1=mono, 2=stereo) |
| language_boost | COMBO | (not set) | Enhance recognition of specified languages and dialects '(not set)' leaves it to the model. |
| output_format | COMBO | hex | Format of the output content (non-streaming only) |
| pronunciation_dict | STRING | Custom pronunciation dictionary for text replacement JSON. Empty leaves it out. | |
| max_cost_usdopt | FLOAT | 20.00–100000 | Safety cap. If the estimated cost of this run is above this many US dollars the node stops BEFORE sending anything to fal. 0 = no cap. |
| reuse_identical_runopt | BOOLEAN | true | If these exact inputs (the settings AND the same pictures/clips/audio) were already paid for and the files are still in output/fal, return them instead of paying again - also after a ComfyUI restart. Turn off for a fresh take with the same settings. |
| extra_jsonopt | STRING | Advanced: a JSON object merged into the request last, for any fal field this node has no box for. Example: {"seed": 7}. Leave empty normally. | |
| max_concurrentopt | INT | 11–32 | How many paid fal calls may run at the same time in one run, across every fal node. 1 (default) = one after another. This node starts its paid part only while fewer than this many fal calls are running. Once any fal node fails, the ones still waiting are not started, so nothing more is billed. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| audio_path | STRING | — |
| duration_ms | INT | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |