Skip to main content
Glama

translate and dub a video

dubbing_create
Destructive

Translate a saved video's speech into another language and lip-sync the result to the dubbed audio, producing a finished dubbed video as a paid generation.

Instructions

Translate a saved video's speech into another language and lip-sync it to the dubbed audio, as one paid sync. generation that covers both dubbing and the final render. Use it for a finished dubbed video. Not for subtitles only or translating a text document; to lip-sync audio you already have, use lipsync_create. To review translated audio first, translation-previews_create (offered only when dubbing_get-options reports previewAvailable) translates a saved AUDIO asset, not a video.

For social video URLs, import through assets_create and wait for the saved asset before estimating or calling this tool. This is a paid action: confirm the requested language, configuration and estimated cost with the user before calling. Use generations_estimate-cost with workflow=translate-and-dub when that input is supported, and disclose any excluded external provider charges. Without the combined breakdown, lip-sync pricing is not the full workflow cost. Omit projectId to start a NEW project (fresh projectCreationKey); pass projectId with projectIntent=explicit only for a project the user selected or one just created for this request, never because a name matches or an editor is open.

Returns the generation (id, status, projectId); poll that id with generations_get, or jobs_wait (kind generation) when available, until COMPLETED, then read outputMediaUrl. After an uncertain response, retry only with the same idempotencyKey, projectCreationKey and inputs; never create another job to finish or recover it.

Input Schema

NameRequiredDescriptionDefault
modelYesLip-sync model name from models_list (for example sync-3), used for the final render. Any generations_estimate-cost quote for this dub must use the same model.
optionsNoOptional model controls. Omit any field to use its default.
projectIdNoProject ID only when explicitly selected by the user, or just created for this request; requires projectIntent=explicit. Cannot be combined with projectName or projectCreationKey. Otherwise omit it to create a new project. Keep unchanged on retries.
sourceLangYesSpoken language of the source video, from dubbing_get-options sourceLanguages. Defaults to auto, which detects it; set a code only when the user names the source language.auto
targetLangYesLanguage code to dub into, for example es or pt-BR; the same list dubbing_get-options returns as targetLanguages.
projectNameNoName for the NEW project created when projectId is omitted; defaults to "Translate and Dub". Cannot be combined with projectId. A matching existing name is never reused.
continuationNoOnly when the user explicitly continues an existing generation in this project: the parent generation (from generations_get-continuation) and its workflow, which must be translate_and_dub. Requires projectId.
videoAssetIdYesExisting Sync VIDEO asset in the connected organization. For a social link, first create a NEW project unless the user explicitly chose an existing one. Import via assets_create with type=VIDEO and that projectId, wait for its saved asset id, then pass the same projectId with projectIntent=explicit.
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.
idempotencyKeyYesPersist one unique key per approved generation before calling. Retry an uncertain request with this exact key, the same projectCreationKey and unchanged inputs; never automatically create a new key.
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.
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. Changed7 schema fields changedv0.2.4
    • changedInput schema / properties / continuation / description
      Previous value: -"Only when the user explicitly continues an existing generation in this project: the parent generation and its workflow."New value: +"Only when the user explicitly continues an existing generation in this project: the parent generation (from generations_get-continuation) and its workflow, which must be translate_and_dub. Requires projectId."
    • changedInput schema / properties / idempotencyKey / description
      Previous value: -"Persist one unique key per approved generation. Retry an uncertain request with this exact key and unchanged inputs; never automatically create a new key."New value: +"Persist one unique key per approved generation before calling. Retry an uncertain request with this exact key, the same projectCreationKey and unchanged inputs; never automatically create a new key."
    • changedInput schema / properties / model / description
      Previous value: -"Video lip-sync model returned by models_list."New value: +"Lip-sync model name from models_list (for example sync-3), used for the final render. Any generations_estimate-cost quote for this dub must use the same model."
    • changedInput schema / properties / projectId / description
      Previous value: -"Project ID only when explicitly selected by the user, or just created for this request. Otherwise omit it to create a new project. Keep unchanged on retries."New value: +"Project ID only when explicitly selected by the user, or just created for this request; requires projectIntent=explicit. Cannot be combined with projectName or projectCreationKey. Otherwise omit it to create a new project. Keep unchanged on retries."
    • changedInput schema / properties / projectName / description
      Previous value: -"Name for a NEW project. A matching existing name is never reused."New value: +"Name for the NEW project created when projectId is omitted; defaults to \"Translate and Dub\". Cannot be combined with projectId. A matching existing name is never reused."
    • changedInput schema / properties / sourceLang / description
      Previous value: -"Spoken language of the source video. Leave as auto to detect it."New value: +"Spoken language of the source video, from dubbing_get-options sourceLanguages. Defaults to auto, which detects it; set a code only when the user names the source language."
    • changedInput schema / properties / targetLang / description
      Previous value: -"Target language from the API-supported list."New value: +"Language code to dub into, for example es or pt-BR; the same list dubbing_get-options returns as targetLanguages."
  2. Changed11 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."
    • addedInput schema / properties / options / description
      Added value: +"Optional model controls. Omit any field to use its default."
    • 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."
    • addedInput schema / properties / sourceLang / description
      Added value: +"Spoken language of the source video. Leave as auto to detect it."
  3. Addedv0.1.5

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, openWorldHint=true and idempotentHint=false; the description adds real context beyond them: this is a paid action requiring user confirmation of language, configuration and estimated cost, that external provider charges may be excluded from a lip-sync-only quote, and the full async lifecycle (poll generations_get or jobs_wait until COMPLETED, then read outputMediaUrl). It does not explain the destructive implication flagged by annotations, so it stops short of full disclosure.

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?

Content is front-loaded: purpose and sibling exclusions come first, then prerequisites, cost gate, project rules, and return/polling. It is dense and every section is useful, but retry/idempotency guidance is stated both in the body and repeated in the idempotencyKey, projectCreationKey and continuation parameter descriptions, adding some redundancy for a 12-parameter tool.

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

Completeness4/5

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

Given 12 parameters, nested options, enums and an output schema, the description covers the workflow end to end: sourcing the asset, estimating cost, project creation, and polling to outputMediaUrl. Return-value explanation is largely redundant with the output schema, and the destructive/idempotency implications of the annotations are left unaddressed, so it is strong but not exhaustive.

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 the baseline is 3; the description earns above that by adding cross-tool ordering meaning (model must match the generations_estimate-cost quote; targetLang comes from dubbing_get-options) and by clarifying that projectId requires projectIntent=explicit and must not be inferred from a name or an open editor. Most remaining parameter detail is already in the schema, limiting it to a 4.

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?

The description names a specific compound verb and resource — translate a saved video's speech, lip-sync it, render one finished paid generation — and explicitly delimits scope against siblings: 'Not for subtitles only or translating a text document', 'to lip-sync audio you already have, use lipsync_create', and names translation-previews_create for audio-only review. An agent can route correctly without opening any schema.

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?

It gives explicit when-to-use and when-not-to-use rules plus named alternatives with the selecting condition (previewAvailable from dubbing_get-options), prerequisites for social URLs (import via assets_create, wait for the saved asset), a mandatory confirmation step before the paid call, and clear projectId vs projectCreationKey vs omit semantics including what is NOT valid grounds for passing projectId.

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