Video Translator
shang-zhu/violin
Dub a video into another language and generate subtitles using the default Together + Cartesia stack.
Dub audio and video into other languages using the ElevenLabs Dubbing API (dubbingv2), preserving the original speakers' voices.
$ npx skills add elevenlabs/skills --skill dubbing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install elevenlabs/skills dubbing --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/elevenlabs/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/dubbing .claude/skills/dubbing && rm -rf skills-srcUse ~/.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/
Install the "dubbing" agent skill from https://github.com/elevenlabs/skills/tree/main/dubbing into .claude/skills/dubbing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dubbing", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/elevenlabs/skills/tree/main/dubbingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add elevenlabs/skills --skill dubbing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install elevenlabs/skills dubbing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elevenlabs/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/dubbing .agents/skills/dubbing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "dubbing" agent skill from https://github.com/elevenlabs/skills/tree/main/dubbing into .agents/skills/dubbing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dubbing", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add elevenlabs/skills --skill dubbing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install elevenlabs/skills dubbing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elevenlabs/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/dubbing .cursor/skills/dubbing && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "dubbing" agent skill from https://github.com/elevenlabs/skills/tree/main/dubbing into .cursor/skills/dubbing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dubbing", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/elevenlabs/skills.git --path dubbing--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add elevenlabs/skills --skill dubbing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install elevenlabs/skills dubbing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elevenlabs/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/dubbing .gemini/skills/dubbing && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "dubbing" agent skill from https://github.com/elevenlabs/skills/tree/main/dubbing into .gemini/skills/dubbing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dubbing", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install elevenlabs/skills dubbingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add elevenlabs/skills --skill dubbing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/elevenlabs/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/dubbing .github/skills/dubbing && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "dubbing" agent skill from https://github.com/elevenlabs/skills/tree/main/dubbing into .github/skills/dubbing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dubbing", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add elevenlabs/skills --skill dubbing -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install elevenlabs/skills dubbing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/elevenlabs/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/dubbing .opencode/skills/dubbing && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "dubbing" agent skill from https://github.com/elevenlabs/skills/tree/main/dubbing into .opencode/skills/dubbing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dubbing", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
dubbingDub audio and video into other languages using the ElevenLabs Dubbing API (dubbingv2), preserving the original speakers' voices.
Dubbing is an agent skill from elevenlabs/skills. Dub audio and video into other languages using the ElevenLabs Dubbing API (dubbingv2), preserving the original speakers' voices. Use when translating videos, podcasts, or recordings into other languages, localizing media content, reviewing or correcting dubbing transcripts and translations, or regenerating a dub after edits.
Its SKILL.md is about 3.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/api-reference.md` and `references/installation.md`). Compatibility notes: Requires internet access and an ElevenLabs API key (ELEVENLABSAPIKEY).
It sits in Media & Creative, covering Text to speech and voice and Translation. It works with ElevenLabs. The repository describes itself as: Collections of skills for building with ElevenLabs. The licence is MIT.
7 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 1d08a4a. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are python, bash and typescript).
From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.elevenlabs.ioFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
ELEVENLABS_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Requires internet access and an ElevenLabs API key (ELEVENLABS_API_KEY).
From compatibility in the SKILL.md frontmatter.
Dubbing loads about 3.3k tokens when it runs, and up to ~7.4k if it reads all its reference files. Until then it costs about 84 tokens; SKILL.md has 912 words of instructions outside code blocks.
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.
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.
The full file from elevenlabs/skills at commit 1d08a4a, republished under its MIT licence (© elevenlabs). 912 words, ~3,267 tokens.
.claude/skills/dubbing/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Dub audio or video into other languages while preserving the original speakers' voices. Create a project from a file or URL, review and edit the source transcript, add one or more target languages, refine translations per segment, and regenerate outputs.
Important: Use the Dubbing Projects API —
elevenlabs.dubbing.project.*in the SDKs, or the/v1/dubbing/projectREST endpoints. Do not use the legacy v1 dubbing surface (client.dubbing.create(),client.dubbing.get(),client.dubbing.audio.get(), or bare/v1/dubbingroutes) — that is the older dubbing API, now under Legacy in the API reference.
Setup: See Installation Guide. The
elevenlabsCLI and the SDKs readELEVENLABS_API_KEYautomatically; REST base URL ishttps://api.elevenlabs.iowith your API key in thexi-api-keyheader.
| Concept | Meaning |
|---|---|
| Project | One source of media (file or URL) plus its source transcript. Prepared (transcribed) once, then rests in ready while you add languages. |
| Source transcript | Editable segments (text, speaker, timing) transcribed from the source. The single source of truth every language is translated from. |
| Language (target) | One dubbed output language. Each has its own transcript (source segments + a translation per segment) and its own dubbed audio output. |
| Revisions | Independent monotonic counters. The project's revision bumps on source-transcript edits; a language's revision bumps on translation edits or source edits that affect it. A language's output_revision is the revision its current audio was generated from — when it's behind revision, the output is out of date. |
Recommended order of operations: finalize the source transcript before adding any languages. Translations are produced from the source, so correcting the source first means every language starts from the right text — editing the source after a language completes marks it stale and requires a (charged) regeneration.
Enterprise: Transcript editing and regeneration are available to enterprise workspaces only. Creating projects, adding languages, and downloading dubs work on all plans.
queuedreadyqueued → processing → completedoutputs.lossless_audio when completedstalecompleted again with fresh outputimport os
import time
import requests
from elevenlabs.client import ElevenLabs
elevenlabs = ElevenLabs(api_key=os.getenv("ELEVENLABS_API_KEY"))
# 1. Create a project from a local file (or pass source_url=... instead of file)
with open("promo.mp4", "rb") as f:
project = elevenlabs.dubbing.project.create(
file=f,
source_language="en",
reference="Q3 marketing video",
)
# 2. Wait for the source media to be transcribed
while True:
project = elevenlabs.dubbing.project.get(project.project_id)
if project.status == "ready":
break
if project.status == "failed":
raise RuntimeError("Project preparation failed")
time.sleep(5)
# 3. Add a Spanish language target
language = elevenlabs.dubbing.project.language.create(
project.project_id,
target_language="es",
)
# 4. Wait for the dub to finish generating
while True:
language = elevenlabs.dubbing.project.language.get(
project.project_id, language.language_id
)
if language.status == "completed":
break
if language.status == "failed":
raise RuntimeError("Dub generation failed")
time.sleep(5)
# 5. Download the dubbed audio (signed URL, valid ~1 hour — re-fetch the language for a fresh one)
audio = requests.get(language.outputs.lossless_audio)
with open("promo_es.wav", "wb") as f:
f.write(audio.content)import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
import { writeFile } from "fs/promises";
const elevenlabs = new ElevenLabsClient();
// 1. Create a project (sourceUrl shown; file upload is also supported)
let project = await elevenlabs.dubbing.project.create({
sourceUrl: "https://example.com/promo.mp4",
sourceLanguage: "en",
reference: "Q3 marketing video",
});
// 2. Wait for the source media to be transcribed
while (true) {
project = await elevenlabs.dubbing.project.get(project.projectId);
if (project.status === "ready") break;
if (project.status === "failed") throw new Error("Project preparation failed");
await new Promise((resolve) => setTimeout(resolve, 5000));
}
// 3. Add a Spanish language target
let language = await elevenlabs.dubbing.project.language.create(project.projectId, {
targetLanguage: "es",
});
// 4. Wait for the dub to finish generating
while (true) {
language = await elevenlabs.dubbing.project.language.get(project.projectId, language.languageId);
if (language.status === "completed") break;
if (language.status === "failed") throw new Error("Dub generation failed");
await new Promise((resolve) => setTimeout(resolve, 5000));
}
// 5. Download the dubbed audio from the signed URL
const response = await fetch(language.outputs!.losslessAudio!);
await writeFile("promo_es.wav", Buffer.from(await response.arrayBuffer()));The elevenlabs CLI reads ELEVENLABS_API_KEY from the environment automatically.
# 1. Create a project (use --source-url "https://..." instead of --file to dub from a URL)
elevenlabs dubbing project create --file promo.mp4 --source-language en
# → {"project_id": "proj_...", "status": "queued", ...}
# 2. Poll until status is "ready"
elevenlabs dubbing project get --project-id proj_...
# 3. Add a target language
elevenlabs dubbing project language create --project-id proj_... --target-language es
# 4. Poll the language until "completed", then download outputs.lossless_audio
elevenlabs dubbing project language get --project-id proj_... --language-id lang_...elevenlabs dubbing project create (REST: POST /v1/dubbing/project, multipart/form-data) takes either file or source_url (not both):
| Field | Required | Notes |
|---|---|---|
file | one of file/source_url | Source media to dub (audio or video), up to 3 GiB |
source_url | one of file/source_url | Public URL to fetch the source media from |
source_language | no | ISO 639 code (e.g. en). Omit to auto-detect — the detected language is reported on the source transcript's language field |
reference | no | Free-form label to identify the project on your end (max 500 chars) |
model_id | no | dubbing_v2 (default) |
target_language | no | Optionally queue the first language target at creation; add more with language.create |
keyterms | no | Terms to bias transcription/translation toward (product/brand names). Up to 1000 terms; each at most 50 chars and 5 words; <>{}[]\ not allowed. Repeat the field once per term in multipart |
Once the project is ready, read the transcript, then correct it before adding languages. Every edit bumps the project's revision. Each segment has a stable id used to edit or delete it. (Enterprise workspaces only.)
# Read the source transcript
transcript = elevenlabs.dubbing.project.transcript.get(project_id)
# Correct a segment's text — send only the fields to change (text, speaker_id, start_s, end_s)
elevenlabs.dubbing.project.transcript.update_segment(
project_id,
segment_id=transcript.segments[0].id,
text="Welcome to our latest product demo.",
)
# Add a segment (reuse an existing speaker_id so it's dubbed with that speaker's voice)
added = elevenlabs.dubbing.project.transcript.create_segment(
project_id,
text="Thanks for watching.",
speaker_id=transcript.segments[0].speaker_id,
start_s=40.0,
end_s=42.0,
)
# Delete a segment
elevenlabs.dubbing.project.transcript.delete_segment(project_id, segment_id=added.segment.id)Via the CLI: elevenlabs dubbing project transcript get --project-id proj_..., then update a segment with only the changed fields (--text, --speaker-id, --start-s, --end-s):
elevenlabs dubbing project transcript update_segment \
--project-id proj_... --segment-id seg_... \
--text "Welcome to our latest product demo."A language's transcript pairs each source segment with its translation (null = not yet translated; segment ids match the source). Edit a single translation, then regenerate. (Enterprise workspaces only.)
# Read the language's translations
target = elevenlabs.dubbing.project.language.transcript.get(project_id, language_id)
# Refine a single translation (pass translation=None to clear it and mark for re-translation)
elevenlabs.dubbing.project.language.transcript.update_segment(
project_id,
language_id,
segment_id=target.segments[0].id,
translation="Bienvenido a nuestra última demostración de producto.",
)
# Regenerate the dub from the current transcript (charged like a generation)
elevenlabs.dubbing.project.language.transcript.regenerate(project_id, language_id)Via the CLI: elevenlabs dubbing project language transcript update_segment --project-id proj_... --language-id lang_... --segment-id seg_... --translation "...", then elevenlabs dubbing project language transcript regenerate --project-id proj_... --language-id lang_... (returns 202 Accepted).
A translation edit affects only that language. After the edit, a completed language becomes stale — it keeps serving its previous output until you regenerate. Poll until completed; output_revision then equals revision and outputs.lossless_audio reflects the current transcript.
Add one language target per language — each generates independently. Track them all with language.list instead of polling one by one:
for lang in ["es", "fr", "de", "ja"]:
elevenlabs.dubbing.project.language.create(project_id, target_language=lang)
while True:
result = elevenlabs.dubbing.project.language.list(project_id)
if not any(l.status in ("queued", "processing") for l in result.languages):
break
time.sleep(5)Project:
| Status | Meaning |
|---|---|
queued | Created; source fetch + preparation enqueued |
preparing | Preparation (transcription) running |
ready | Source transcript available; add/generate languages. Projects stay ready — per-language progress lives on the languages |
failed | Preparation failed (e.g. source couldn't be fetched or decoded) |
Language:
| Status | Meaning |
|---|---|
queued | Waiting on the project becoming ready, or on a generation worker |
processing | The dub is being generated |
completed | Finished; outputs populated with a signed download URL (valid ~1 hour — re-fetch for a fresh one) |
stale | Previously completed, but the transcript changed; keeps the last output until regenerated |
failed | Generation failed |
You can add a language before the project is ready — it stays queued and starts automatically once the project becomes ready. Adding a language accepts optional model_id (defaults to the project's) and voice_settings (e.g. {"cloning_strength": 7}, range 0–10, default 7 — controls how strongly dubbed speakers clone the source voices).
ready or the language isn't settled (e.g. already generating) — wait and retryoutputs.lossless_audio is signed and valid ~1 hour; re-fetch the language for a fresh URL© elevenlabs, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (references) in dubbing of elevenlabs/skills.
Open the folder on GitHubat commit 1d08a4a
Dubbing 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Dubbing this skillelevenlabs/skills | 482 | — | ~3.3k | Automated safety check: Pass | MIT | |
| Video Translatorshang-zhu/violin | 1.1k | — | ~1k | Automated safety check: Notes | MIT | |
| Musictadaspetra/loop | 296 | 2 repos | ~827 | Automated safety check: Pass | MIT | |
| Sound Effectstadaspetra/loop | 296 | 2 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Edu Math Videowy51ai/edulab | 1.4k | — | ~2.5k | Automated safety check: Notes | Apache-2.0 | |
| Elevenlabs Transcribeqdhenry/Claude-Command-Suite | 1.3k | — | ~1.5k | Automated safety check: Notes | None |
shang-zhu/violin
Dub a video into another language and generate subtitles using the default Together + Cartesia stack.
tadaspetra/loop
Generate music using ElevenLabs Music API. An agent skill from tadaspetra/loop.
tadaspetra/loop
Generate sound effects from text descriptions using ElevenLabs.
wy51ai/edulab
A skill your agent uses when asked to make an explainer / walkthrough video (讲解视频、解题视频、例题精讲、微课) for a math problem (数学题, geometry, algebra, functions, motion/行程 problems), from a problem screenshot…
qdhenry/Claude-Command-Suite
Transcribes audio/video files using ElevenLabs Scribe v2 API.
trpc-group/trpc-agent-go
ElevenLabs text-to-speech with mac-style say UX. An agent skill from trpc-group/trpc-agent-go.
elevenlabs/skills
Convert text to speech using ElevenLabs voice AI. An agent skill from elevenlabs/skills.
elevenlabs/skills
Transform the voice in an audio recording into a different target voice while preserving emotion, timing, and delivery using the ElevenLabs Voice Changer (speech-to-speech) API.
elevenlabs/skills
Remove background noise and isolate vocals/speech from audio using ElevenLabs Voice Isolator (audio isolation) API.
elevenlabs/skills
Add real-time voice conversations to a custom agent runtime with ElevenLabs Speech Engine.
elevenlabs/skills
Build voice AI agents with ElevenLabs. An agent skill from elevenlabs/skills.
elevenlabs/skills
Guides users through setting up an ElevenLabs API key for REST API and SDK workflows.
Works with
Categories
Dub audio and video into other languages using the ElevenLabs Dubbing API (dubbingv2), preserving the original speakers' voices. Dubbing is an agent skill from elevenlabs/skills. Dub audio and video into other languages using the ElevenLabs Dubbing API (dubbingv2), preserving the original speakers' voices.
Dubbing fits situations like: translating videos; recordings into other languages; localizing media content; correcting dubbing transcripts and translations.
Run `npx skills add elevenlabs/skills --skill dubbing -a claude-code`. Or copy the skill folder (dubbing in elevenlabs/skills) into .claude/skills/dubbing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add elevenlabs/skills --skill dubbing -a codex`. Or copy the skill folder (dubbing in elevenlabs/skills) into .agents/skills/dubbing in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add elevenlabs/skills --skill dubbing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dubbing, .gemini/skills/dubbing, .github/skills/dubbing and .opencode/skills/dubbing in your project.
Going by SKILL.md and its folder, Dubbing needs credentials named ELEVENLABS_API_KEY. Our summary lists: Python 3; A credential in ELEVENLABS_API_KEY. Compatibility (from SKILL.md): Requires internet access and an ElevenLabs API key (ELEVENLABS_API_KEY)..
SKILL.md names 1 domain. In commands or code: api.elevenlabs.io; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
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.
Dubbing is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.3k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 4.1k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Dubbing: Video Translator (shang-zhu/violin, 1.1k stars), Music (tadaspetra/loop, 296 stars), Sound Effects (tadaspetra/loop, 296 stars) and Edu Math Video (wy51ai/edulab, 1.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
elevenlabs (a GitHub organization) maintains it in elevenlabs/skills, which has 482 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on October 9, 2026.
Source: elevenlabs/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.