Agent skill

Video Translate

by calesthio in calesthio/OpenMontage

Translate and dub existing videos into multiple languages using HeyGen.

AGPL-3.0Auto-check passedMedia & Creative

Install Video Translate

skills CLI
$ npx skills add calesthio/OpenMontage --skill video-translate -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install calesthio/OpenMontage video-translate --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/calesthio/OpenMontage.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/video-translate .claude/skills/video-translate && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
video-translate
GitHub stars
66k
Token cost
~2.7k tokens
SKILL.md length
397 words
Files
1
Skills in repo
41
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Translate and dub existing videos into multiple languages using HeyGen.

  • Works in 4 steps: Provide a video URL or HeyGen video ID → Call POST /v2/video_translate with the… → Poll GET… → …
  • Translating a video into another language
  • SKILL.md covers Authentication, Default Workflow, Creating a Translation Job and Supported Languages, plus 9 more sections
  • Calls curl; reaches api.heygen.com; needs HEYGEN_API_KEY

What it does

Video Translate is an agent skill from calesthio/OpenMontage. Translate and dub existing videos into multiple languages using HeyGen. Use when: (1) Translating a video into another language, (2) Dubbing video content with lip-sync, (3) Creating multi-language versions of existing videos, (4) Audio-only translation without lip-sync, (5) Working with HeyGen's /v2/videotranslate endpoint.

Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Media & Creative, covering Translation and Text to speech and voice. It works with HeyGen. The repository describes itself as: World's first open-source, agentic video production system. 12 production pipelines, 100+ tools, 700+ agent skill and production-knowledge files. Turn your AI coding assistant… The licence is AGPL-3.0.

When your agent uses it

  • Translating a video into another language
  • Dubbing video content with lip-sync
  • Creating multi-language versions of existing videos
  • Audio-only translation without lip-sync

Example prompts

  • “/video-translate”

Requirements

  • Python 3
  • A credential in HEYGEN_API_KEY
  • Pre-approved tools (allowed-tools): mcp__heygen__*

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. Provide a video URL or HeyGen video ID
  2. Call POST /v2/video_translate with the target language
  3. Poll GET /v2/video_translate/{translate_id} until status is completed
  4. Download the translated video from the returned URL

What it can do on your machine

Read from SKILL.md and the folder at commit 9327439. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • mcp__heygen__*

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • api.heygen.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • HEYGEN_API_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Video Translate loads about 2.7k tokens when it runs. Until then it costs about 86 tokens; SKILL.md has 397 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~86
When it runs · the whole SKILL.md, loaded when a task matches
~2.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from calesthio/OpenMontage at commit 9327439, republished under its AGPL-3.0 licence (© calesthio). 397 words, ~2,739 tokens.

Download SKILL.mdSave it as .claude/skills/video-translate/SKILL.md (or your agent's skills folder).
name
video-translate
description
Translate and dub existing videos into multiple languages using HeyGen. Use when: (1) Translating a video into another language, (2) Dubbing video content with lip-sync, (3) Creating multi-language versions of existing videos, (4) Audio-only translation without lip-sync, (5) Working with HeyGen's /v2/video_translate endpoint.
allowed-tools
mcp__heygen__*

Video Translation (HeyGen)

Translate and dub existing videos into multiple languages, preserving lip-sync and natural speech patterns. Provide a video URL or HeyGen video ID — no need to create the video on HeyGen first.

Authentication

All requests require the X-Api-Key header. Set the HEYGEN_API_KEY environment variable.

bash
curl -X POST "https://api.heygen.com/v2/video_translate" \
  -H "X-Api-Key: $HEYGEN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"video_url": "https://example.com/video.mp4", "output_language": "es-ES"}'

Default Workflow

  1. Provide a video URL or HeyGen video ID
  2. Call POST /v2/video_translate with the target language
  3. Poll GET /v2/video_translate/{translate_id} until status is completed
  4. Download the translated video from the returned URL

Creating a Translation Job

Request Fields
FieldTypeReqDescription
video_urlstringY*URL of video to translate (*or video_id)
video_idstringY*HeyGen video ID (*or video_url)
output_languagestringYTarget language code (e.g., "es-ES")
titlestringName for the translated video
translate_audio_onlybooleanAudio only, no lip-sync (faster)
speaker_numnumberNumber of speakers in video
callback_idstringCustom ID for webhook tracking
callback_urlstringURL for completion notification

Either video_url or video_id must be provided.

curl
bash
curl -X POST "https://api.heygen.com/v2/video_translate" \
  -H "X-Api-Key: $HEYGEN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "video_url": "https://example.com/original-video.mp4",
    "output_language": "es-ES",
    "title": "Spanish Version"
  }'
