Nodes/arkennemasis - ChatGPT / Codex / fal AI nodes/arkennemasis fal · ElevenLabs Dubbing · $0.6/min
ComfyUI Node

arkennemasis fal · ElevenLabs Dubbing · $0.6/min

Your clip, another language, same voice — 60 cents a minute

By Hishamahmer·Created 3 months ago·Updated 9 days ago· 11
arkennemasis fal · ElevenLabs Dubbing · $0.6/min
  • audio
  • video
  • video
  • video_path
  • target_lang
  • info
◄target_lang►
◄source_lang►
◄num_speakers-1►
◄highest_resolutiontrue►
◄max_cost_usd20.0►
◄reuse_identical_runtrue►
◄extra_json►
◄max_concurrent1►

This is the node that does the thing people assume is impossible: it takes a clip with someone talking in one language and hands back the same clip with that person apparently talking in another. Not subtitles. Not a robot reading a translation over the top. The original voice, moved.

It's also the most expensive audio node in this pack, and the one most likely to disappoint if you don't know what it does and doesn't fix. The dubbing output is a video, and the lips are the originals - they're speaking the shape of the source language. Voice dubbing, not lip sync. If you need the mouth to match, that's a separate stage: dub first, then run the dubbed video through a lip-sync node.

How it works

Your audio or video goes up to fal's CDN (free, but not instant for a big file), a single billed call produces a dubbed video, and the result is downloaded to output/fal/fal-ai_elevenlabs_dubbing/ with the request logged in output/fal/_requests.jsonl. Everything upstream of that - the key, the validation, the cost estimate and its pre-flight check against max_cost_usd - behaves exactly like every other fal node in the pack.

The inputs that matter

target_lang is required and is the only mandatory widget: an ISO 639-1 code for what you want out. Get this wrong and you'll pay for a translation into a language you can't check.

source_lang is optional - leave it empty and the language is auto-detected, which works well on clean audio and badly on heavy accents or music beds.

num_speakers defaults to -1, meaning auto-detect. Auto-detection is the single most common cause of a dubbing result that sounds like a committee, so if you know there are two people, say two. If you know there's one, say one.

highest_resolution is on by default. Video sources get re-encoded; this asks for the better encode. Leave it on unless you're deliberately keeping the file small.

Then the two source sockets, audio and video - at least one required, and the tooltip is explicit that video takes priority if both are connected. Hand it a video and you get a video back; hand it audio and you get an audio-derived result.

Outputs: video, video_path, target_lang (echoing back what was actually used, which is a nice detail for a batch run), and info.

Money

$0.60 per minute, rounded up to the nearest minute. A six-minute video is $3.60. A thirty-second advert is still $0.60. This is the node where max_cost_usd - $20 by default, checked before anything is uploaded - earns its keep: forty minutes of source material trips it and the node stops, costing you nothing but the click.

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 (the node reads that file or the one in the ComfyUI folder, nothing else). No local models, no extra packages for the fal nodes.

Common issues & troubleshooting

The mouths don't match the words. Expected, and it's not a fault. Dubbing substitutes the voice track; for matched lips you need a lip-sync pass afterwards, and this pack has a whole arkennemasis/fal/Lip Sync menu for that.

The result sounds like several people taking turns in one voice. Auto-detected speaker count. Set num_speakers to the real number.

Background music came through mangled, or the translation is nonsense. Dub from a cleaned track: run the source through the ElevenLabs Audio Isolation node first, at a tenth of the price per minute, then dub the isolated voice. This is the single biggest quality win available in this pipeline.

Wrong language selected. target_lang is free text - there's no dropdown to save you from a typo, and there's no validation until fal answers. Double-check the code before a long run.

A run of several clips costs more than expected. Billing rounds each request up to the minute; five 20-second clips are five billed minutes, not one and a half. Concatenate first if the workflow allows it.

Changed your mind mid-run. ComfyUI's Cancel propagates to fal. If the app crashed instead, the job kept going server-side - pull it down for free with the pack's fal Recover Result node and the request id in the ledger.

Categoryarkennemasis/fal/Audio/ElevenLabs

Inputs (10)

NameTypeDefaultDescription
target_langSTRINGTarget language code for dubbing (ISO 639-1)
source_langSTRINGSource language code. If not provided, will be auto-detected. Empty leaves it out.
num_speakersINT-1-1–50Number of speakers in the audio. If not provided, will be auto-detected. -1 leaves it to the model.
highest_resolutionBOOLEANtrueWhether to use the highest resolution for dubbing.
audiooptAUDIOURL of the audio file to dub. Either audio_url or video_url must be provided.
videooptVIDEOURL of the video file to dub. Either audio_url or video_url must be provided. If both are provided, video_url takes priority.
max_cost_usdoptFLOAT20.00–100000Safety 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_runoptBOOLEANtrueIf 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_jsonoptSTRINGAdvanced: 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_concurrentoptINT11–32How 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)

NameTypeDescription
videoVIDEO—
video_pathSTRING—
target_langSTRING—
infoSTRINGJSON: request id, cost estimate, saved files and fal's full answer.