arkennemasis fal · MiniMax Preview Speech 2.5 HD · $0.1/1k chars
10 Cents per 1,000 Characters, Better Than the Name Suggests
- audio
- audio_path
- duration_ms
- info
"Preview" in the endpoint name makes it sound like a work-in-progress. It isn't a downgrade in the way you'd assume - this is the Speech 2.5 generation on fal's preview route, priced identically to the Speech 02 HD node at $0.10 per 1,000 characters. The thing that actually separates it from its siblings is the language list.
What it is, and why the language list matters
MiniMax's voice line is the part of their catalogue they benchmark openly against ElevenLabs, and the practical reason to pay for TTS at all is the same everywhere: local models like Chatterbox and Kokoro are excellent in a single language and less reliable across many. This node exposes a language_boost picker that includes Persian, Filipino and Tamil on top of the usual Chinese/English/Japanese/Korean/European set - and those three are exactly the ones missing from the 2.6 and 2.8 node lists in this pack. If your narration is in Farsi or Tagalog, that's not a nice-to-have, that's the reason you're on this node.
How it works
Standard pack behaviour over fal's minimax/preview/speech-2.5-hd endpoint: read FAL_KEY from the .env beside your launcher, validate the text, estimate cost from the character count, submit one billed request, poll while the node shows status, then download into output/fal/fal-ai_minimax_preview_speech-2.5-hd/. No uploads, so nothing before the submit can cost you anything.
One small confusion to head off: fal's own description text for these preview endpoints still says "using the MiniMax Speech-02 HD model" - the marketing copy wasn't updated when the endpoint moved on. Ignore the blurb; the box list is what the model takes.
Inputs
text- the field istexton this generation (the 2.6 and 2.8 nodes call itprompt), capped at 5000 characters. Your bill tracks this box: ~500 words is about 26 cents.voice_setting_voice_id- free text, defaultWise_Woman, from MiniMax's predefined voice IDs. Empty leaves it to the model. This is not a cloning slot.voice_setting_emotion-(not set)plushappy,sad,angry,fearful,disgusted,surprised,neutral.language_boost- set it. An English script read with the wrong language hint is where "the model can't pronounce anything" complaints come from.voice_setting_speed(0.5–2.0),voice_setting_pitch(−12 to 12),voice_setting_vol(0.01–10),voice_setting_english_normalization(off by default).- Output:
audio_setting_format(mp3,pcm,flac),audio_setting_bitrate(32k–256k),audio_setting_sample_rate(8k–44.1k),audio_setting_channel(1 mono, 2 stereo),pronunciation_dict(JSON replacements for names the model butchers),output_format(urlorhex, non-streaming only - keep the default).
Optional, same four as every node in the pack: max_cost_usd ($20 default; the run stops before sending when the estimate exceeds it, 0 = uncapped), max_concurrent (default 1 - one paid fal call at a time in a run), reuse_identical_run (default on: identical text and settings return your already-paid file, even after a restart), extra_json.
Outputs: audio (waveform and sample rate, with a player on the node), audio_path, duration_ms - wire that integer into the pack's Narration Length so each shot covers its own voice-over - and info (request id, estimate, saved files, fal's answer).
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; the node is under arkennemasis/fal/Audio/MiniMax.
Notes
The 5000-character cap is a hard stop, and no pause markers exist on this generation - the <#x#> syntax showed up later. If you need a deliberate beat in the read, use a full stop and a new sentence, or splice it in your editor.
For a script you're still editing, run the Turbo sibling at $0.06 instead and keep this one for the take you'll ship. The inputs are identical, so switching is a copy-paste, not a rebuild.
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. |