arkennemasis fal · MiniMax Speech 2.8 HD · $0.1/1k chars
Where It Starts Sighing and Laughing on Command
- audio
- audio_path
- duration_ms
- info
Newest of the MiniMax speech nodes in this pack, and the first one with a personality dial. Same $0.10 per 1,000 characters as the rest of the HD tier, and it keeps everything 2.6 added - pause markers, loudness normalization, a 10,000-character script budget - then adds non-verbal interjections and a three-axis voice tweaker on top.
The two things that are new
Interjections. You can type (laughs), (sighs), (coughs), (clears throat), (gasps), (sniffs), (groans) or (yawns) into the script and the model performs them. For a character voice in a short - the sort of thing where a dry read kills the joke - that's a genuinely useful tool, and it's the kind of control you'd otherwise be farming out to an audio editor and a library of stingers.
voice_modify_pitch, voice_modify_intensity, voice_modify_timbre - three integers, each −100 to 100, defaulting to 0. These are not the same as voice_setting_pitch, which shifts the read by semitones; this trio re-timbres the voice itself: pitch character, energy, tonal quality. It's how you take one predefined voice and get three distinguishable speakers out of it.
How it works
The pack's usual fal plumbing: FAL_KEY read from the .env beside your launcher, input validation, a cost estimate from the character count checked against max_cost_usd, one billed submit, polling with a status label on the node, download into output/fal/fal-ai_minimax_speech-2.8-hd/. No uploads happen on a TTS run, so nothing before the submit can cost you anything. MiniMax's voice line is closed and hosted, benchmarked by the lab against ElevenLabs - the reason to pay for it rather than run Chatterbox locally is multilingual reliability, and that tradeoff hasn't changed.
Inputs
prompt- script, 1 to 10,000 characters. Accepts<#x#>pauses (seconds, 0.01–99.99, between speakable segments, never consecutive) and the interjection tags above.voice_setting_voice_id- free-text, defaultWise_Woman, from MiniMax's predefined IDs. Empty leaves it to the model.voice_setting_emotion-(not set),happy,sad,angry,fearful,disgusted,surprised,neutral.language_boost- the explicit language picker includingauto. Set it.voice_setting_speed(0.5–2.0),voice_setting_pitch(−12 to 12 semitones - different dial from thevoice_modify_*trio),voice_setting_vol(0.01–10),voice_setting_english_normalization(off by default).voice_modify_pitch/voice_modify_intensity/voice_modify_timbre- each −100 to 100, default 0.- Loudness:
normalization_setting_enabled(on by default),normalization_setting_target_loudness(−18 LUFS default),normalization_setting_target_range(8 LU),normalization_setting_target_peak(−0.5 dBTP). - Output:
audio_setting_format(mp3,pcm,flac),audio_setting_bitrate,audio_setting_sample_rate,audio_setting_channel(1 mono, 2 stereo),pronunciation_dict(JSON replacements),output_format(url/hex; leave the default).
Optional: max_cost_usd ($20 default, 0 = off; the node stops before sending anything if the estimate is above it), max_concurrent (default 1 - one paid fal call at a time across a run), reuse_identical_run (identical inputs return the file you already paid for, restart included), extra_json.
Outputs: audio (waveform + sample rate, with a player on the node), audio_path, duration_ms (feed it to Narration Length or Word Timings to time shots and captions to the real read), info (request id, cost 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; it's under arkennemasis/fal/Audio/MiniMax. There's also a Speech 2.8 Turbo sibling in the pack if you'd rather iterate at the Turbo rate.
Using it without wasting takes
Interjections are cheap fun and expensive habits - every one of them is another billed run while you fine-tune placement. Write them on the first pass, then re-render once, not seven times.
Where the voice_modify_* dials earn their keep: intensity is the one I'd touch first. Nudging it positive makes a read sound like the speaker cares, and it's the least likely of the three to break the voice's identity. Leave timbre alone unless you're deliberately building a second character from the same predefined voice.
And the standing pack behaviour: same text plus same settings returns your earlier file rather than billing again. If a re-render looks suspiciously identical, that's the node being honest, not lazy.
Inputs (25)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Text to convert to speech. Use `<#x#>` for pauses (x = 0.01-99.99 seconds). Supports interjection tags: `(laughs)`, `(sighs)`, `(coughs)`, `(clears throat)`, `(gasps)`, `(sniffs)`, `(groans)`, `(yawns)`. | |
| 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. | |
| normalization_setting_target_range | FLOAT | 8.000–20 | Target loudness range in LU (default 8.0) |
| normalization_setting_target_loudness | FLOAT | -18.00-70–-10 | Target loudness in LUFS (default -18.0) |
| normalization_setting_enabled | BOOLEAN | true | Enable loudness normalization for the audio |
| normalization_setting_target_peak | FLOAT | -0.50-3–0 | Target peak level in dBTP (default -0.5). |
| voice_modify_pitch | INT | 0-100–100 | Pitch adjustment in semitones. Range: -100 to 100. Positive values raise pitch, negative values lower it. |
| voice_modify_intensity | INT | 0-100–100 | Intensity/energy of the voice. Range: -100 to 100. Higher values create more energetic speech. |
| voice_modify_timbre | INT | 0-100–100 | Timbre adjustment. Range: -100 to 100. Affects the tonal quality of the voice. |
| 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. |