TypeScript
typescript
interface VideoTranslateRequest {
  video_url?: string;
  video_id?: string;
  output_language: string;
  title?: string;
  translate_audio_only?: boolean;
  speaker_num?: number;
  callback_id?: string;
  callback_url?: string;
}

interface VideoTranslateResponse {
  error: null | string;
  data: {
    video_translate_id: string;
  };
}

async function translateVideo(config: VideoTranslateRequest): Promise<string> {
  const response = await fetch("https://api.heygen.com/v2/video_translate", {
    method: "POST",
    headers: {
      "X-Api-Key": process.env.HEYGEN_API_KEY!,
      "Content-Type": "application/json",
    },
    body: JSON.stringify(config),
  });

  const json: VideoTranslateResponse = await response.json();

  if (json.error) {
    throw new Error(json.error);
  }

  return json.data.video_translate_id;
}
Python
python
import requests
import os

def translate_video(config: dict) -> str:
    response = requests.post(
        "https://api.heygen.com/v2/video_translate",
        headers={
            "X-Api-Key": os.environ["HEYGEN_API_KEY"],
            "Content-Type": "application/json"
        },
        json=config
    )

    data = response.json()
    if data.get("error"):
        raise Exception(data["error"])

    return data["data"]["video_translate_id"]

Supported Languages

LanguageCodeNotes
English (US)en-USDefault source
Spanish (Spain)es-ESEuropean Spanish
Spanish (Mexico)es-MXLatin American
Frenchfr-FRStandard French
Germande-DEStandard German
Italianit-ITStandard Italian
Portuguese (Brazil)pt-BRBrazilian Portuguese
Japaneseja-JPStandard Japanese
Koreanko-KRStandard Korean
Chinese (Mandarin)zh-CNSimplified Chinese
Hindihi-INStandard Hindi
Arabicar-SAModern Standard Arabic

Translation Options

Basic Translation (with lip-sync)
typescript
const config = {
  video_url: "https://example.com/original.mp4",
  output_language: "es-ES",
  title: "Spanish Translation",
};
Audio-Only Translation (faster, no lip-sync)
typescript
const config = {
  video_url: "https://example.com/original.mp4",
  output_language: "es-ES",
  translate_audio_only: true,
};
Multi-Speaker Videos
typescript
const config = {
  video_url: "https://example.com/interview.mp4",
  output_language: "fr-FR",
  speaker_num: 2,
};
Show full SKILL.md (163 more words)Show less

Advanced Options (v4 API)

For more control over translation:

typescript
interface VideoTranslateV4Request {
  input_video_id?: string;
  google_url?: string;
  output_languages: string[];        // Multiple languages in one call
  name: string;
  srt_key?: string;                  // Custom SRT subtitles
  instruction?: string;
  vocabulary?: string[];             // Terms to preserve as-is
  brand_voice_id?: string;
  speaker_num?: number;
  keep_the_same_format?: boolean;
  input_language?: string;
  enable_video_stretching?: boolean;
  disable_music_track?: boolean;
  enable_speech_enhancement?: boolean;
  srt_role?: "input" | "output";
  translate_audio_only?: boolean;
}
Multiple Output Languages
typescript
const config = {
  input_video_id: "original_video_id",
  output_languages: ["es-ES", "fr-FR", "de-DE"],
  name: "Multi-language translations",
};
Custom Vocabulary (preserve specific terms)
typescript
const config = {
  video_url: "https://example.com/product-demo.mp4",
  output_language: "ja-JP",
  vocabulary: ["SuperWidget", "Pro Max", "TechCorp"],
};
Custom SRT Subtitles
typescript
const config = {
  video_url: "https://example.com/video.mp4",
  output_language: "es-ES",
  srt_key: "path/to/custom-subtitles.srt",
  srt_role: "input",
};

Checking Translation Status

curl
bash
curl -X GET "https://api.heygen.com/v2/video_translate/{translate_id}" \
  -H "X-Api-Key: $HEYGEN_API_KEY"
TypeScript
typescript
interface TranslateStatusResponse {
  error: null | string;
  data: {
    id: string;
    status: "pending" | "processing" | "completed" | "failed";
    video_url?: string;
    message?: string;
  };
}

async function getTranslateStatus(translateId: string): Promise<TranslateStatusResponse["data"]> {
  const response = await fetch(
    `https://api.heygen.com/v2/video_translate/${translateId}`,
    { headers: { "X-Api-Key": process.env.HEYGEN_API_KEY! } }
  );

  const json: TranslateStatusResponse = await response.json();

  if (json.error) {
    throw new Error(json.error);
  }

  return json.data;
}

Polling for Completion

Translations take longer than standard video generation — allow up to 30 minutes.

