arkennemasis fal · ElevenLabs TTS Multilingual v2 · $0.1/1k chars
Eleven widgets and the two that make long narration work
- audio
- audio_path
- timestamps
- info
Multilingual v2 is the oldest TTS node in this pack and still the one with the most knobs: eleven widgets against the newer v3 and v4 nodes' six. That's not nostalgia - two of those extras are the reason to pick it for long-form work, and one of them is a genuinely good trick.
The trick is previous_text and next_text. TTS models generate in chunks, and chunked generation has a tell: the delivery resets at every seam, so a ten-part narration sounds like ten narrations. Feed the model the sentence before and the sentence after the current chunk, and it carries the prosody across the join. If you've ever rendered a long script and had the fourth paragraph come out with a different energy than the third, this is the fix, and it's the sort of thing you only learn by reading the schema.
How it works
Standard fal-node plumbing for this pack: key from the install's .env, input validation, a cost estimate from the character count, one billed call, polling with status on the node, and audio written to output/fal/fal-ai_elevenlabs_tts_multilingual-v2/. Requests land in output/fal/_requests.jsonl with their estimates, which is how you find out what a batch actually cost.
The inputs that matter
text is required. voice is free text, defaulting to Rachel. Then:
stability(0–1, default 0.5) - lower for expressiveness, higher for a consistent read across a long script.similarity_boost(0–1, default 0.75) - closer to the reference voice, slightly less natural. This is the dial the v3 node doesn't have.style(0–1, default 0) - style exaggeration. It's at zero for a reason; a little goes a long way.speed- 0.7 to 1.2, and the tooltip warns that extreme values hurt quality. Sitting at 0.7 to stretch a script to fit a runtime is a trap; fix the runtime instead.previous_text/next_text- the continuity trick above.language_code- ISO 639-1, and it's enforced rather than hinted: an unsupported code errors instead of falling back.apply_text_normalization-auto/on/off, deciding whether numbers and dates get spelled out.timestamps- word-level timing, the thing you want if captions are coming.
Outputs: audio, audio_path, timestamps, info.
Money
$0.10 per 1,000 characters, the same as Eleven v3, and a fifth of the music nodes' per-minute rate. Note there's no speed-based discount: stretching a script with speed: 0.7 costs exactly the same and sounds worse. The max_cost_usd default of $20 is about 200,000 characters, i.e. a short novel; the guardrail that actually matters in a long-form pipeline is the pack's branch gating, so a failed render doesn't re-run the whole chain.
Install
Manager → search comfyui-arkennemasis, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart, then FAL_KEY=your-key-from-fal.ai/dashboard/keys in the .env beside run_nvidia_gpu.bat. No downloads, no dependencies for the fal provider - the pack's only requirement is httpx, for its Codex/ChatGPT-login nodes.
Common issues & troubleshooting
Every paragraph sounds like a restart. Use previous_text and next_text. Split the script into sentence-boundary chunks and pass the neighbouring text with each one; it's more wiring and dramatically better output.
The voice drifts across a long render. Raise stability. That's what it's for.
A language code errored the run. Enforced by the model, not a node bug. Clear the field to let it infer from the text.
Numbers read oddly. apply_text_normalization set to off, or auto guessing wrong. Force it.
Captions land late or early. Your timings came from somewhere else. Turn on timestamps here, or run the rendered audio through a transcription or alignment node for real word times - the pack's own caption tooling is honest that estimation drifts when a performance deviates from the script.
A run that looked like it hung. Long text takes time, and this node polls rather than timing out - status, elapsed seconds and the estimate show while it works. Cancel cancels on fal too, and if ComfyUI died, fal Recover Result collects the paid job by request id for free.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | The text to convert to speech | |
| voice | STRING | Rachel | The voice to use for speech generation Empty leaves it out. |
| stability | FLOAT | 0.500–1 | Voice stability (0-1) |
| similarity_boost | FLOAT | 0.750–1 | Similarity boost (0-1) |
| style | FLOAT | 0.000–1 | Style exaggeration (0-1) |
| speed | FLOAT | 1.000.7–1.2 | Speech speed (0.7-1.2). Values below 1.0 slow down the speech, above 1.0 speed it up. Extreme values may affect quality. |
| timestamps | BOOLEAN | false | Whether to return timestamps for each word in the generated speech |
| previous_text | STRING | The text that came before the text of the current request. Can be used to improve the speech's continuity when concatenating together multiple generations or to influence the speech's continuity in the current generation. Empty leaves it out. | |
| next_text | STRING | The text that comes after the text of the current request. Can be used to improve the speech's continuity when concatenating together multiple generations or to influence the speech's continuity in the current generation. Empty leaves it out. | |
| language_code | STRING | Language code (ISO 639-1) used to enforce a language for the model. An error will be returned if language code is not supported by the model. Empty leaves it out. | |
| apply_text_normalization | COMBO | auto | This parameter controls text normalization with three modes: 'auto', 'on', and 'off'. When set to 'auto', the system will automatically decide whether to apply text normalization (e.g., spelling out numbers). With 'on', text normalization will always be applied, while with 'off', it will be skipped. |
| 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 | — |
| timestamps | STRING | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |