Nodes/comfyui-aimlapi-custom-nodes/AI/ML API Video + Audio (Fabric 1.0)
ComfyUI Node

AI/ML API Video + Audio (Fabric 1.0)

Make a performer lip-sync to any audio track (Fabric 1.0)

By konradbjk·Created 7 months ago·Updated 7 months ago· 1
AI/ML API Video + Audio (Fabric 1.0)
  • image
  • video_url
  • generation_id
api_key
promptA singer performing under colorful stage lights
audio_url
image_url
resolution1080p
poll_interval5
poll_timeout480

This is the fun one in the pack, and it's the most niche. Where most video tools generate sound with the video, this node drives the video from a sound you already have: feed it a reference image of a performer and an audio track, and Veed Fabric 1.0 returns a clip where the person's lips and expressions sync to that audio. Singing, talking head, music video - if the reference image has a visible mouth and the audio is a voice or a vocal, this is your "put words in this person's mouth" node.

Mechanically it's the same cloud pipeline as the pack's other video nodes: build a payload, POST to https://api.aimlapi.com/v2/video/generations, poll every poll_interval seconds until poll_timeout (default 480s) or the job dies, then emit video_url and generation_id. The payload is what's special - Fabric 1.0 takes an image_url (your performer) plus an audio_url (the driving track), and there's no model dropdown because there's only one model: veed/fabric-1.0.

The inputs that matter. There are two hard requirements and they're both easy to miss:

  • audio_url - REQUIRED. An HTTPS link or data URI for the audio track. No audio, no run: the node raises "audio_url is required for Fabric 1.0".
  • image or image_url - REQUIRED. The reference frame of the performer. The node throws if you give neither a tensor nor a URL.

Beyond those: prompt (optional storyboarding - how the scene should move), resolution (720p or 1080p only - Fabric doesn't do more), and the usual poll_interval/poll_timeout.

Here's the fiddly bit nobody warns you about: audio_url is a string, not an AUDIO tensor. You can't drag an audio file into this node. You either host the track somewhere it can fetch over HTTPS, or you base64 it into a data URI yourself. The same goes for image_url if you're bypassing the tensor input. The pack deliberately gives you URL inputs so you can skip the base64 encoding, but that means the audio has to live somewhere reachable - that's on you.

Installing it. Identical to the rest of the pack: ComfyUI Manager search comfyui-aimlapi-custom-nodes, or

cd ComfyUI/custom_nodes
git clone https://github.com/konradbjk/comfyui-aimlapi-custom-nodes

Restart, find "AI/ML API" in the node menu. Dependencies are just requests, pillow, and numpy - no models to download, everything runs remotely and per-job. Get your key at https://aimlapi.com/app/keys and drop it in the masked api_key widget.

What usually bites people. The two "it just won't run" moments are the missing audio_url and the missing reference image - both produce clear errors, but they're easy to forget because they're optional-looking. After that, temper expectations: Fabric is a hosted product model, so lip-sync quality varies with the audio and the reference - use a front-facing shot with the mouth visible, and don't expect cinematic physics in the body. And like every node in this pack, remember video jobs cost credits and block your ComfyUI queue while polling. If you're making a music video out of a full song, you're buying multiple paid generations - budget accordingly.

CategoryAI/ML API

Inputs (8)

NameTypeDefaultDescription
api_keySTRINGYour AI/ML API key from https://aimlapi.com/app/keys
promptSTRINGA singer performing under colorful stage lightsOptional storyboarding prompt
audio_urlSTRINGHTTPS link or data URI for the driving audio track
imageoptIMAGEReference frame for the performer
image_urloptSTRINGFallback URL/data URI if no image tensor is provided
resolutionoptCOMBO1080pFabric currently supports 720p or 1080p output
poll_intervaloptFLOAT51–30Seconds between status checks
poll_timeoutoptINT48060–1800Maximum seconds to wait before timing out

Outputs (2)

NameTypeDescription
video_urlSTRING
generation_idSTRING