{"id":84688,"plugin_id":"plugin_asdk_app_6a398355fbc08191a232e7eeeacb73d5","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-11-06T18:14:58.754Z","digest":"fa1397eada2e12cf9ab9d315df644f5e5bddf43e324edf9cdd60b32de95d1915","against":null,"payload":{"description":"Lip-sync one existing video of a real person to new speech with sync. labs (sync.so), so their mouth matches a new voiceover, re-recorded take, song, or a typed script that sync. voices. Accepts local files, URLs, sync. assets and YouTube, TikTok, Instagram or Facebook links. Use whenever the user wants to lipsync, lip sync or sync lips, match mouth movement to audio, \"make him say…\", replace the audio in a talking-head clip, or sync a clip to a song, even if they don't say \"lipsync\". Not for AI-generated characters or clips from Veo, Kling, Sora and similar tools (ai-video-to-talking), still pictures (talking-photo), translation (translate-and-dub), changing a few words in the original voice (edit-dialogue), or many videos at once (batch-lipsync).","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":194},{"relative_path":"references/api.md","size_in_bytes":4169},{"relative_path":"references/connect.md","size_in_bytes":3346},{"relative_path":"references/media-input.md","size_in_bytes":3853}],"name":"lipsync","skill_md_contents":"---\nname: lipsync\ndescription: Lip-sync one existing video of a real person to new speech with sync. labs (sync.so), so their mouth matches a new voiceover, re-recorded take, song, or a typed script that sync. voices. Accepts local files, URLs, sync. assets and YouTube, TikTok, Instagram or Facebook links. Use whenever the user wants to lipsync, lip sync or sync lips, match mouth movement to audio, \"make him say…\", replace the audio in a talking-head clip, or sync a clip to a song, even if they don't say \"lipsync\". Not for AI-generated characters or clips from Veo, Kling, Sora and similar tools (ai-video-to-talking), still pictures (talking-photo), translation (translate-and-dub), changing a few words in the original voice (edit-dialogue), or many videos at once (batch-lipsync).\nlicense: MIT\ncompatibility: Needs the sync. MCP server or a SYNC_API_KEY. See references/connect.md.\n---\n\n# Lipsync a video\n\nDelivers one MP4 of the video with the lips matched to the new speech.\n\nIf no sync. tools are available, follow [references/connect.md](references/connect.md) first. Without the MCP tools, use the REST requests in [references/api.md](references/api.md) for the same steps.\n\n## Inputs\n\n- **Video:** a local file, a public URL, a sync. video asset ID, or a social link.\n- **Speech:** an audio file, URL or asset, or a script plus a voice.\n\nAsk only for what's missing. Never invent the words.\n\n## Tools\n\n| Step | Tool |\n| --- | --- |\n| Save files | `assets_upload` (chat apps), or `assets_create-upload-url` then `assets_create` (local files) |\n| Import a social link | `projects_create`, `assets_create` |\n| Pick a voice (script only) | `voices_list` |\n| Quote | `generations_estimate-cost` |\n| Shorten long audio | `audio-trims_create`, `audio-trims_get` |\n| Create | `lipsync_create` |\n| Wait | `generations_get` |\n\n## Steps\n\n1. **Save the inputs.** Follow [references/media-input.md](references/media-input.md). Save each file once, and reuse the returned asset ID for every later step and retry. Check the input-quality list there and mention problems now, such as several faces or music under the voice.\n2. **Voice.** For a script, call `voices_list`. Unless the user named a voice, suggest two or three that fit, and use the chosen voice's `id` as `voiceId`.\n3. **Length.** When the speech and the video differ noticeably in length, ask how to handle it and pass the answer as `options.sync_mode`:\n   - `bounce` (default): play the video forward, then in reverse, to cover longer speech\n   - `loop`: repeat the video from the start\n   - `cut_off`: stop the speech when the video ends\n   - `silence`: keep the video going silently after the speech ends\n   - `remap`: speed the video up or slow it down to fit the speech exactly\n\n   If the audio is over the plan's length limit, offer `audio-trims_create` to keep its first part.\n4. **Speaker.** If more than one face is visible, ask who should speak. Leave `options.active_speaker_detection` unset unless the user picks someone.\n5. **Quote.** Call `generations_estimate-cost` with the model (`sync-3` unless the user chose another) and the speech's `audioDuration`, or the `script`. For `cut_off` or `silence`, also pass `videoDuration` and `syncMode`. This prices the lipsync only. For a script, say the length is approximate and that speech synthesis is billed separately.\n6. **Confirm.** Show the video, the speech, the voice, any sync mode and the estimate, and wait for approval. Skip the wait only if the user already approved this exact request and cost.\n7. **Create.** Call `lipsync_create` once with the video (`videoAssetId` or `videoUrl`), the speech (`audioAssetId`, `audioUrl`, or `script` with `voiceId`), the model, any `options`, a new `idempotencyKey`, and either the `projectId` of a project you created in step 1 (with `projectIntent: \"explicit\"`) or a new random UUID as `projectCreationKey` plus a short `projectName`. Save the keys before calling. If the response is lost or times out, the job may still have started: retry once with the same keys and inputs, which returns the original generation if it exists.\n8. **Wait and deliver.** Call `generations_get` with the returned `id` and `wait: true`, repeating until the status is `COMPLETED`, `FAILED` or `REJECTED`. Most jobs take a few minutes. Give the exact `outputMediaUrl` unchanged. In a coding agent with a shell, offer to download it next to the source, for example `curl -L -o clip_lipsync.mp4 \"<url>\"`.\n\n## Rules\n\n- Use `sync-3` unless the user picks another model, and take model names only from `models_list`.\n- Never start a second paid generation to check progress or to refresh a link.\n- Start a new project for new work. Reuse an existing project only when the user asks for it.\n- On a plan, credit or length error, quote the message and stop. On a rejected input, explain which input and why.\n- Assume the user has the rights to their own media, and don't ask about consent on routine requests. Decline only when the request is to make a real, identifiable person, such as a politician or celebrity, appear to say something they didn't say, in order to deceive.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}