Skip to main content
Glama

create lipsync

lipsync_create
Destructive

Create a single lipsync video by pairing one image or video with one audio clip or script and voice, so the subject speaks the script or matches the supplied audio.

Instructions

Create one lipsync video from exactly one visual (videoUrl, videoAssetId, imageUrl or imageAssetId) and one driver (audioUrl, audioAssetId, or script plus voiceId), to make a photo or video say a script or match its lips to supplied audio. When available, use lipsync_create-timeline instead for several audio clips or to lipsync only some ranges of one video, batches_create for 20 or more independent generations, dubbing_create to translate speech, and the Edit Dialogue tools (starting with dialogue_get-options) to change words in existing speech.

For a local file, when the assets tools are available, call assets_create-upload-url, PUT the bytes to its uploadUrl with the same Content-Type, register the url it returned (not the uploadUrl) with assets_create, and pass that asset id. provider, stability and similarityBoost apply only to script.

This is a paid generation, billed in the session's organization unless organizationId names another. It returns the generation id and status at once; poll generations_get with wait: true until it finishes, then copy outputMediaUrl verbatim.

Without projectId it first creates a NEW project, named projectName or a default, even if that name matches existing work. The input combination is checked before that; rejections from the API itself come after the project exists. Pass projectId, with projectIntent=explicit and without projectName or projectCreationKey, only for a project the user explicitly chose or one just created for this request. continuation, from generations_get-continuation, requires the parent generation's projectId.

Before calling, persist an idempotencyKey and, without projectId, a fresh projectCreationKey. After a lost or uncertain response, never create again with new keys: if the error names a generationId, poll it with generations_get; otherwise resend the identical request with the same keys.

Input Schema

