← sync. labsCONTENT HISTORY
WHAT CHANGED
Update to sync. labs
Snapshot Nov 3, 2026 · 18:14 UTC · version 2.0.4
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Save sync. labs and check future changes in Following.
Up to 10 plugins free · no card required.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Lip-sync an existing video to new speech with sync. labs, from a voiceover, a re-recorded take, a song, or a typed script that sync. labs voices, including AI-generated clips and YouTube, TikTok, Instagram or Facebook links. Use for \"lipsync this video to this audio\", \"make him say…\", \"match the lips to my voiceover\" or \"sync this clip to the song\". Not for still pictures (talking-photo), translating speech into another language (translate-and-dub) or changing a few words in the original voice (edit-dialogue).",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 205
}
],
"name": "lipsync-video",
"skill_md_contents": "---\nname: lipsync-video\ndescription: Lip-sync an existing video to new speech with sync. labs, from a voiceover, a re-recorded take, a song, or a typed script that sync. labs voices, including AI-generated clips and YouTube, TikTok, Instagram or Facebook links. Use for \"lipsync this video to this audio\", \"make him say…\", \"match the lips to my voiceover\" or \"sync this clip to the song\". Not for still pictures (talking-photo), translating speech into another language (translate-and-dub) or changing a few words in the original voice (edit-dialogue).\n---\n\n# Lipsync a video\n\nDelivers one MP4 of the video with lips matched to the new speech.\n\n## Inputs\n\n- **Video**: a video file in this conversation, a public video URL, a Sync video asset ID, or a YouTube, TikTok, Instagram or Facebook link.\n- **Speech**: an audio file, audio URL or Sync audio asset, or a script plus a voice.\n\nAsk only for what is missing. Never invent the words.\n\n## Tools\n\n| Step | Tool |\n| --- | --- |\n| Save files from the chat | `upload-media` |\n| Import a social link | `projects_create`, `assets_create` |\n| Pick a voice (script only) | `voices_get-voices` |\n| Quote | `generate_estimate-cost` |\n| Shorten long audio | `trim-audio`, `get-audio-trim` |\n| Create | `create-lipsync` |\n| Wait for the result | `generate_get-generation` |\n\n## Steps\n\n1. **Save files.** For each file in this conversation (the video, or the user's audio), call `upload-media` once with `mediaType` `video` or `audio`. Use the returned asset IDs from here on, including for every retry; a file re-sent later becomes a different asset.\n2. **Social links.** Create a project first with `projects_create`, using a new random UUID as `id`, a short `name` and `defaultWorkflow: \"lipsync\"`. Then call `assets_create` with the link, `type: \"VIDEO\"`, that `projectId` and `projectIntent: \"explicit\"`.\n - A 409 `import_in_progress` means the import is still running. Wait `retryAfterMs` (15 seconds if absent) and repeat the identical request until it returns an asset.\n - On `import_failed`, `import_not_enabled`, `import_unavailable` or a limit error, explain the reason, offer a file upload instead, and stop.\n3. **Voice.** For a script, call `voices_get-voices`, suggest two or three fitting voices unless one was named, and use the returned `id` as `voiceId`.\n4. **Length.** If the audio is noticeably longer or shorter than the video, ask how to handle it, and pass the answer as `options.sync_mode`:\n - `cut_off`: trim the longer one to match\n - `loop`: repeat the video from the start\n - `bounce`: play the video forward, then in reverse\n - `silence`: keep the video silent where the audio runs out\n - `remap`: speed up or slow down the video to match the audio\n\n If the audio is over a length limit, offer `trim-audio` to keep its first part, then quote again.\n5. **Speakers.** If more than one face is visible, ask which person should speak. Leave `options.active_speaker_detection` unset unless the user picks a speaker.\n6. **Quote.** Call `generate_estimate-cost` with the model (default `sync-3`) and the measured `audioDuration`, or the `script` for script input. For `cut_off` or `silence`, also pass `videoDuration` and `syncMode`. Label script quotes approximate and say speech synthesis is excluded.\n7. **Confirm.** Show the video, speech, voice, any sync mode and the estimate, then wait for approval, unless this exact request and cost were already approved.\n8. **Create.** Call `create-lipsync` once with:\n - the video as `videoAssetId` (saved or imported above) or `videoUrl`;\n - the speech as `audioAssetId`, `audioUrl`, or `script` with `voiceId`;\n - the model and any `options`;\n - a new `idempotencyKey`.\n\n For a project you just created in step 2, pass its `projectId` with `projectIntent: \"explicit\"`. Otherwise pass a new random UUID as `projectCreationKey` and a short `projectName`. On a lost response, retry once with the same keys and inputs.\n9. **Wait and deliver.** Poll `generate_get-generation` with the same `id` and `wait: true` until `COMPLETED` or `FAILED`. Give the exact `outputUrl`, unchanged, and offer one next step.\n\n## Rules\n\n- Use `sync-3` unless the user picks another model; take model names only from `models_get`.\n- Never reuse an older project unless the user explicitly asks for it.\n- Never start a second paid generation to check progress or to refresh a result.\n"
}SHA-256 of public snapshot: b8e0242371e5a923e07308f343af8d4e92a97c11a71db1fa02880d1516f64907