arkennemasis fal · ElevenLabs TTS Eleven v4 Turbo · $0.04/1k chars
Half the price, and you probably won't hear it
- audio
- audio_path
- timestamps
- info
Four cents per thousand characters. That's the whole pitch, and it's a good one - the non-Turbo Eleven v4 node next door costs eight. Same widgets, same audio tags, same character limit, same output options. The difference is a latency-optimised model, and the honest summary of the difference is: on a clean read of ordinary prose, most people can't reliably pick them apart in a blind listen. On a deliberately emotional line with three stacked audio tags, they sometimes can.
So the decision isn't "which sounds better" in the abstract. It's "how many takes am I going to burn." If you're auditioning delivery on a 600-character paragraph and you'll run it six times before you like it, Turbo saves you real money. If you're rendering the final pass of a scripted narration with tagged delivery, pay the eight cents and get the non-Turbo take.
How it works
Standard fal-node behaviour for this pack: FAL_KEY from the install's .env, input checks, a cost estimate derived from your character count, one billed submission, polling with live status, and audio downloaded to output/fal/elevenlabs_tts_eleven-v4-turbo/. Every request is logged to output/fal/_requests.jsonl with its estimate, so you can total up what a session actually cost instead of guessing.
The inputs that matter
text (up to 5,000 characters) is required and is where the delivery instructions go - [whispering], [excited], [sighs] inline, plus IPA in forward slashes for names the model keeps fluffing. voice is a free-text string defaulting to Rachel; empty lets the model choose.
Then the two dials worth turning: stability (0–1, default 0.5 - lower for expressiveness, higher for consistency) and similarity_boost (default 0.75 - closer to the reference voice, slightly less natural). The rest are set-and-forget: seed (best-effort), language_code (ISO 639-1), output_format (mp3_44100_128 default, with PCM/Opus if something downstream insists), apply_text_normalization (auto/on/off for numbers and dates), and timestamps for character-level timing.
Outputs are audio, audio_path, timestamps and info. Wire audio into a save node, the pack's video assembly, or a lip-sync node; timestamps is what you want if you're placing captions on real timings rather than estimating them from the script.
Money, plainly
$0.04 per 1,000 characters. A 5,000-character narration - the maximum this endpoint accepts, roughly 35 minutes of speech you'll never actually write in one go - is twenty cents. For scale: 1,500 characters of documentary narration is six cents on this node and twelve on the non-Turbo one. You are not going to bankrupt yourself either way; the reason to care is that cheap enough to iterate on means you actually do iterate, and the delivery gets better.
Install
Manager → search comfyui-arkennemasis, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart, then one line in the .env beside run_nvidia_gpu.bat:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
There is no key box on the node and no environment fallback - the key comes from that file and nowhere else, which is why a shared workflow can't leak it.
Common issues & troubleshooting
You got the same audio back twice with no charge. reuse_identical_run defaults to true and returned the previously paid result from output/fal. When you're auditioning, turn it off on this node; when you're re-running a graph to test wiring, leave it on.
A bracket tag was read aloud as words. Not every tag is honoured. Verify the ones you'll rely on.
The read sounds flat compared to the other node. That's the trade you made. Drop stability a notch before you blame the model, and if it still isn't there, re-render the line on the non-Turbo Eleven v4 node.
Choosing between this and a local model. Chatterbox runs on your own GPU, is MIT-licensed, and clones a voice from a few seconds of reference audio - for privacy or a specific voice, that's a real option and the audio-generation side of this KB explains where it stands. This node's advantages are delivery control and an install you don't have to think about.
A failure before submission. Free. The node checks text length and required fields before it uploads or sends anything, so an input error never bills you.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | The text to convert to speech. Supports audio tags such as [whispering] and IPA pronunciation enclosed in forward slashes. | |
| voice | STRING | Rachel | The voice to use for speech generation Empty leaves it out. |
| stability | FLOAT | 0.500–1 | Voice stability. Lower values allow more expressive delivery; higher values make delivery more consistent. |
| similarity_boost | FLOAT | 0.750–1 | How closely the output follows the reference voice. Higher values increase similarity but may reduce naturalness. |
| seed | INT | -1-1–4294967295 | Seed for best-effort reproducibility. Identical output is not guaranteed. -1 leaves it to the model. |
| language_code | STRING | Language code (ISO 639-1) for speech generation and text normalization. Empty leaves it out. | |
| output_format | COMBO | mp3_44100_128 | Output format of the generated audio. Formatted as codec_sample_rate_bitrate. |
| apply_text_normalization | COMBO | auto | Whether to normalize text such as numbers and dates before generation. |
| timestamps | BOOLEAN | false | Whether to return character-level timing information with the generated audio. |
| 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. |