arkennemasis fal · VEED Fabric 1.0 · $0.08-0.15/s
One photo plus a voice track equals a talking head
- image
- audio
- video
- video_path
- info
Two sockets and a dropdown. That's the entire node: put a picture of a person in one side, a voice in the other, and you get back a video of them saying it. No prompt, no motion settings, no reference video. VEED pitched Fabric as a talking-video model that beats the local competition (InfiniteTalk and friends) and the closed one (Kling Speak, OmniHuman) - this is that model, called per second from inside your graph.
It's the pack's answer to the one job every "avatar" workflow needs and no diffusion model does well: a still image, moving mouth, matching words.
Why it costs what it costs
Pricing is per second of your audio, not per second of anything you set - $0.08/s at 480p and $0.15/s at 720p. So the number you should think about is the length of the voice track: a 30-second narration is about $2.40 at 480p and $4.50 at 720p. It's not a cheap node. It is also not a slow one for what it is; when VEED launched the API they claimed roughly 88 seconds of generation for a 10-second video and promised faster renders shortly after.
If that's too much, the honest alternatives are local: InfiniteTalk is the fast talking-head default in this ecosystem and has far more community coverage, and the shape of a local pipeline is Chatterbox for the voice, then an audio-driven avatar for the face. What you're buying here is not paying for any of that setup, plus results that hold up without babysitting LoRAs.
The inputs
image is the subject - required, and there's no prompt to correct it with, so the photo is the brief. Front-on, well-lit, mouth visible, no sunglasses; the model can only work with the face you give it.
audio is required and drives everything: the length of the output, the pacing of the mouth, and the bill. If you don't have a voice track already, you need a TTS step in front of this node, or one of the pack's other audio nodes - Fabric does not write the words.
resolution is 720p (default) or 480p. That's the only real setting. There's no seed, no guidance, no motion strength. If you want to change something about the output, change the input photo or the input audio; that's the design.
Outputs: video (VIDEO - wire it into Save Video or the pack's assembly nodes), video_path, and info, the JSON with the request id, cost estimate, saved files and fal's full answer. Files land in output/fal/veed_fabric-1.0/.
Alongside: max_cost_usd (default $20 cap - genuinely useful here, because a long voice track is an expensive accident), reuse_identical_run, extra_json, and max_concurrent (1 by default, meaning paid fal calls across the run go one at a time).
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install httpx
Manager → search arkennemasis also works. Then the key, in the .env next to run_nvidia_gpu.bat:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
Restart ComfyUI; the node shows up under arkennemasis/fal/Lip Sync/VEED.
Practical notes
- Long audio is a long bill, and there's no chunking built in. If you have a five-minute script, that's roughly $45 at 720p. Trim, split into shots, or budget accordingly - and set
max_cost_usdbelow your comfort limit while testing. reuse_identical_runis on by default, so tweaking something downstream and re-running gives you the file you already paid for rather than a new take. That's a feature until you forget it.- Everything waits its turn.
max_concurrent: 1is the pack default across every fal node, which keeps twenty-node canvases from firing twenty paid calls at once. Raise it deliberately. - Your inputs leave the machine. This node uploads the photo and the audio to fal's CDN before submitting. For a client's unreleased product shot, that's a decision, not a detail.
- Restart mid-render? The job continues on fal's side. Take the request id from
output/fal/_requests.jsonland pull the video down with fal Recover Result - free.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| audio | AUDIO | — | |
| resolution | COMBO | 720p | Resolution |
| 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 (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_path | STRING | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |