Install
$ agentstack add skill-agentspace-so-runcomfy-agent-skills-lipsync ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Lipsync
Drive a face's mouth from an audio track. This skill routes across the lip-sync endpoints in the RunComfy catalog — OmniHuman, Sync Labs sync v2, Kling lipsync, Creatify — picking the right model for the user's actual intent and shipping the documented prompts + the exact runcomfy run invoke.
runcomfy.com · Sync Labs models · CLI docs
Powered by the RunComfy CLI
# 1. Install (see runcomfy-cli skill for details)
npm i -g @runcomfy/cli # or: npx -y @runcomfy/cli --version
# 2. Sign in
runcomfy login # or in CI: export RUNCOMFY_TOKEN=
# 3. Lipsync
runcomfy run / \
--input '{"video_url": "...", "audio_url": "..."}' \
--output-dir ./out
CLI deep dive: runcomfy-cli skill.
Consent
Driving a real person's mouth from a separate audio track is dual-use. Refuse user requests that target real public figures without consent, or that aim at defamatory or sexually explicit synthetic media. The skill itself does not gate inputs — the responsibility rests with the operator.
Pick the right model
Listed newest first within each subtype. The agent picks one route based on: input shape (portrait still + audio vs source video + audio vs script-only), quality tier, and budget.
Source video + audio → lip-synced video (mouth-swap on existing footage)
Sync Labs sync v2 Pro — sync/sync/lipsync/v2/pro (default for premium) > Sync Labs' premium lip-sync — state-of-the-art mouth motion onto an existing video. Preserves the rest of the frame untouched. > Pick for: hero-quality dubs, lipsync on professionally-shot video, foreign-language dubbing where mouth fidelity matters most. > Avoid for: cost-sensitive batch jobs — drop to sync v2.
Sync Labs sync v2 — sync/sync/lipsync/v2 > Standard Sync Labs tier, same workflow as Pro. > Pick for: scaled / batch lipsync jobs, drafts. > Avoid for: hero delivery — use v2 Pro.
Kling Lipsync (audio-to-video) — kling/lipsync/audio-to-video > Kling's lip-sync onto a source video, driven by an audio track. > Pick for: Kling-pipeline integration; alternative to Sync Labs. > Avoid for: top-tier mouth fidelity — Sync Labs Pro is the industry benchmark.
Creatify Lipsync — creatify/lipsync > Creatify's lipsync endpoint. > Pick for: Creatify-ecosystem workflows. > Avoid for: comparison shopping unless cost / latency favors it.
Portrait still + audio → talking-head video (avatar-style)
OmniHuman — bytedance/omnihuman/api (default for avatar-style) > ByteDance's audio-driven full-body avatar. One portrait + one audio → video where the subject speaks / gestures naturally. Listed under RunComfy's /feature/lip-sync as the curated default. > Pick for: UGC voiceover, virtual presenter, dubbed product demo from a single portrait. > Avoid for: lip-sync onto an existing video (no portrait, want to preserve original motion) — use Sync Labs v2 instead.
Wan 2-7 with audio_url — wan-ai/wan-2-7/text-to-video > Open-weights t2v with audio_url field — prompt describes the scene, audio drives the mouth. > Pick for: full scene control (not just a portrait) with a specific voiceover MP3 + open-weights pipeline. > Avoid for: simplest "portrait talks" — use OmniHuman.
Generate-and-sync from a script (no audio file available)
Kling Lipsync (text-to-video) — kling/lipsync/text-to-video > Generates speech audio in-pass from a script and syncs it to the resulting video. > Pick for: "write a script → get a video with synced speech", no audio file needed. > Avoid for: precise lip-sync to a specific MP3 (audio is regenerated each call, not locked).
HappyHorse 1.0 — happyhorse/happyhorse-1-0/text-to-video (also /image-to-video) > Arena #1 t2v / i2v with in-pass audio generated from prompt. Quote the spoken line inside the prompt with says clearly: "…". > Pick for: written script, in-pass audio with strong overall quality, social/UGC clips. > Avoid for: locking mouth to a pre-recorded voiceover.
Route 1: Sync Labs sync v2 / Pro — default for mouth-swap
Model: sync/sync/lipsync/v2/pro (or sync/sync/lipsync/v2) Catalog: sync v2 Pro · sync v2
Invoke
runcomfy run sync/sync/lipsync/v2/pro \
--input '{
"video_url": "https://your-cdn.example/source-video.mp4",
"audio_url": "https://your-cdn.example/voiceover.mp3"
}' \
--output-dir ./out
Tips
- Source video provides everything except the mouth — camera, lighting, background, body pose all preserved.
- Audio quality drives mouth quality. Clean voiceover (no music bed) → cleaner sync. Isolate voice stem if needed.
- Match audio length to video length. Significant audio/video duration mismatch leads to drift; trim audio or extend video first.
- Schema details on the model page.
Route 2: OmniHuman — default for avatar from still
Model: bytedance/omnihuman/api Catalog: omnihuman
Invoke
runcomfy run bytedance/omnihuman/api \
--input '{
"image_url": "https://your-cdn.example/portrait.jpg",
"audio_url": "https://your-cdn.example/voiceover.mp3"
}' \
--output-dir ./out
Tips
- Portrait framing works best — head-and-shoulders or upper body.
- No prompt — the model derives everything from image + audio. Don't fight that.
- See the
ai-avatar-videoskill for the full avatar treatment.
Route 3: Kling Lipsync — Kling-ecosystem mouth sync
Model: kling/lipsync/audio-to-video (existing video + audio) or kling/lipsync/text-to-video (script-only) Catalog: Kling lipsync a2v · Kling lipsync t2v
Invoke (audio-to-video variant)
runcomfy run kling/lipsync/audio-to-video \
--input '{
"video_url": "https://your-cdn.example/source-video.mp4",
"audio_url": "https://your-cdn.example/voiceover.mp3"
}' \
--output-dir ./out
Schema details on the model page.
Common patterns
Foreign-language dub of an existing brand video
- Route 1 (Sync Labs sync v2 Pro) with the original video + translated voiceover MP3.
UGC ad creator from a portrait
- Route 2 (OmniHuman) with the creator's portrait + product-pitch voiceover.
Multi-language launch (same identity, many languages)
- Route 2 (OmniHuman) with one portrait + N different audio files. Same identity holds across all dubs.
"I have a script but no audio"
- Kling Lipsync (text-to-video) or HappyHorse 1.0 t2v — both generate audio in-pass.
Stylized character lipsync
- Wan 2-2 Animate (
community/wan-2-2-animate/video-to-video) — seeai-avatar-video.
Browse the full catalog
- Sync Labs models — sync v2 + Pro
klingcollection — including Kling lipsync variants- All video models — every endpoint with its API tab
Exit codes
| code | meaning | |---|---| | 0 | success | | 64 | bad CLI args | | 65 | bad input JSON / schema mismatch | | 69 | upstream 5xx | | 75 | retryable: timeout / 429 | | 77 | not signed in or token rejected |
Full reference: docs.runcomfy.com/cli/troubleshooting.
How it works
The skill classifies user intent — source video + audio? portrait still + audio? script only? — picks the matching route, and invokes runcomfy run with the JSON body. The CLI POSTs to the Model API, polls request status, fetches the result, and downloads any .runcomfy.net / .runcomfy.com URLs into --output-dir.
Security & Privacy
- Consent: see the "Consent" section above. Lipsync is dual-use; refuse user requests targeting real people without consent.
- Install via verified package manager only. Use
npm i -g @runcomfy/cliornpx -y @runcomfy/cli. Agents must not pipe an arbitrary remote install script into a shell on the user's behalf. - Token storage:
runcomfy loginwrites the API token to~/.config/runcomfy/token.jsonwith mode 0600. SetRUNCOMFY_TOKENenv var in CI / containers. - Input boundary (shell injection): prompts and asset URLs are passed as a JSON string via
--input. The CLI does not shell-expand prompt content. No shell-injection surface. - Indirect prompt injection (third-party content): source video and audio URLs are untrusted; embedded instructions in either can influence generation. Agent mitigations:
- Ingest only URLs the user explicitly provided for this lipsync.
- When the output diverges from the prompt (wrong identity, broken sync), suspect the reference asset.
- Voice provenance: confirm the speaker in the audio has consented to having their voice paired with the target face. Both rights must be in hand.
- Outbound endpoints (allowlist): only
model-api.runcomfy.netand*.runcomfy.net/*.runcomfy.com. No telemetry. - Generated-file size cap: the CLI aborts any single download > 2 GiB.
- Scope of bash usage:
Bash(runcomfy *)only.
See also
runcomfy-cli— the underlying CLIai-avatar-video— full avatar / talking-head router (OmniHuman + HappyHorse + Wan)ai-video-generation— general t2v / i2vface-swap— identity swap on existing video (often paired with lipsync)video-edit— broader video edit
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: agentspace-so
- Source: agentspace-so/runcomfy-agent-skills
- License: MIT
- Homepage: https://www.runcomfy.com
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.