typescript
async function waitForTranslation(
  translateId: string,
  maxWaitMs = 1800000,
  pollIntervalMs = 30000
): Promise<string> {
  const startTime = Date.now();

  while (Date.now() - startTime < maxWaitMs) {
    const status = await getTranslateStatus(translateId);

    switch (status.status) {
      case "completed":
        return status.video_url!;
      case "failed":
        throw new Error(status.message || "Translation failed");
      default:
        console.log(`Status: ${status.status}...`);
        await new Promise((r) => setTimeout(r, pollIntervalMs));
    }
  }

  throw new Error("Translation timed out");
}

Complete Workflow

typescript
async function translateAndDownload(
  videoUrl: string,
  targetLanguage: string
): Promise<string> {
  console.log(`Starting translation to ${targetLanguage}...`);
  const translateId = await translateVideo({
    video_url: videoUrl,
    output_language: targetLanguage,
  });
  console.log(`Translation ID: ${translateId}`);

  console.log("Processing translation...");
  const translatedVideoUrl = await waitForTranslation(translateId);
  console.log(`Translation complete: ${translatedVideoUrl}`);

  return translatedVideoUrl;
}

const spanishVideo = await translateAndDownload(
  "https://example.com/my-video.mp4",
  "es-ES"
);

Batch Translation

Translate to multiple languages in parallel:

typescript
async function translateToMultipleLanguages(
  sourceVideoUrl: string,
  targetLanguages: string[]
): Promise<Record<string, string>> {
  const results: Record<string, string> = {};

  const translatePromises = targetLanguages.map(async (lang) => {
    const translateId = await translateVideo({
      video_url: sourceVideoUrl,
      output_language: lang,
    });
    return { lang, translateId };
  });

  const translationJobs = await Promise.all(translatePromises);

  for (const job of translationJobs) {
    try {
      const videoUrl = await waitForTranslation(job.translateId);
      results[job.lang] = videoUrl;
    } catch (error) {
      results[job.lang] = `error: ${error.message}`;
    }
  }

  return results;
}

const translations = await translateToMultipleLanguages(
  "https://example.com/original.mp4",
  ["es-ES", "fr-FR", "de-DE", "ja-JP"]
);

Features

  • Lip Sync — Automatically adjusts speaker's lip movements to match translated audio
  • Voice Cloning — Translated audio matches the original speaker's voice characteristics
  • Music Track Control — Optionally remove background music with disable_music_track: true
  • Speech Enhancement — Improve audio quality with enable_speech_enhancement: true

Best Practices

  1. Source quality matters — Use high-quality source videos for better results
  2. Clear audio — Videos with clear speech translate better
  3. Single speaker — Best results with single-speaker content
  4. Moderate pacing — Very fast speech may affect quality
  5. Test first — Try with shorter clips before translating long videos
  6. Allow extra time — Translation takes longer than video generation (up to 30 min)

Error Handling

Common errors and how to handle them:

typescript
async function safeTranslate(
  videoUrl: string,
  targetLanguage: string
): Promise<{ success: boolean; result?: string; error?: string }> {
  try {
    const url = await translateAndDownload(videoUrl, targetLanguage);
    return { success: true, result: url };
  } catch (error) {
    if (error.message.includes("quota")) {
      return { success: false, error: "Insufficient credits" };
    }
    if (error.message.includes("duration")) {
      return { success: false, error: "Video too long" };
    }
    if (error.message.includes("format")) {
      return { success: false, error: "Unsupported video format" };
    }
    return { success: false, error: error.message };
  }
}

© calesthio, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/video-translate of calesthio/OpenMontage.

Open the folder on GitHubat commit 9327439

Compare with similar skills

Video Translate next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Video Translate compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Video Translate this skillcalesthio/OpenMontage66k—~2.7kAutomated safety check: PassAGPL-3.0
Animejsboraoztunc/skills3982 repos~828Automated safety check: PassApache-2.0
Vocab Lessonreceptron/mulmocast-cli475—~3.1kAutomated safety check: NotesNone
Video TranslationNoizAI/skills526—~1.3kAutomated safety check: NotesNone
HeygenHybridAIOne/hybridclaw159—~2.4kAutomated safety check: PassMIT
Adaptationdanjdewhurst/story-skills2861 repos~3.5kAutomated safety check: NotesMIT