NameRequiredDescriptionDefault
modelNoOptional model override. Image and video inputs default to sync-3.
scriptNoText for the image or video to say.
optionsNoModel-specific generation preferences. Keep unchanged when retrying the same idempotency key.
voiceIdNoVoice id from voices_list. Required when script is provided.
audioUrlNoPublic or Sync-hosted audio URL. Use this when the user supplies audio.
imageUrlNoPublic or Sync-hosted still image URL. Use this for image-to-video lipsync with sync-3.
providerNoVoice provider for script-driven lipsync. Defaults to elevenlabs.
videoUrlNoPublic or Sync-hosted video URL. Supply exactly one visual input.
projectIdNoExisting Sync project ID returned by projects_list or projects_get. Use this to select the same project as the web app. Cannot be combined with projectName.
stabilityNoOptional ElevenLabs voice stability for script input.
projectNameNoName for a NEW project only. Never search or reuse a matching name. Cannot be combined with projectId.
audioAssetIdNoSaved audio asset id in the same organization as this call, from assets_list or assets_create when available. Supply audio or script, not both.
continuationNoOnly when the user explicitly continues an existing generation in this project: the parent generation and its workflow.
imageAssetIdNoSaved still image asset id in the same organization as this call, from assets_list or assets_create when available, for image-to-video lipsync. Supply exactly one visual input.
videoAssetIdNoSaved video asset id in the same organization as this call, from assets_list or assets_create when available. Supply exactly one visual input.
projectIntentNoRequired with projectId. Set only for an explicit user project selection/update, or the new project just created for this request. Never infer intent from a matching project name, workflow name or active editor.
idempotencyKeyNoUnique key for one generation action. Persist and reuse the same key, projectCreationKey (for new projects) or explicit projectId, model, and inputs when retrying after a lost response. Use durable asset IDs or stable URLs; upload files before starting the keyed action. A new intentional generation needs a new key. Passed as the Sync API Idempotency-Key header.
organizationIdNoRun only this call in another of the user’s Sync organizations, by id from organizations_list, when the user asks for it (for example “generate this in the Acme org”). The session keeps its organization; reads of the ids this call returns stay in this organization. Omit to use the session’s organization.
similarityBoostNoOptional ElevenLabs similarity boost for script input.
projectCreationKeyNoFresh random UUID identifying this NEW project creation, not a project ID. Required for keyed generation without projectId. Persist this key, name and generation key on retries; the server derives a separate project UUID.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changedv0.2.4
    • changedInput schema / properties / audioAssetId / description
      Previous value: -"Existing Sync asset ID in the same organization."New value: +"Saved audio asset id in the same organization as this call, from assets_list or assets_create when available. Supply audio or script, not both."
    • changedInput schema / properties / imageAssetId / description
      Previous value: -"Existing Sync asset ID in the same organization."New value: +"Saved still image asset id in the same organization as this call, from assets_list or assets_create when available, for image-to-video lipsync. Supply exactly one visual input."
    • changedInput schema / properties / videoAssetId / description
      Previous value: -"Existing Sync asset ID in the same organization."New value: +"Saved video asset id in the same organization as this call, from assets_list or assets_create when available. Supply exactly one visual input."
  2. Changed9 schema fields changed
    • addedInput schema / properties / continuation / description
      Added value: +"Only when the user explicitly continues an existing generation in this project: the parent generation and its workflow."
    • addedInput schema / properties / continuation / properties / parentGenerationId / description
      Added value: +"Id of the existing generation this continues."
    • addedInput schema / properties / continuation / properties / workflow / description
      Added value: +"The parent generation's workflow, from generations_get-continuation."
    • changedInput schema / properties / options / properties / active_speaker_detection / anyOf
      Previous value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "auto_detect": {
      -        "type": "boolean"
      -      },
      -      "coordinates": {
      -        "items": false,
      -        "maxItems": 2,
      -        "minItems": 2,
      -        "prefixItems": [
      -          {
      -            "type": "number"
      -          },
      -          {
      -            "type": "number"
      -          }
      -        ],
      -        "type": "array"
      -      },
      -      "face_image": {
      -        "type": "string"
      -      },
      -      "frame_number": {
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "use_v2": {
      -        "type": "boolean"
      -      },
      -      "v3": {
      -        "type": "boolean"
      -      }
      -    },
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "type": "boolean"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "auto_detect": {
      +        "description": "Find the person speaking automatically.",
      +        "type": "boolean"
      +      },
      +      "coordinates": {
      +        "description": "[x, y] pixel position of the speaker's face on frame_number.",
      +        "items": false,
      +        "maxItems": 2,
      +        "minItems": 2,
      +        "prefixItems": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "number"
      +          }
      +        ],
      +        "type": "array"
      +      },
      +      "face_image": {
      +        "description": "URL of a reference image of the speaker's face.",
      +        "type": "string"
      +      },
      +      "frame_number": {
      +        "description": "Zero-based video frame that coordinates refer to.",
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "use_v2": {
      +        "description": "Use the second-generation speaker detector.",
      +        "type": "boolean"
      +      },
      +      "v3": {
      +        "description": "Use the third-generation speaker detector.",
      +        "type": "boolean"
      +      }
      +    },
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / options / properties / active_speaker_detection / description
      Added value: +"Which face to lipsync when several people are visible: true or { auto_detect: true } to find the speaker, or frame_number plus coordinates to pick one. Omit for a single face or an image."
    • addedInput schema / properties / options / properties / model_mode / description
      Added value: +"How much of the face the model may change: lips, face or head."
    • addedInput schema / properties / options / properties / occlusion_detection_enabled / description
      Added value: +"Keep hands, microphones and other objects that pass in front of the mouth in front of it. Slower."
    • addedInput schema / properties / options / properties / sync_mode / description
      Added value: +"How to fit audio and video of different lengths: bounce (play the video forward, then in reverse), loop, cut_off (stop at the shorter input), silence (pad with silence to the longer input) or remap (change the video speed to match the audio)."
    • addedInput schema / properties / options / properties / temperature / description
      Added value: +"How expressive the mouth movement is, from 0 to 1. Omit for the model default."
  3. Addedv0.1.5

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavior beyond annotations: it is a paid generation billed to an organization, returns an id plus status to be polled via generations_get, and silently creates a new project when projectId is absent, with API rejections occurring after project creation. That said, the annotations already declare destructiveHint=true and idempotentHint=false, and the description does not explicitly discuss irreversibility or cost magnitude, so it complements rather than fully carries the burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and alternatives first, then asset upload, then project and idempotency mechanics — a sensible ordering. It is dense and some sentences pack multiple constraints, but nearly every clause carries operational meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 20-parameter, high-consequence generation tool with nested options and sibling alternatives, the description covers input combination rules, asset upload flow, billing scope, project side effects, retry/idempotency protocol and follow-up polling. Combined with the existing output schema, an agent has what it needs to invoke and recover safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3; the description earns more by explaining cross-parameter rules the schema only implies: exactly one visual and one driver, script+voiceId pairing, and that provider, stability and similarityBoost apply only to script. It also clarifies the projectId/projectCreationKey/projectIntent coupling.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (create one lipsync video) and immediately constrains inputs to exactly one visual and one driver, naming the concrete fields. It explicitly differentiates from siblings like lipsync_create-timeline, batches_create, dubbing_create and the Edit Dialogue tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use-other guidance for four alternatives with the conditions that select them (several audio clips, 20+ generations, translation, editing existing speech). It also states when to pass projectId versus projectName, and when continuation is warranted, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.