Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Lip-sync a face to a specific audio track on RunComfy via the `runcomfy` CLI. Routes across ByteDance OmniHuman (audio-driven full-body avatar from a portrait + audio), Sync Labs sync v2 / Pro (state-of-the-art mouth sync onto a video), Kling lipsync (audio-to- video and text-to-video with synced speech), and Creatify lipsync. The skill picks the right endpoint for the user's actual intent — portrait still + audio (avatar-style), source video + audio (mouth- swap on existing footage), or generat
.claude/skills/aiskillstore-lipsync/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 166% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 111% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 355% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 172% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 491% | 0% |
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
bash# 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=<token> # 3. Lipsync runcomfy run <vendor>/<model> \ --input '{"video_url": "...", "audio_url": "..."}' \ --output-dir ./out
CLI deep dive: runcomfy-cli skill.
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.
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.
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.
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.
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.
Model: sync/sync/lipsync/v2/pro (or sync/sync/lipsync/v2) Catalog: sync v2 Pro · sync v2
bashruncomfy 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
Model: bytedance/omnihuman/api Catalog: omnihuman
bashruncomfy run bytedance/omnihuman/api \ --input '{ "image_url": "https://your-cdn.example/portrait.jpg", "audio_url": "https://your-cdn.example/voiceover.mp3" }' \ --output-dir ./out
ai-avatar-video skill for the full avatar treatment.Model: kling/lipsync/audio-to-video (existing video + audio) or kling/lipsync/text-to-video (script-only) Catalog: Kling lipsync a2v · Kling lipsync t2v
bashruncomfy 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.
community/wan-2-2-animate/video-to-video) — see ai-avatar-video.kling collection — including Kling lipsync variants| 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.
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.
npm i -g @runcomfy/cli or npx -y @runcomfy/cli. Agents must not pipe an arbitrary remote install script into a shell on the user's behalf.runcomfy login writes the API token to ~/.config/runcomfy/token.json with mode 0600. Set RUNCOMFY_TOKEN env var in CI / containers.--input. The CLI does not shell-expand prompt content. No shell-injection surface.model-api.runcomfy.net and *.runcomfy.net / *.runcomfy.com. No telemetry.Bash(runcomfy *) only.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| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-06 | fail→pass | 9,226 | 2,782 | -70% | 1 | 1 | 0% | 1,496 | 3,977 | +166% | 0 | 0 | — |
case-07 | fail→pass | 11,931 | 4,518 | -62% | 1 | 1 | 0% | 2,080 | 4,387 | +111% | 0 | 0 | — |
case-16 | pass→pass | 13,522 | 7,187 | -47% | 1 | 1 | 0% | 2,285 | 4,906 | +115% | 0 | 0 | — |
case-01 | fail→pass | 5,004 | 4,501 | -10% | 1 | 1 | 0% | 972 | 4,427 | +355% | 0 | 0 | — |
case-02 | fail→pass | 8,477 | 3,375 | -60% | 1 | 1 | 0% | 1,554 | 4,230 | +172% | 0 | 0 | — |
case-03 | fail→pass | 4,671 | 7,152 | +53% | 1 | 1 | 0% | 805 | 4,760 | +491% | 0 | 0 | — |
case-04 | fail→pass | 23,604 | 4,635 | -80% | 1 | 1 | 0% | 1,772 | 4,266 | +141% | 0 | 0 | — |
case-05 | fail→pass | 5,527 | 3,334 | -40% | 1 | 1 | 0% | 1,039 | 4,209 | +305% | 0 | 0 | — |
case-08 | pass→pass | 11,132 | 5,329 | -52% | 1 | 1 | 0% | 1,847 | 4,600 | +149% | 0 | 0 | — |
case-09 | pass→pass | 10,430 | 5,915 | -43% | 1 | 1 | 0% | 1,663 | 4,633 | +179% | 0 | 0 | — |
case-10 | fail→pass | 7,613 | 1,912 | -75% | 1 | 1 | 0% | 1,391 | 3,745 | +169% | 0 | 0 | — |
case-11 | fail→pass | 5,141 | 1,209 | -76% | 1 | 1 | 0% | 809 | 3,680 | +355% | 0 | 0 | — |
case-17 | pass→pass | 7,395 | 2,855 | -61% | 1 | 1 | 0% | 1,366 | 4,094 | +200% | 0 | 0 | — |
case-12 | fail→pass | 9,779 | 2,971 | -70% | 1 | 1 | 0% | 1,696 | 4,165 | +146% | 0 | 0 | — |
case-13 | pass→pass | 9,725 | 3,534 | -64% | 1 | 1 | 0% | 1,517 | 4,157 | +174% | 0 | 0 | — |
case-14 | fail→pass | 11,861 | 4,686 | -60% | 1 | 1 | 0% | 2,119 | 4,460 | +110% | 0 | 0 | — |
case-15 | pass→pass | 15,963 | 6,672 | -58% | 1 | 1 | 0% | 1,230 | 4,691 | +281% | 0 | 0 | — |
case-18 | fail→pass | 15,153 | 5,417 | -64% | 1 | 1 | 0% | 2,859 | 4,627 | +62% | 0 | 0 | — |
case-19 | fail→pass | 11,919 | 4,036 | -66% | 1 | 1 | 0% | 2,066 | 4,218 | +104% | 0 | 0 | — |
case-20 | pass→pass | 13,194 | 9,044 | -31% | 1 | 1 | 0% | 2,327 | 5,140 | +121% | 0 | 0 | — |
case-21 | pass→pass | 11,128 | 5,124 | -54% | 1 | 1 | 0% | 1,943 | 4,533 | +133% | 0 | 0 | — |
case-22 | fail→pass | 10,424 | 8,928 | -14% | 1 | 1 | 0% | 1,791 | 5,162 | +188% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +64 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.