Similar skills

  • Animejs

    boraoztunc/skills

    Anime.js adapter patterns for HyperFrames. An agent skill from boraoztunc/skills.

    398 GitHub starsUsed in 2 repos~828 tokens
    Media & CreativeAuto-check passed
  • Vocab Lesson

    receptron/mulmocast-cli

    Create a vocabulary learning lesson MulmoScript with multi-section structure (word display, examples with voiceover, explanation, review with translation).

    475 GitHub stars~3.1k tokensUpdated today
    Media & CreativeAuto-check: notes
  • Video Translation

    NoizAI/skills

    Translate and dub videos from one language to another, replacing the original audio with TTS while keeping the video intact.

    526 GitHub stars~1.3k tokensUpdated 13 days ago
    Media & CreativeAuto-check: notes
  • Heygen

    HybridAIOne/hybridclaw

    Prepare guarded HeyGen Direct API requests for avatar video generation, video translation, asset discovery, and status polling.

    159 GitHub stars~2.4k tokensUpdated yesterday
    Media & CreativeAuto-check passed
  • Adaptation

    danjdewhurst/story-skills

    This skill should be used when the user asks to "make an audiobook", "narration script", "narrator", "ACX", "Findaway", "pronunciation guide", "how long is the audiobook", "adapt to a screenplay"…

    286 GitHub starsUsed in 1 repo~3.5k tokens
    Media & CreativeAuto-check: notes
  • HyperFrames Media Use

    heygen-com/hyperframes

    Finds, generates and edits media for HyperFrames video projects: music, sound effects, images, icons, logos, voiceovers, captions and color grades.

    60k GitHub stars~2.4k tokensUpdated today
    Media & CreativeAuto-check passed

More from calesthio/OpenMontage

All 41 skills in this repo
  • Video Understand

    calesthio/OpenMontage

    Understand video content locally using ffmpeg frame extraction and Whisper transcription.

    66k GitHub stars~841 tokensUpdated 7 days ago
    Auto-check passed
  • Avatar Video

    calesthio/OpenMontage

    Create AI avatar videos with precise control over avatars, voices, scripts, scenes, and backgrounds using HeyGen's v2 API.

    66k GitHub stars~1.6k tokensUpdated 7 days ago
    Auto-check passed
  • D3 Viz

    calesthio/OpenMontage

    Creating interactive data visualisations using d3.js. An agent skill from calesthio/OpenMontage.

    66k GitHub starsUsed in 3 repos~5.4k tokens
    Auto-check passed
  • Create Video

    calesthio/OpenMontage

    Create videos from a text prompt using HeyGen's Video Agent.

    66k GitHub stars~1.3k tokensUpdated 7 days ago
    Auto-check passed
  • Threejs World Generation

    calesthio/OpenMontage

    Build deterministic, editable, free-viewpoint Three.js worlds from text or structured briefs.

    66k GitHub stars~2k tokensUpdated 7 days ago
    Auto-check passed
  • Video Edit

    calesthio/OpenMontage

    Edit videos locally using ffmpeg. An agent skill from calesthio/OpenMontage.

    66k GitHub stars~855 tokensUpdated 7 days ago
    Auto-check: notes

Works with

Questions about Video Translate

What does Video Translate do?

Translate and dub existing videos into multiple languages using HeyGen. Video Translate is an agent skill from calesthio/OpenMontage. Translate and dub existing videos into multiple languages using HeyGen.

When should I use Video Translate?

Video Translate fits situations like: translating a video into another language; dubbing video content with lip-sync; creating multi-language versions of existing videos; audio-only translation without lip-sync.

How do I install Video Translate in Claude Code?

Run `npx skills add calesthio/OpenMontage --skill video-translate -a claude-code`. Or copy the skill folder (.agents/skills/video-translate in calesthio/OpenMontage) into .claude/skills/video-translate in your project. Claude Code loads it when a task matches its description.

How do I install Video Translate in Codex?

Run `npx skills add calesthio/OpenMontage --skill video-translate -a codex`. Or copy the skill folder (.agents/skills/video-translate in calesthio/OpenMontage) into .agents/skills/video-translate in your project. Codex loads it when a task matches its description.

Can I use Video Translate in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add calesthio/OpenMontage --skill video-translate -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/video-translate, .gemini/skills/video-translate, .github/skills/video-translate and .opencode/skills/video-translate in your project.

What does Video Translate need to run?

Going by SKILL.md and its folder, Video Translate needs the command-line tools its instructions call (curl) and credentials named HEYGEN_API_KEY. Our summary lists: Python 3; A credential in HEYGEN_API_KEY. Its frontmatter pre-approves these tools: mcp__heygen__*.

Does Video Translate access the network?

SKILL.md names 1 domain. In commands or code: api.heygen.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Video Translate safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Video Translate use?

Video Translate is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Video Translate use?

About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Video Translate?

Skills that share tags, products or a category with Video Translate: Animejs (boraoztunc/skills, 398 stars), Vocab Lesson (receptron/mulmocast-cli, 475 stars), Video Translation (NoizAI/skills, 526 stars) and Heygen (HybridAIOne/hybridclaw, 159 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Video Translate?

calesthio (a GitHub user) maintains it in calesthio/OpenMontage, which has 65,930 GitHub stars. The repository holds 41 skills in this directory. The repository was last updated on October 3, 2026.

Source: calesthio/OpenMontage on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.