Dubbing
ElevenLabsOfficialPublished by ElevenLabs
- Skill
- Tool integration
- Automation and integrations
- MIT
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The ElevenLabs Dubbing skill provides an interface to the Dubbing Projects API (dubbing_v2). It enables users to upload audio or video files, or provide source URLs, to generate localized versions in multiple languages. The process involves creating a project, reviewing and editing the source transcript, adding target languages, and managing translations. It supports programmatic control via Python and JavaScript SDKs or the ElevenLabs CLI, allowing for segment-level transcript editing and regeneration of dubbed outputs.
What it does
- Creates dubbing projects from local media files or public URLs.
- Transcribes source media and allows for manual editing of segments.
- Generates dubbed audio in multiple target languages while preserving original speaker voices.
- Provides tools to refine individual segment translations.
- Supports regeneration of dubbed content after transcript or translation edits.
- Manages project and language states through polling or status checks.
When to use it
- When you need to localize video or audio content into different languages.
- When you require precise control over the source transcript before generating dubs.
- When you need to update or correct specific segments of a translation after an initial generation.
- When automating media localization workflows within a software application.
Advantages
- Preserves original speaker voices across different languages.
- Supports both file uploads and URL-based media sources.
- Allows for granular editing of both source and target transcripts.
- Provides a consistent API for managing complex dubbing workflows.
- Offers CLI and SDK support for integration into existing development environments.
Usage examples
- “Create a new dubbing project from a local video file named promo.mp4.”
- The agent initiates a project creation request using the ElevenLabs SDK, returning a project ID once the media is queued for transcription.
- “Add Spanish as a target language for my existing dubbing project.”
- The agent calls the language creation endpoint for the specified project ID, queuing the Spanish dubbing process.
- “Update the text of a specific segment in my source transcript.”
- The agent uses the transcript update endpoint to modify the text for the given segment ID, bumping the project revision.
- “Regenerate the dubbed audio for a language after editing its translation.”
- The agent triggers the regeneration endpoint for the specific language, which processes the updated transcript and produces a new audio output.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/elevenlabs/dubbing/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip dubbing.zip -d .agents/skills
Documentation by ElevenLabs
ElevenLabs Dubbing
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, before writing any code: if
ELEVENLABS_API_KEYisn't set for this project, runnpx -y @elevenlabs/cli@latest onboard initfrom the app's folder first and follow what it prints: it signs the user in and stores a key for the project, so nobody copies one by hand. Otherwise see the Installation Guide. TheelevenlabsCLI and the SDKs readELEVENLABS_API_KEYautomatically; REST base URL ishttps://api.elevenlabs.iowith your API key in thexi-api-keyheader.
Concepts
| 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.
Workflow
Create the project from a file or URL →
queuedPoll the project until
readyReview and finalize the source transcript (edit/add/delete segments)
Add one language per target →
queued→processing→completedDownload each language's
outputs.lossless_audiowhencompletedRefine translations per segment if needed → the language goes
staleRegenerate the language →
completedagain with fresh output
Quick Start (Python)
import 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)Quick Start (JavaScript)
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()));Quick Start (CLI)
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_...Create Options
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 |
Editing the Source Transcript
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."Refining Translations and Regenerating
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.
Dubbing into Multiple Languages
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)States
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).
Error Handling
401: Invalid API key
409 Conflict on regenerate: The project isn't
readyor the language isn't settled (e.g. already generating) — wait and retryExpired download URL:
outputs.lossless_audiois signed and valid ~1 hour; re-fetch the language for a fresh URLTranscript editing / regeneration unavailable: These endpoints are enterprise-only — on other plans, create the project with a finalized source and add languages directly
References
API Reference — every endpoint with full request/response schemas and SDK method names
Files
- ATTRIBUTION.mdAdded by AutoGineer798 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md13.1 KiB
- references/api-reference.md13.7 KiB
- references/installation.md2.8 KiB
references/api-reference.md
Dubbing Projects API Reference
Full endpoint-by-endpoint reference for the Dubbing Projects API.
Base URL:
https://api.elevenlabs.ioAuthentication:
xi-api-keyheader on every request (the SDKs readELEVENLABS_API_KEY)SDK:
elevenlabs.dubbing.project.*in Python and JavaScript (camelCase methods in JS). The olderclient.dubbing.*methods are the legacy v1 API — do not use themModel:
dubbing_v2(default)Source size limit: up to 3 GiB per source (upload or URL)
Enterprise: transcript editing and regeneration endpoints are available to enterprise workspaces only
Contents
Endpoint quick reference
Projects
Source transcript
Languages
Language transcript (translations)
Regeneration
Revisions
Endpoint quick reference
| Method | Path | Python SDK method | Purpose |
|---|---|---|---|
| POST | /v1/dubbing/project | dubbing.project.create | Create a project (file or URL) |
| GET | /v1/dubbing/project | dubbing.project.list | List projects (paginated) |
| GET | /v1/dubbing/project/{project_id} | dubbing.project.get | Get a project |
| DELETE | /v1/dubbing/project/{project_id} | dubbing.project.delete | Delete a project and its languages |
| GET | /v1/dubbing/project/{project_id}/transcript | dubbing.project.transcript.get | Get the source transcript |
| PATCH | /v1/dubbing/project/{project_id}/transcript/segment/{segment_id} | dubbing.project.transcript.update_segment | Edit a source segment |
| POST | /v1/dubbing/project/{project_id}/transcript/segment | dubbing.project.transcript.create_segment | Add a source segment |
| DELETE | /v1/dubbing/project/{project_id}/transcript/segment/{segment_id} | dubbing.project.transcript.delete_segment | Delete a source segment |
| POST | /v1/dubbing/project/{project_id}/language | dubbing.project.language.create | Add a language target |
| GET | /v1/dubbing/project/{project_id}/language | dubbing.project.language.list | List language targets (paginated) |
| GET | /v1/dubbing/project/{project_id}/language/{language_id} | dubbing.project.language.get | Get a language target |
| DELETE | /v1/dubbing/project/{project_id}/language/{language_id} | dubbing.project.language.delete | Delete a language target |
| GET | /v1/dubbing/project/{project_id}/language/{language_id}/transcript | dubbing.project.language.transcript.get | Get a language's transcript (translations) |
| PATCH | /v1/dubbing/project/{project_id}/language/{language_id}/transcript/segment/{segment_id} | dubbing.project.language.transcript.update_segment | Edit a translation |
| POST | /v1/dubbing/project/{project_id}/language/{language_id}/transcript/regenerate | dubbing.project.language.transcript.regenerate | Regenerate a language from its edited transcript |
JS methods are the same paths in camelCase (e.g. dubbing.project.transcript.updateSegment).
Projects
Create a project
POST /v1/dubbing/project — multipart/form-data with either file or source_url (not both).
| Field | Required | Notes |
|---|---|---|
file | one of file/source_url | The source media to dub (audio or video) |
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 |
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 (e.g. product or brand names), up to 1000 terms; each at most 50 characters and 5 words; <>{}[]\ not allowed. In multipart, repeat the field once per term |
Auto-detected source language: if source_language is omitted, the project's source_language stays null; the detected language is reported as the language field on the source transcript.
Response (201 Created) — the project starts in queued; media is null until preparation finishes:
{
"project_id": "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3",
"status": "queued",
"reference": "Q3 marketing video",
"source_language": "en",
"model_id": "dubbing_v2",
"media": null,
"language_ids": [],
"revision": 0,
"created_at": "2026-07-03T10:15:30Z",
"updated_at": "2026-07-03T10:15:30Z"
}The source is fetched (for a URL) and transcribed asynchronously — poll the project until it reaches ready.
Get a project
GET /v1/dubbing/project/{project_id}
Once ready, media is populated:
{
"project_id": "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3",
"status": "ready",
"reference": "Q3 marketing video",
"source_language": "en",
"model_id": "dubbing_v2",
"media": {
"filename": "promo.mp4",
"duration_s": 42.5,
"has_video": true,
"mime_type": "video/mp4"
},
"language_ids": [],
"revision": 0,
"created_at": "2026-07-03T10:15:30Z",
"updated_at": "2026-07-03T10:17:12Z"
}language_ids stays empty until languages are added; revision stays 0 until the source transcript is edited (transcription itself doesn't bump it).
Project states:
| Status | Meaning |
|---|---|
queued | Created; the source is being fetched and preparation is enqueued, but no worker has started it yet |
preparing | Preparation tasks are running |
ready | Preparation finished. The source transcript is available and languages can be added/generated. A project stays at ready — per-language progress lives on the languages |
failed | Preparation failed (e.g. the source couldn't be fetched or decoded) |
List projects
GET /v1/dubbing/project — cursor-paginated.
Query params: page_size (default 20, max 100), cursor, status (queued/preparing/ready/failed), sort_direction (DESCENDING default).
{ "projects": [ /* ProjectResponse... */ ], "next_cursor": null }Pass next_cursor back as cursor to fetch the next page; null means the end.
Delete a project
DELETE /v1/dubbing/project/{project_id} — deletes the project and its languages.
Source transcript
Transcript editing (and regeneration) is available to enterprise workspaces only. Every source edit bumps the project's revision; each edit response returns the new value. Editing the source after a language exists marks that language's output stale and requires a regeneration — finalize the source before adding languages.
Get the source transcript
GET /v1/dubbing/project/{project_id}/transcript
{
"language": "en",
"segments": [
{
"id": "0199a3f0-1c2d-7abc-8def-0123456789ab",
"text": "Welcome to our product demo.",
"speaker_id": "default_speaker",
"start_s": 0.0,
"end_s": 2.5
}
],
"revision": 0
}Each segment has a stable id used to edit or delete it.
Edit a segment
PATCH /v1/dubbing/project/{project_id}/transcript/segment/{segment_id}
Send only the fields to change (text, speaker_id, start_s, end_s); at least one is required. If sending both start_s and end_s, end_s must be greater than start_s.
{
"segment": {
"id": "0199a3f0-1c2d-7abc-8def-0123456789ab",
"text": "Welcome to our latest product demo.",
"speaker_id": "default_speaker",
"start_s": 0.0,
"end_s": 2.5
},
"revision": 1
}Add a segment
POST /v1/dubbing/project/{project_id}/transcript/segment
All fields required (text, speaker_id, start_s, end_s). The server assigns the segment id. Use a speaker_id that already appears in the source transcript so the new line is dubbed with that speaker's voice.
The response echoes the new segment with its server-assigned id plus the new project revision.
Delete a segment
DELETE /v1/dubbing/project/{project_id}/transcript/segment/{segment_id}
{ "revision": 3 }Languages
Add a language
POST /v1/dubbing/project/{project_id}/language
JSON body:
| Field | Required | Notes |
|---|---|---|
target_language | yes | ISO 639 code (e.g. es) |
model_id | no | Defaults to the project's model |
voice_settings | no | e.g. {"cloning_strength": 7} — cloning_strength accepts values between 0 and 10 inclusive (default 7); controls how strongly dubbed speakers clone the source voices |
Response (201 Created) — starts queued:
{
"language_id": "lang_1001kwkyxp0je6ktn4knsfrasx5s",
"project_id": "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3",
"target_language": "es",
"status": "queued",
"model_id": "dubbing_v2",
"outputs": null,
"revision": 0,
"output_revision": null,
"created_at": "2026-07-03T10:16:00Z",
"updated_at": "2026-07-03T10:16:00Z"
}A language can be added to a project that isn't ready yet — it stays queued and starts automatically once the project becomes ready. You can also queue the first language when creating the project by passing target_language to project.create.
Language states:
| Status | Meaning |
|---|---|
queued | Created and waiting — either on the project becoming ready, or on a worker to pick up its generation |
processing | The dub is being generated |
completed | The dub finished; outputs is populated |
stale | Previously completed, but its transcript (source or translation) changed, so the current output no longer matches. It keeps its last output until regenerated |
failed | Generation failed |
Get a language
GET /v1/dubbing/project/{project_id}/language/{language_id}
Once completed, outputs carries signed, time-limited download URLs (valid ~1 hour; re-fetch the language for a fresh URL): lossless_audio for the dubbed audio and subtitles for the translated lines as WebVTT subtitles timed to the source speech (null when none are available):
{
"language_id": "lang_1001kwkyxp0je6ktn4knsfrasx5s",
"project_id": "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3",
"target_language": "es",
"status": "completed",
"model_id": "dubbing_v2",
"outputs": {
"lossless_audio": "https://storage.googleapis.com/eleven-dubbing/.../output.wav?X-Goog-Signature=...",
"subtitles": "<signed WebVTT URL>"
},
"revision": 0,
"output_revision": 0,
"created_at": "2026-07-03T10:16:00Z",
"updated_at": "2026-07-03T10:20:45Z"
}When output_revision equals revision, the downloadable output reflects the current transcript. When it's behind (and status is stale), the output is out of date and needs a regeneration.
List languages
GET /v1/dubbing/project/{project_id}/language — cursor-paginated, optional status filter.
Delete a language
DELETE /v1/dubbing/project/{project_id}/language/{language_id} → 204 No Content.
Language transcript (translations)
Get a language's transcript
GET /v1/dubbing/project/{project_id}/language/{language_id}/transcript
Pairs each source segment with its translation (null = not yet translated). Segment ids match the source transcript, so translations line up against the source.
{
"source_language": "en",
"target_language": "es",
"segments": [
{
"id": "0199a3f0-1c2d-7abc-8def-0123456789ab",
"speaker_id": "default_speaker",
"start_s": 0.0,
"end_s": 2.5,
"source_text": "Welcome to our latest product demo.",
"translation": "Bienvenido a la demostración de nuestro producto."
}
],
"revision": 0
}Edit a translation
PATCH /v1/dubbing/project/{project_id}/language/{language_id}/transcript/segment/{segment_id}
Body: {"translation": "..."}. Pass null to clear it and mark the segment for re-translation.
A translation edit affects only this language — the source transcript and other languages are untouched. It bumps this language's revision, and a completed language becomes stale: its downloadable output still reflects the previous output_revision until regenerated.
Regeneration
POST /v1/dubbing/project/{project_id}/language/{language_id}/transcript/regenerate
Produces a fresh dub from the current transcript after editing a language's translation (or after source edits marked it stale). Charged like a generation.
Response (202 Accepted) — the language goes back to queued; output_revision still points at the previous output until the new one finishes:
{
"language_id": "lang_1001kwkyxp0je6ktn4knsfrasx5s",
"project_id": "proj_1601kwkyxp0hfzvtmyxwqxx6mcy3",
"target_language": "es",
"status": "queued",
"model_id": "dubbing_v2",
"outputs": null,
"revision": 1,
"output_revision": 0,
"created_at": "2026-07-03T10:16:00Z",
"updated_at": "2026-07-03T10:25:10Z"
}Poll the language until completed, then download the refreshed outputs.lossless_audio. At that point output_revision equals revision.
Returns 409 Conflict if the project isn't ready or the language isn't in a settled state (e.g. it's already generating).
Revisions
Every project and language carries its own monotonic revision counter, each starting at 0 and independent of the others:
The project's
revisionincreases on each source-transcript edit (transcription itself doesn't bump it).A language's
revisionstarts at 0 when the language is created — it does not inherit the project's current revision — and increases when its translation is edited or when a source edit affects it.A language's
output_revisionis the revision its current audio was generated from. Whenoutput_revisionis behindrevision, the output is out of date and needs a regeneration.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an API key, Needs Python, Needs Node.js
The author says: Requires internet access and an ElevenLabs API key (ELEVENLABS_API_KEY).
Security
What our scanner noticed· Medium risk
- Instructions that use the network
- Downloads piped into a shell
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- ElevenLabs
- Publisher
- ElevenLabs (Official)
- Source
- elevenlabs/skills · dubbing · commit 9763c39
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by ElevenLabs or ElevenLabs.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download dubbing.zip