Update to sync. labs
Snapshot Nov 6, 2026 · 18:14 UTC · version 2.1.1
Collection source: downloaded plugin package.
Payment or plan references changed
Full description — Now says: image talk with sync. labs (sync.so). Turns a photo, portrait, headshot, or an illustrated or AI-generated character with a human-like face into a lip-synced...
Observed in published text. Live prices and checkout terms have not been verified by this change.
Up to 3 plugins free · no card required.
All fields and original values.
Full description
Nov 3, 2026 · 18:14 UTC
photo, portrait, mascot, illustration or AI character talk with sync. labs, as a lip-synced video from a typed script (sync. labs voices it) or from the user's own audio. Use for "make this photo talk", "make this picture say…", a talkin...
Nov 6, 2026 · 18:14 UTC
image talk with sync. labs (sync.so). Turns a photo, portrait, headshot, or an illustrated or AI-generated character with a human-like face into a lip-synced video from a typed script (sync. voices it) or the user's own audio. Use for "m...
Skill instructions
Nov 3, 2026 · 18:14 UTC
photo, portrait, mascot, illustration or AI character talk with sync. labs, as a lip-synced video from a typed script (sync. labs voices it) or from the user's own audio. Use for "make this photo talk", "make this picture say…", a talkin...
Nov 6, 2026 · 18:14 UTC
image talk with sync. labs (sync.so). Turns a photo, portrait, headshot, or an illustrated or AI-generated character with a human-like face into a lip-synced video from a typed script (sync. voices it) or the user's own audio. Use for "m...
Supporting files
Nov 3, 2026 · 18:14 UTC
[{"relative_path":"agents/openai.yaml","size_in_bytes":213}]
Nov 6, 2026 · 18:14 UTC
[{"relative_path":"agents/openai.yaml","size_in_bytes":192},{"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_b...
Compare saved observations
Download comparison JSONSKILL.md text changes
− removed · + added
--- before +++ after @@ -1,48 +1,50 @@ --- name: talking-photo -description: Make a still photo, portrait, mascot, illustration or AI character talk with sync. labs, as a lip-synced video from a typed script (sync. labs voices it) or from the user's own audio. Use for "make this photo talk", "make this picture say…", a talking avatar or character, or animating a portrait with speech, including when the user has no picture yet and wants one created first. Not for moving video footage (lipsync-video), translation (translate-and-dub) or changing a few words in an existing video (edit-dialogue). +description: Make a still image talk with sync. labs (sync.so). Turns a photo, portrait, headshot, or an illustrated or AI-generated character with a human-like face into a lip-synced video from a typed script (sync. voices it) or the user's own audio. Use for "make this photo talk", "make this picture say…", talking avatars, talking headshots, animating a portrait or character with speech, or image-to-video with dialogue, including when the user has no picture yet and wants one made first. Not for moving video footage (lipsync or ai-video-to-talking), translation (translate-and-dub) or changing words in an existing video (edit-dialogue). +license: MIT +compatibility: Needs the sync. MCP server or a SYNC_API_KEY. See references/connect.md. --- # Make a photo talk -Delivers one MP4 of the picture speaking the user's words. +Delivers one MP4 of the picture speaking the user's words. The video is as long as the speech. + +If 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. ## Inputs -- **Picture**: an image file in this conversation (uploaded, or generated here), a public image URL, or a Sync image asset ID. If the user has no picture, offer to create one with image generation first: one clear face, looking at the camera, mouth closed, head and shoulders, plain background. -- **Speech**: either a script, which needs a voice, or an audio file, audio URL or Sync audio asset. +- **Picture:** a local image, an image attached in chat, a public URL, or a sync. image asset ID. If the user has no picture and you can generate images, offer to make one: one clear face, looking at the camera, mouth closed, head and shoulders, plain background. Otherwise ask for one. +- **Speech:** a script, which needs a voice, or an audio file, URL or asset. -Ask only for what is missing. Never invent the words the character says. If the user asks you to write them, draft a short script and get approval before quoting. +Ask only for what's missing. Never invent the words. If the user asks you to write them, draft a short script and get approval before quoting. ## Tools | Step | Tool | | --- | --- | -| Save files from the chat | `upload-media` | -| Pick a voice (script only) | `voices_get-voices` | -| Quote | `generate_estimate-cost` | -| Create | `create-lipsync` | -| Wait for the result | `generate_get-generation` | +| Save files | `assets_upload` (chat apps), or `assets_create-upload-url` then `assets_create` (local files) | +| Pick a voice (script only) | `voices_list` | +| Quote | `generations_estimate-cost` | +| Create | `lipsync_create` | +| Wait | `generations_get` | ## Steps -1. **Save files.** For each file in this conversation (the picture, or the user's audio), call `upload-media` once with `mediaType` `image` or `audio`. Use the returned asset IDs from here on, including for every retry; a file re-sent later becomes a different asset. Public URLs and Sync asset IDs need no upload. -2. **Voice.** For a script, call `voices_get-voices`. Unless the user named a voice, suggest two or three that fit the character, each with a few words on its style. Use the chosen voice's returned `id` as `voiceId`; never invent an ID. -3. **Quote.** Call `generate_estimate-cost` with `model: "sync-3"`, `visualType: "image"`, and either `script` or the measured `audioDuration`. Say that script quotes are approximate and exclude speech synthesis. -4. **Confirm.** Show the picture, the script or audio, the voice and the estimate, then wait for approval. Skip this only when the user already approved this exact request and cost. -5. **Create.** Call `create-lipsync` once with: - - the picture as `imageAssetId` (saved in step 1) or `imageUrl`; - - `script` with `voiceId`, or the audio as `audioAssetId` or `audioUrl`; - - `model: "sync-3"`; - - a new `idempotencyKey` and a new random UUID as `projectCreationKey`; - - a short `projectName` such as "Talking fox". - - Do not pass `projectId` for new work. If the response is lost, retry once with the same keys and inputs; never generate new keys for a retry. -6. **Wait.** Call `generate_get-generation` with the returned `id` and `wait: true`. If it is still pending, call it again with the same `id`. Never create a second generation to check progress. -7. **Deliver.** When the status is `COMPLETED`, give the exact `outputUrl`, unchanged. Offer one next step, such as another line, another voice, or dubbing it into another language. +1. **Save the inputs.** Follow [references/media-input.md](references/media-input.md) for the picture and any audio. Public URLs and asset IDs need no upload. Before spending money, check that the image shows exactly one clear, reasonably large human or human-like face. Animals and non-humanoid characters aren't supported. +2. **Voice.** For a script, call `voices_list`. Unless the user named a voice, suggest two or three that fit the character, each with a few words on its style. Use the chosen voice's `id` as `voiceId`; never invent one. +3. **Quote.** Call `generations_estimate-cost` with `model: "sync-3"`, `visualType: "image"`, and either the `script` or the audio's `audioDuration`. This prices the lipsync only. For a script, say the length is approximate and that speech synthesis is billed separately. +4. **Confirm.** Show the picture, the script or audio, the voice and the estimate, and wait for approval. Skip the wait only if the user already approved this exact request and cost. +5. **Create.** Call `lipsync_create` once with the picture (`imageAssetId` or `imageUrl`), the speech (`script` with `voiceId`, or `audioAssetId` or `audioUrl`), `model: "sync-3"`, a new `idempotencyKey`, a new random UUID as `projectCreationKey`, and a short `projectName` such as "Talking portrait". Images work only with sync-3, and `sync_mode` doesn't apply to them. Save the keys before calling. If the response is lost or times out, retry once with the same keys and inputs, which returns the original generation if it exists. +6. **Wait and deliver.** Call `generations_get` with the returned `id` and `wait: true`, repeating until the status is final. Give the exact `outputMediaUrl` unchanged, and offer one next step: another line, another voice, or dubbing it into another language. ## When something fails -- **The picture is rejected** (no clear face, several faces, too small): explain the reason and suggest a clearer head-and-shoulders picture. -- **Out of credits or over a plan limit**: explain the returned message plainly. Don't promote plans or pricing. -- **Any other error**: quote the returned message, say no video was created, and stop. Don't retry with different inputs unless the user asks. +- **The picture is rejected** (no clear face, several faces, too small): explain why and suggest a clearer head-and-shoulders picture. +- **Out of credits or over a plan limit:** quote the message plainly, without promoting plans. +- **Any other rejection:** quote the message, say no video was created, and stop. Don't retry with different inputs unless the user asks. +- **A timeout or unclear outcome:** the job may still have started. Say so, keep the keys, and retry once with the identical request instead of reporting a failure. + +## Rules + +- 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. +- Never start a second paid generation to check progress.
Full technical diff · 3 changed fields
changed /description
"Make a still photo, portrait, mascot, illustration or AI character talk with sync. labs, as a lip-synced video from a typed script (sync. labs voices it) or from the user's own audio. Use for \"make this photo talk\", \"make this picture say…\", a talking avatar or character, or animating a portrait with speech, including when the user has no picture yet and wants one created first. Not for moving video footage (lipsync-video), translation (translate-and-dub) or changing a few words in an existing video (edit-dialogue)."
"Make a still image talk with sync. labs (sync.so). Turns a photo, portrait, headshot, or an illustrated or AI-generated character with a human-like face into a lip-synced video from a typed script (sync. voices it) or the user's own audio. Use for \"make this photo talk\", \"make this picture say…\", talking avatars, talking headshots, animating a portrait or character with speech, or image-to-video with dialogue, including when the user has no picture yet and wants one made first. Not for moving video footage (lipsync or ai-video-to-talking), translation (translate-and-dub) or changing words in an existing video (edit-dialogue)."
changed /included_files
[
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 213
}
][
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 192
},
{
"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
}
]changed /skill_md_contents
"---\nname: talking-photo\ndescription: Make a still photo, portrait, mascot, illustration or AI character talk with sync. labs, as a lip-synced video from a typed script (sync. labs voices it) or from the user's own audio. Use for \"make this photo talk\", \"make this picture say…\", a talking avatar or character, or animating a portrait with speech, including when the user has no picture yet and wants one created first. Not for moving video footage (lipsync-video), translation (translate-and-dub) or changing a few words in an existing video (edit-dialogue).\n---\n\n# Make a photo talk\n\nDelivers one MP4 of the picture speaking the user's words.\n\n## Inputs\n\n- **Picture**: an image file in this conversation (uploaded, or generated here), a public image URL, or a Sync image asset ID. If the user has no picture, offer to create one with image generation first: one clear face, looking at the camera, mouth closed, head and shoulders, plain background.\n- **Speech**: either a script, which needs a voice, or an audio file, audio URL or Sync audio asset.\n\nAsk only for what is missing. Never invent the words the character says. If the user asks you to write them, draft a short script and get approval before quoting.\n\n## Tools\n\n| Step | Tool |\n| --- | --- |\n| Save files from the chat | `upload-media` |\n| Pick a voice (script only) | `voices_get-voices` |\n| Quote | `generate_estimate-cost` |\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 picture, or the user's audio), call `upload-media` once with `mediaType` `image` or `audio`. Use the returned asset IDs from here on, including for every retry; a file re-sent later becomes a different asset. Public URLs and Sync asset IDs need no upload.\n2. **Voice.** For a script, call `voices_get-voices`. Unless the user named a voice, suggest two or three that fit the character, each with a few words on its style. Use the chosen voice's returned `id` as `voiceId`; never invent an ID.\n3. **Quote.** Call `generate_estimate-cost` with `model: \"sync-3\"`, `visualType: \"image\"`, and either `script` or the measured `audioDuration`. Say that script quotes are approximate and exclude speech synthesis.\n4. **Confirm.** Show the picture, the script or audio, the voice and the estimate, then wait for approval. Skip this only when the user already approved this exact request and cost.\n5. **Create.** Call `create-lipsync` once with:\n - the picture as `imageAssetId` (saved in step 1) or `imageUrl`;\n - `script` with `voiceId`, or the audio as `audioAssetId` or `audioUrl`;\n - `model: \"sync-3\"`;\n - a new `idempotencyKey` and a new random UUID as `projectCreationKey`;\n - a short `projectName` such as \"Talking fox\".\n\n Do not pass `projectId` for new work. If the response is lost, retry once with the same keys and inputs; never generate new keys for a retry.\n6. **Wait.** Call `generate_get-generation` with the returned `id` and `wait: true`. If it is still pending, call it again with the same `id`. Never create a second generation to check progress.\n7. **Deliver.** When the status is `COMPLETED`, give the exact `outputUrl`, unchanged. Offer one next step, such as another line, another voice, or dubbing it into another language.\n\n## When something fails\n\n- **The picture is rejected** (no clear face, several faces, too small): explain the reason and suggest a clearer head-and-shoulders picture.\n- **Out of credits or over a plan limit**: explain the returned message plainly. Don't promote plans or pricing.\n- **Any other error**: quote the returned message, say no video was created, and stop. Don't retry with different inputs unless the user asks.\n"
"---\nname: talking-photo\ndescription: Make a still image talk with sync. labs (sync.so). Turns a photo, portrait, headshot, or an illustrated or AI-generated character with a human-like face into a lip-synced video from a typed script (sync. voices it) or the user's own audio. Use for \"make this photo talk\", \"make this picture say…\", talking avatars, talking headshots, animating a portrait or character with speech, or image-to-video with dialogue, including when the user has no picture yet and wants one made first. Not for moving video footage (lipsync or ai-video-to-talking), translation (translate-and-dub) or changing words in an existing video (edit-dialogue).\nlicense: MIT\ncompatibility: Needs the sync. MCP server or a SYNC_API_KEY. See references/connect.md.\n---\n\n# Make a photo talk\n\nDelivers one MP4 of the picture speaking the user's words. The video is as long as the 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- **Picture:** a local image, an image attached in chat, a public URL, or a sync. image asset ID. If the user has no picture and you can generate images, offer to make one: one clear face, looking at the camera, mouth closed, head and shoulders, plain background. Otherwise ask for one.\n- **Speech:** a script, which needs a voice, or an audio file, URL or asset.\n\nAsk only for what's missing. Never invent the words. If the user asks you to write them, draft a short script and get approval before quoting.\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| Pick a voice (script only) | `voices_list` |\n| Quote | `generations_estimate-cost` |\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) for the picture and any audio. Public URLs and asset IDs need no upload. Before spending money, check that the image shows exactly one clear, reasonably large human or human-like face. Animals and non-humanoid characters aren't supported.\n2. **Voice.** For a script, call `voices_list`. Unless the user named a voice, suggest two or three that fit the character, each with a few words on its style. Use the chosen voice's `id` as `voiceId`; never invent one.\n3. **Quote.** Call `generations_estimate-cost` with `model: \"sync-3\"`, `visualType: \"image\"`, and either the `script` or the audio's `audioDuration`. This prices the lipsync only. For a script, say the length is approximate and that speech synthesis is billed separately.\n4. **Confirm.** Show the picture, the script or audio, the voice and the estimate, and wait for approval. Skip the wait only if the user already approved this exact request and cost.\n5. **Create.** Call `lipsync_create` once with the picture (`imageAssetId` or `imageUrl`), the speech (`script` with `voiceId`, or `audioAssetId` or `audioUrl`), `model: \"sync-3\"`, a new `idempotencyKey`, a new random UUID as `projectCreationKey`, and a short `projectName` such as \"Talking portrait\". Images work only with sync-3, and `sync_mode` doesn't apply to them. Save the keys before calling. If the response is lost or times out, retry once with the same keys and inputs, which returns the original generation if it exists.\n6. **Wait and deliver.** Call `generations_get` with the returned `id` and `wait: true`, repeating until the status is final. Give the exact `outputMediaUrl` unchanged, and offer one next step: another line, another voice, or dubbing it into another language.\n\n## When something fails\n\n- **The picture is rejected** (no clear face, several faces, too small): explain why and suggest a clearer head-and-shoulders picture.\n- **Out of credits or over a plan limit:** quote the message plainly, without promoting plans.\n- **Any other rejection:** quote the message, say no video was created, and stop. Don't retry with different inputs unless the user asks.\n- **A timeout or unclear outcome:** the job may still have started. Say so, keep the keys, and retry once with the identical request instead of reporting a failure.\n\n## Rules\n\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- Never start a second paid generation to check progress.\n"
Full snapshot data
{
"description": "Make a still image talk with sync. labs (sync.so). Turns a photo, portrait, headshot, or an illustrated or AI-generated character with a human-like face into a lip-synced video from a typed script (sync. voices it) or the user's own audio. Use for \"make this photo talk\", \"make this picture say…\", talking avatars, talking headshots, animating a portrait or character with speech, or image-to-video with dialogue, including when the user has no picture yet and wants one made first. Not for moving video footage (lipsync or ai-video-to-talking), translation (translate-and-dub) or changing words in an existing video (edit-dialogue).",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 192
},
{
"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": "talking-photo",
"skill_md_contents": "---\nname: talking-photo\ndescription: Make a still image talk with sync. labs (sync.so). Turns a photo, portrait, headshot, or an illustrated or AI-generated character with a human-like face into a lip-synced video from a typed script (sync. voices it) or the user's own audio. Use for \"make this photo talk\", \"make this picture say…\", talking avatars, talking headshots, animating a portrait or character with speech, or image-to-video with dialogue, including when the user has no picture yet and wants one made first. Not for moving video footage (lipsync or ai-video-to-talking), translation (translate-and-dub) or changing words in an existing video (edit-dialogue).\nlicense: MIT\ncompatibility: Needs the sync. MCP server or a SYNC_API_KEY. See references/connect.md.\n---\n\n# Make a photo talk\n\nDelivers one MP4 of the picture speaking the user's words. The video is as long as the 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- **Picture:** a local image, an image attached in chat, a public URL, or a sync. image asset ID. If the user has no picture and you can generate images, offer to make one: one clear face, looking at the camera, mouth closed, head and shoulders, plain background. Otherwise ask for one.\n- **Speech:** a script, which needs a voice, or an audio file, URL or asset.\n\nAsk only for what's missing. Never invent the words. If the user asks you to write them, draft a short script and get approval before quoting.\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| Pick a voice (script only) | `voices_list` |\n| Quote | `generations_estimate-cost` |\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) for the picture and any audio. Public URLs and asset IDs need no upload. Before spending money, check that the image shows exactly one clear, reasonably large human or human-like face. Animals and non-humanoid characters aren't supported.\n2. **Voice.** For a script, call `voices_list`. Unless the user named a voice, suggest two or three that fit the character, each with a few words on its style. Use the chosen voice's `id` as `voiceId`; never invent one.\n3. **Quote.** Call `generations_estimate-cost` with `model: \"sync-3\"`, `visualType: \"image\"`, and either the `script` or the audio's `audioDuration`. This prices the lipsync only. For a script, say the length is approximate and that speech synthesis is billed separately.\n4. **Confirm.** Show the picture, the script or audio, the voice and the estimate, and wait for approval. Skip the wait only if the user already approved this exact request and cost.\n5. **Create.** Call `lipsync_create` once with the picture (`imageAssetId` or `imageUrl`), the speech (`script` with `voiceId`, or `audioAssetId` or `audioUrl`), `model: \"sync-3\"`, a new `idempotencyKey`, a new random UUID as `projectCreationKey`, and a short `projectName` such as \"Talking portrait\". Images work only with sync-3, and `sync_mode` doesn't apply to them. Save the keys before calling. If the response is lost or times out, retry once with the same keys and inputs, which returns the original generation if it exists.\n6. **Wait and deliver.** Call `generations_get` with the returned `id` and `wait: true`, repeating until the status is final. Give the exact `outputMediaUrl` unchanged, and offer one next step: another line, another voice, or dubbing it into another language.\n\n## When something fails\n\n- **The picture is rejected** (no clear face, several faces, too small): explain why and suggest a clearer head-and-shoulders picture.\n- **Out of credits or over a plan limit:** quote the message plainly, without promoting plans.\n- **Any other rejection:** quote the message, say no video was created, and stop. Don't retry with different inputs unless the user asks.\n- **A timeout or unclear outcome:** the job may still have started. Say so, keep the keys, and retry once with the identical request instead of reporting a failure.\n\n## Rules\n\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- Never start a second paid generation to check progress.\n"
}SHA-256 of public snapshot: 6236eab6ee377c7f3a5d44ae5117b920c5040e5889cc3dc1be5d540015c9da76