arkennemasis fal · MiniMax Speech 02 Turbo · $0.06/1k chars
The $0.06 Draft Voice You Keep Coming Back To
- audio
- audio_path
- duration_ms
- info
Six cents per 1,000 characters, same input surface as the HD node next to it. Turbo is the version you run while the script is still moving - cheap enough that changing one sentence and re-rendering doesn't sting, which is the whole reason it exists.
What it is
The fal wrapper for minimax/speech-02-turbo, MiniMax's fast TTS tier. MiniMax's voice line is the piece of their catalogue they position directly against ElevenLabs, and this is the cheap rung: same predefined voices, same language list, less polish. In ComfyUI terms it's a text-in, audio-out node with no local weights, and it's the natural companion to a video pipeline - narration, then the pack's Narration Length node to make each shot outlast its own voice-over.
How it works
FAL_KEY from the .env beside your launcher, validation, a cost estimate computed from your text's character count, one billed request to fal, polling, download into output/fal/fal-ai_minimax_speech-02-turbo/. Text is the only input type; nothing gets uploaded, so the only thing you can lose on a bad configuration is time.
Inputs worth setting
text- the field is namedtexton this generation of nodes, capped at 5000 characters. Your bill is a function of this box: roughly 500 English words is 2,600 characters, about 16 cents at Turbo rates.voice_setting_voice_id- free text, defaulting toWise_Woman. Paste any MiniMax predefined voice ID; an empty value leaves it to the model.voice_setting_emotion-(not set),happy,sad,angry,fearful,disgusted,surprised,neutral. Leave it at(not set)unless you need a specific read; the model picks something sensible from your text.language_boost- set the language explicitly rather than leaving it at(not set). It's the difference between a German sentence read as German and a German sentence read by an English speaker guessing.voice_setting_speed- 0.5 to 2.0. Nudging to 1.05 is a common fix for a read that feels slow in a short-form cut.- Also here:
voice_setting_pitch(−12 to 12),voice_setting_vol(0.01–10),voice_setting_english_normalization(off by default - turn on for number-heavy scripts). - Output plumbing:
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 text replacements for names the model keeps getting wrong), andoutput_format(urlorhex, non-streaming only - leave it athex).
Optional pack controls: max_cost_usd (default $20 - effectively unreachable on TTS unless you're pasting a novel, and 0 disables it), max_concurrent (default 1; one paid fal call at a time across a run), reuse_identical_run (unchanged text returns the already-paid file), extra_json (raw JSON merged into fal's request last).
Outputs: audio (a real waveform with a player on the node), audio_path (file on disk), duration_ms (the measured read length - feed it into Narration Length or Word Timings so captions and shots follow the voice instead of a guess), and info with the request id, estimate and fal's answer.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install httpx
Or Manager → Install via Git URL. Then create .env beside run_nvidia_gpu.bat:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
Restart and it's under arkennemasis/fal/Audio/MiniMax.
When Turbo is enough, and when it isn't
For anything where the voice is functional - a tutorial, a product demo, a rough cut you'll re-record - Turbo is done. The honest reason to step up to HD at $0.10 is the final delivery on a narration people will sit through for ten minutes: that's where the extra warmth and the better handling of long sentences shows.
One habit that will save you money and confusion: because reuse_identical_run is on by default, tweaking the speed but not the text still counts as a change, while re-running with nothing changed returns your old file. If you're doing a five-variant read-aloud comparison, that's six cents a take - cheaper than the coffee you're drinking while you decide.
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. |