react-1
Re-animate a face to a new performance — the deepfake-adjacent node
- video
react-1, from the company Sync, does something you can't get from an open-weights video model on a consumer GPU: it takes an existing video of a person and re-animates their facial performance to match a different audio track. New dialogue, new emotional delivery, same face, same camera move. That's the whole node. Two required inputs - video and audio, each a UUID or URL - and a VIDEO comes back.
Let's be clear about what this is: it's performance transfer, the thing people call "dubbing that looks native" and the thing that also makes deepfakes trivially easy. It's a hosted API model, and Runware's content safety is the only thing standing between you and abuse of someone's likeness. Use it on your own footage or with permission; the tooling gives you rope.
What you set
video/audio- required, as UUIDs or URLs (Runware's upload nodes will stage these for you). The video is the appearance and motion source; the audio is the new performance you're driving it with.providerSettings.sync.editRegion- what moves:face,lips, orhead.faceis the broad default,headadds head motion for bigger deliveries. This is your first quality lever when the output looks "pasted on."providerSettings.sync.emotionPrompt- happy, sad, angry, disgusted, surprised, neutral, or default. You're not just matching the audio; you can push the emotional register it's read with. "Angry" on the same line can sell a scene that flat lip-sync would kill.providerSettings.sync.temperature- expressiveness of the facial movement, 0–1, default 0.5. Low is stiff and clinical; high is theatrical. Where most people get burned: they leave this at the default and blame the model for dead-eyed output when cranking it to 0.7–0.8 fixes the "uncanny" feel.providerSettings.sync.syncMode- what to do when audio and video lengths don't match:bounce(default, ping-pongs),loop,cut_off,silence, orremap.remapis the one that stretches or squeezes the video to fit the audio; the others fill or trim.providerSettings.sync.activeSpeakerDetection.autoDetect- automatically find the talking person in a multi-person shot. Turn it on when there's more than one face.providerSettings.sync.occlusionDetectionEnabled- handles faces that are briefly covered (hand over mouth, passing object). On for talking-head footage where people gesture; it buys robustness at some latency.
numberResults (up to 4) gives you takes, outputFormat is MP4/WEBM/MOV, and safety.mode (none/fast/full) controls the content gate.
How it works
The node sends sync:react-1@1 as a videoInference task through the Runware SDK - your audio and video are referenced by their hosted URLs, the API does the performance transfer, and the finished clip comes back as a native VIDEO socket. It runs entirely server-side; nothing is computed on your machine, and the title bar prints the cost and NSFW verdict when it's done.
Install and gotchas
cd ComfyUI/custom_nodes
git clone https://github.com/Runware/ComfyUI-Runware
pip install -r ComfyUI-Runware/requirements.txt
Restart; API key from the Runware dashboard into Settings (or RUNWARE_API_KEY). It's paid, per-run, minimum top-up.
Real-world pain points: it's not a fast node - performance transfer over the API takes a while, so batch sensibly. The temperature default really is the difference between watchable and uncanny, so touch it before you touch anything else. And the input format trips people up: both inputs are strings (UUID or URL), not file paths or IMAGE/AUDIO sockets, so stage media through Runware's upload nodes first and paste the reference in.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| video | STRING | Video input (UUID or URL). | |
| audio | STRING | Audio input (UUID or URL). | |
| numberResultsopt | INT | 11–4 | Number of results to generate. Each result uses a different seed, producing variations of the same parameters. |
| providerSettings.sync.activeSpeakerDetection.autoDetectopt | BOOLEAN | false | Automatically detect and target the active speaker. |
| providerSettings.sync.editRegionopt | COMBO | face | Region of the subject to animate during re-animation. |
| providerSettings.sync.emotionPromptopt | COMBO | (default) | Emotional tone for performance re-animation. |
| providerSettings.sync.occlusionDetectionEnabledopt | BOOLEAN | false | Enable occlusion handling for obstructed faces. |
| safetyopt | BOOLEAN | false | Enable to set safety. Off uses the model's default. |
| safety.checkContentopt | BOOLEAN | false | Enable or disable content safety checking. |
| safety.modeopt | COMBO | fast | Safety checking mode for video generation. |
| providerSettings.sync.syncModeopt | COMBO | bounce | Synchronization strategy when audio and video durations don't match. |
| providerSettings.sync.temperatureopt | FLOAT | 0.500–1 | Expressiveness of lip sync and facial movements. |
| ttlopt | BOOLEAN | false | Enable to set ttl. Off uses the model's default. |
| ttl_valueopt | INT | 60 | Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`. |
| outputFormatopt | COMBO | MP4 | File format for the generated video. |
| outputQualityopt | INT | 9520–99 | Compression quality of the output. Higher values preserve quality but increase file size. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |