Vídeo com IA: Claude Code, Codex e ElevenLabs · Capítulo 18 de 25 · 27 min
Dublar o vídeo e compor trilha e efeitos com licença registrada
Duble o vídeo com Dubbing v2 e componha trilha com Eleven Music e efeitos sonoros por API para mixar com ducking e guardar a licença de cada arquivo de áudio.
Este capítulo faz parte do curso gratuito Vídeo com IA: Claude Code, Codex e ElevenLabs.
Dublagem, trilha e efeito sonoro parecem um pacote só, mas são três trabalhos com preço, limite e licença diferentes. Misturar tudo num único passo esconde onde está o custo e torna impossível refazer só a parte que saiu errada, como uma trilha alta demais por baixo da fala.
Errar aqui custa em duas moedas. Em dinheiro, porque criar um projeto de dublagem já cobra no mínimo um idioma de destino; em direito, porque uma trilha gerada com o modelo errado, com o nome de um artista no prompt ou publicada no destino que os termos excluem vira problema depois que o vídeo está no ar.
Nesta aula você dubla o vídeo com o Dubbing v2, compõe uma trilha instrumental com o Eleven Music e gera um efeito sonoro, cada um num script próprio que estima o custo e registra modelo e prompt. No fim, mixa tudo com ducking, a técnica que abaixa a trilha enquanto alguém fala, e troca o áudio do vídeo sem reencodar a imagem.
Separe dublagem, trilha e efeito e confira preço e licença
Cada serviço tem um modelo, um limite e uma tarifa na API. Planeje por eles, e não pela promessa de “áudio completo”: o Dubbing v2 devolve o áudio dublado, não um vídeo montado; o Eleven Music devolve uma faixa; o efeito sonoro devolve um clipe curto. Quem junta tudo é o FFmpeg, no último passo.
Três serviços de áudio da ElevenLabs em 09/10/2026
| Serviço e modelo | Limite que importa | Preço na API |
|---|---|---|
| Dublagem, dubbing_v2 | Origem de até 3 GiB pela API; criar o projeto cobra no mínimo um idioma | US$ 2,20 por minuto |
| Música, music_v2_5 | 3 s a 10 min por pedido, com prompt ou com plano de composição | US$ 0,15 por minuto |
| Efeito sonoro, eleven_text_to_sound_v2 | 0,5 a 30 s por geração, com opção de loop | US$ 0,12 por minuto |
O FAQ da página de preços ainda cita US$ 0,33 e US$ 0,50 por minuto, que são do Dubbing v1; para o v2 vale a tabela, US$ 2,20.
Fonte: ElevenLabs, preços da API e páginas de capacidades de dublagem, música e efeitos, 09/10/2026
Duble o vídeo com o Dubbing v2
O Dubbing v2 chegou à API em 10/08/2026 e trabalha por projeto: POST /v1/dubbing/project recebe o arquivo (ou um source_url) e o idioma de origem, e cada idioma de destino entra depois por POST /v1/dubbing/project/{project_id}/language. O model_id aceita dubbing_v1 ou dubbing_v2, o v2 é o padrão e fica fixo na criação. Jobs falhos do v2 não são cobrados, mas a criação do projeto já cobra um idioma, por isso o script pede autorização antes do primeiro POST.
O idioma passa pelos estados queued, processing, completed, stale e failed, e o resultado sai em outputs.lossless_audio, uma URL assinada para um arquivo FLAC que expira uma hora depois de emitida: baixe na hora e não grave a URL no log (se ela vencer, consultar o idioma de novo devolve outra). Os idiomas seguem a etiqueta BCP-47: es ou es-MX para espanhol, e pt-BR quando o destino é português do Brasil; uma etiqueta com região só vale se o dialeto estiver na lista do Dubbing v2. Editar a transcrição e regenerar o áudio do v2 pela API exige plano Enterprise; fora dele, a correção de uma fala é refazer o idioma. A espera por status usa o mesmo padrão de consulta periódica da aula 21, e guardar os ids para retomar segue a aula 23.

Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
# scripts/dublar.py: dubla renders/entrada.mp4 com Dubbing v2 (SDK 2.71.0).
# Uso: DUB_DESTINO=es-MX python scripts/dublar.py (o destino vem do ambiente)
import json
import os
import time
import urllib.request
from pathlib import Path
from elevenlabs.client import ElevenLabs
ENTRADA = Path("renders/entrada.mp4")
ORIGEM = "pt" # etiqueta BCP-47 do áudio original
DESTINO = os.environ["DUB_DESTINO"] # BCP-47: es, es-MX; pt-BR quando o original for de outro idioma
PRECO_MIN = 2.20 # US$ por minuto no Dubbing v2, 09/10/2026
estado_path = Path(f"logs/dublagem_{DESTINO}.json")
saida = Path(f"audio/dublagem_{DESTINO}.flac") # lossless_audio chega em FLAC
Path("logs").mkdir(exist_ok=True)
Path("audio").mkdir(exist_ok=True)
if saida.exists():
raise SystemExit(f"{saida} já existe. Ouça antes de dublar de novo.")
estado = json.loads(estado_path.read_text(encoding="utf-8")) if estado_path.exists() else {}
def salvar():
estado_path.write_text(json.dumps(estado, indent=2), encoding="utf-8")
def esperar(consultar, pronto, intervalo, limite_s=1800):
fim = time.monotonic() + limite_s # prazo local do laboratório, não SLA do fornecedor
while time.monotonic() < fim:
obj = consultar()
print("status:", obj.status)
if obj.status == pronto:
return obj
if obj.status in ("failed", "stale"):
raise SystemExit(f"Parado em {obj.status}. Diagnostique antes de recriar.")
time.sleep(intervalo)
raise SystemExit("Prazo local esgotado. Rode de novo: os ids salvos retomam a espera.")
cliente = ElevenLabs()
if "project_id" not in estado:
import subprocess
seg = float(subprocess.run(["ffprobe", "-v", "error", "-show_entries", "format=duration",
"-of", "csv=p=0", str(ENTRADA)], capture_output=True, text=True,
check=True).stdout)
print(f"{seg / 60:.1f} min, estimativa US$ {seg / 60 * PRECO_MIN:.2f} por idioma.")
print("Criar o projeto já cobra no mínimo um idioma de destino.")
if input("Autoriza criar o projeto pago? Digite SIM: ").strip() != "SIM":
raise SystemExit("Cancelado.")
with ENTRADA.open("rb") as video:
projeto = cliente.dubbing.project.create(
file=video,
source_language=ORIGEM,
model_id="dubbing_v2", # fica fixo na criação
reference="Cozinha da Rafa - vídeo longo", # rótulo livre de até 500 caracteres
)
estado["project_id"] = projeto.project_id
salvar()
pid = estado["project_id"]
esperar(lambda: cliente.dubbing.project.get(project_id=pid), "ready", 10)
if "language_id" not in estado:
idioma = cliente.dubbing.project.language.create(project_id=pid, target_language=DESTINO)
estado["language_id"] = idioma.language_id
salvar()
resultado = esperar(lambda: cliente.dubbing.project.language.get(
project_id=pid, language_id=estado["language_id"]), "completed", 15)
# A URL assinada expira 1 h depois de emitida: baixa já e não registra a URL.
temporario = saida.with_suffix(".part")
with urllib.request.urlopen(resultado.outputs.lossless_audio, timeout=120) as r, temporario.open("wb") as f:
while bloco := r.read(1 << 20):
f.write(bloco)
if temporario.stat().st_size == 0:
raise SystemExit("Download vazio.")
temporario.replace(saida)
print(f"Áudio dublado em {saida}. Ouça antes de mixar.")Ouça a saída antes de pensar em trilha. O áudio do Dubbing pode trazer a música e a ambiência do original junto com a voz traduzida; se trouxer, somar outra trilha duplica elementos. E peça a revisão de alguém que fala o idioma de destino: o modelo preserva emoção e ritmo, mas quem aprova a tradução é uma pessoa.
Componha a trilha e os efeitos com model_id explícito
O music_v2_5 saiu em 11/09/2026 e ganhou suporte na API em 14/09/2026. A documentação lida em 12/10/2026 não diz qual modelo a rota POST /v1/music usa quando o pedido omite o model_id; passe model_id="music_v2_5" sempre e tire a dúvida do caminho. Pela API, um pedido com prompt e music_length_ms gera de 3 segundos a 10 minutos; o plano de composição, um roteiro da música em trechos, tem o mesmo teto de 10 minutos no total, com até 30 trechos de 3 a 120 segundos cada e, desde 14/09/2026, limites de texto: cada trecho aceita até 6.132 caracteres em até 30 linhas de 200, e o nome da seção vai de 1 a 100 caracteres. A documentação cita inglês, espanhol, alemão e japonês como idiomas de letra e não nomeia o português, então o exercício usa force_instrumental.
O efeito sonoro sai de POST /v1/sound-generation com o modelo eleven_text_to_sound_v2: duration_seconds entre 0,5 e 30, loop para ambiências que se repetem sem emenda e prompt_influence de 0 a 1 (padrão 0,3), que define quanto o resultado obedece ao texto. Os efeitos são livres de royalties; isso não dispensa você de cumprir os termos de uso.
Trilha instrumental e efeito sonoro por API
Python
Um script gera a trilha de 60 segundos, o som da colher e a ambiência em loop, e grava modelo, prompt e estimativa em logs/ativos_sonoros.json, que é a prova de origem de cada arquivo.

Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
# scripts/gerar_som.py: trilha com music_v2_5 e efeitos com eleven_text_to_sound_v2.
import json
from datetime import date
from pathlib import Path
from elevenlabs.client import ElevenLabs
ATIVOS = {
"audio/trilha.mp3": {
"servico": "music", "modelo": "music_v2_5", "duracao_s": 60,
# Sem nome de artista, música, álbum, gravadora ou letra existente.
"prompt": "Trilha instrumental acolhedora para receita caseira, violão suave, "
"percussão leve com zabumba, 95 BPM, clima de cozinha de domingo, sem voz",
},
"audio/colher.mp3": {
"servico": "sfx", "modelo": "eleven_text_to_sound_v2", "duracao_s": 1.2,
"prompt": "Wooden spoon tapping a ceramic bowl twice, close, dry, no reverb",
},
"audio/ambiente_loop.mp3": {
"servico": "sfx", "modelo": "eleven_text_to_sound_v2", "duracao_s": 10, "loop": True,
"prompt": "Quiet home kitchen ambience, soft simmering pot, distant street",
},
}
PRECO = {"music": 0.15, "sfx": 0.12} # US$ por minuto, 09/10/2026
pendentes = {k: v for k, v in ATIVOS.items() if not Path(k).exists()}
custo = sum(v["duracao_s"] / 60 * PRECO[v["servico"]] for v in pendentes.values())
print(f"{len(pendentes)} arquivos, estimativa US$ {custo:.4f}")
if not pendentes or input("Plano pago e termos conferidos? Digite SIM: ").strip() != "SIM":
raise SystemExit("Nada a gerar ou cancelado.")
cliente = ElevenLabs()
Path("audio").mkdir(exist_ok=True)
for caminho, a in pendentes.items():
if a["servico"] == "music":
fluxo = cliente.music.compose(
model_id="music_v2_5", # explícito: não dependa do padrão da rota
prompt=a["prompt"],
music_length_ms=a["duracao_s"] * 1000,
force_instrumental=True,
)
else:
fluxo = cliente.text_to_sound_effects.convert(
model_id="eleven_text_to_sound_v2",
text=a["prompt"],
duration_seconds=a["duracao_s"],
prompt_influence=0.6, # obedece mais ao texto que o padrão 0,3
loop=a.get("loop", False),
)
Path(caminho).write_bytes(b"".join(fluxo))
print("OK", caminho)
registro = Path("logs/ativos_sonoros.json")
registro_de_versoes = json.loads(registro.read_text(encoding="utf-8")) if registro.exists() else []
registro_de_versoes += [{"arquivo": k, **v, "gerado_em": date.today().isoformat(),
"plano": "Starter ou superior (uso comercial)"} for k, v in pendentes.items()]
Path("logs").mkdir(exist_ok=True)
registro.write_text(json.dumps(registro_de_versoes, ensure_ascii=False, indent=2), encoding="utf-8")curl
As mesmas duas rotas pela API direta, úteis para testar um prompt antes de colocá-lo no script.
#!/usr/bin/env bash
set -euo pipefail
: "$ELEVENLABS_API_KEY"
mkdir -p audio
# Trilha: model_id explícito, instrumental, 60 s.
curl --fail-with-body -sS -X POST "https://api.elevenlabs.io/v1/music" \
-H "xi-api-key: $ELEVENLABS_API_KEY" -H "Content-Type: application/json" \
--data '{
"model_id": "music_v2_5",
"prompt": "Trilha instrumental acolhedora para receita caseira, violão suave, percussão leve, 95 BPM, sem voz",
"music_length_ms": 60000,
"force_instrumental": true
}' -o audio/trilha.mp3
# Efeito: 1,2 s, sem loop, mais fiel ao texto.
curl --fail-with-body -sS -X POST "https://api.elevenlabs.io/v1/sound-generation" \
-H "xi-api-key: $ELEVENLABS_API_KEY" -H "Content-Type: application/json" \
--data '{
"model_id": "eleven_text_to_sound_v2",
"text": "Wooden spoon tapping a ceramic bowl twice, close, dry, no reverb",
"duration_seconds": 1.2,
"prompt_influence": 0.6,
"loop": false
}' -o audio/colher.mp3
for f in audio/trilha.mp3 audio/colher.mp3; do
printf '%s ' "$f"; ffprobe -v error -show_entries format=duration -of csv=p=0 "$f"
doneMúsica gerada tem uso comercial com limites
Use o Eleven Music em vídeos de canal a partir do Starter e registre modelo, prompt e plano de cada faixa.
- A Music API só funciona em plano pago; uso comercial a partir do Starter.
- Planos self-serve e o Enterprise Music Lite excluem cinema, TV, rádio e Studio Games; só o Enterprise Music libera esses usos.
- Prompt sem artista, compositor, música, álbum, gravadora ou letra existente.
- Publicar a faixa em plataforma de streaming de música, como Spotify ou Apple Music, é proibido no Free e no Starter e permitido do Creator para cima.
- O acordo da ElevenLabs com a Universal Music, de 10/09/2026, cria uma plataforma separada, com artistas que aderirem; não licencia catálogo para a Music API, e o app bloqueia o download de faixas feitas sobre músicas de outros artistas.
O teste: Para cada trilha do vídeo, você mostra o JSON com modelo, prompt, data e plano.
alexandrecaramaschi.com/educacao/frontends-com-vibecoding
Mixe com ducking e remonte o vídeo
Ducking é a trilha que abaixa sozinha quando alguém fala e volta nas pausas, como o garçom que baixa a voz quando o cliente começa a pedir. No FFmpeg, isso é o filtro sidechaincompress: a voz entra como chave (o sidechain) e comanda a compressão da trilha. É melhor que um volume fixo, porque a trilha pode respirar nos intervalos sem brigar com a fala. Os parâmetros abaixo são ponto de partida do curso: threshold baixo para a trilha reagir a qualquer fala, ratio 8 para uma queda clara, attack de 20 ms e release de 400 ms para a volta não soar como um soco.
O adelay posiciona o som da colher no segundo 12, quando a imagem mostra a colher na tigela; som que não corresponde à ação distrai. A normalização final com loudnorm e a troca de faixa com -c:v copy são os comandos de base da aula 04, aplicados aqui no fim da cadeia.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
#!/usr/bin/env bash
# bash scripts/mixar.sh es-MX (o argumento escolhe audio/dublagem_<destino>.flac)
set -euo pipefail
DESTINO="$1"
VOZ="audio/dublagem_$DESTINO.flac"
mkdir -p renders
for f in renders/entrada.mp4 "$VOZ" audio/trilha.mp3 audio/colher.mp3; do test -f "$f"; done
# Tudo em 48 kHz estéreo antes de somar.
F="[0:a]aformat=sample_rates=48000:channel_layouts=stereo,asplit=2[voz][chave];"
F+="[1:a]aformat=sample_rates=48000:channel_layouts=stereo,volume=0.5[trilha];"
# Ducking: a voz (chave) comprime a trilha enquanto há fala.
F+="[trilha][chave]sidechaincompress=threshold=0.03:ratio=8:attack=20:release=400[trilha_baixa];"
# Efeito no segundo 12 (12000 ms em cada canal), quando a colher aparece.
F+="[2:a]aformat=sample_rates=48000:channel_layouts=stereo,adelay=12000|12000,volume=0.7[efeito];"
# Soma com a duração da voz e normaliza (loudnorm, aula 04).
F+="[voz][trilha_baixa][efeito]amix=inputs=3:duration=first:normalize=0,"
F+="loudnorm=I=-14:TP=-1.5:LRA=11[mix]"
ffmpeg -nostdin -y -i "$VOZ" -stream_loop -1 -i audio/trilha.mp3 -i audio/colher.mp3 \
-filter_complex "$F" -map "[mix]" -c:a pcm_s16le audio/mix_$DESTINO.wav
# Troca o áudio do vídeo sem reencodar a imagem.
ffmpeg -nostdin -y -i renders/entrada.mp4 -i audio/mix_$DESTINO.wav \
-map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -b:a 192k -movflags +faststart \
renders/dublado_$DESTINO.mp4
# As duas durações devem ser próximas; diferença grande indica fala cortada no fim.
for f in renders/entrada.mp4 renders/dublado_$DESTINO.mp4; do
printf '%s ' "$f"; ffprobe -v error -show_entries format=duration -of csv=p=0 "$f"
doneDa dublagem à versão final
Siga os oito passos
Versão dublada e mixada em oito passos
Cada arquivo de áudio é aprovado sozinho antes de entrar na mixagem.
Passo 1: Confira os direitos do vídeo, da voz e do destino
O destino comercial decide se o plano self-serve cobre a música.
Deu certo quando: O registro associa cada ativo à finalidade e ao canal aprovados.
Erro comum: Achar que um plano pago libera qualquer material de terceiros.
Passo 2: Meça a duração e estime a dublagem
O scripts/dublar.py lê a duração com ffprobe antes de pedir autorização.
Deu certo quando: O orçamento usa US$ 2,20 por minuto, a tarifa do v2.
Erro comum: Orçar com US$ 0,33 ou US$ 0,50 por minuto, que são do v1.
Passo 3: Defina o código do idioma de destino
A dublagem usa etiqueta BCP-47 (es, es-MX, pt-BR); o TTS usa pt e o Scribe aceita pt ou por.
Deu certo quando: DUB_DESTINO tem um código aceito pela API.
Erro comum: Passar o código de três letras do Scribe ou um dialeto que a lista do Dubbing v2 não traz.
Passo 4: Crie o projeto e guarde os ids
project_id e language_id ficam em logs/ para retomar a espera.
Deu certo quando: Rodar o script de novo retoma a consulta em vez de criar outro projeto.
Erro comum: Imaginar que criar o projeto é gratuito.
Passo 5: Baixe o áudio assim que o idioma ficar completed
A URL de lossless_audio expira em cerca de uma hora.
Deu certo quando: O FLAC existe em audio/ e o log não guarda a URL.
Erro comum: Guardar só a URL e voltar no dia seguinte.
Passo 6: Peça a revisão da tradução a quem fala o idioma
Correção pela API exige Enterprise; fora dele, refaça o idioma.
Deu certo quando: Uma pessoa fluente aprova a fala por escrito.
Erro comum: Prometer edição e regeneração por API sem plano Enterprise.
Passo 7: Gere e ouça a trilha e o efeito
music_v2_5 explícito, prompt sem artista nem obra, efeito curto.
Deu certo quando: logs/ativos_sonoros.json traz modelo, prompt e plano de cada arquivo.
Erro comum: Omitir o model_id e descobrir depois qual modelo gerou a faixa.
Passo 8: Mixe com ducking e revise o vídeo inteiro
Ouça do começo ao fim, com fone e com o alto-falante do celular.
Deu certo quando: A fala é clara, a trilha volta nas pausas e o final não foi cortado.
Erro comum: Somar trilha nova sobre uma dublagem que já trazia música.
No fim você tem: Um MP4 dublado com trilha em ducking, efeito no tempo certo e licença registrada.
Proteja os nomes e troque a consulta pelo webhook
Desde 21/09/2026, POST /v1/dubbing/project aceita dois campos que o scripts/dublar.py acima ainda não usa. O primeiro é keyterms: até 1.000 termos, cada um com até 50 caracteres e cinco palavras, que a transcrição da dublagem deve reconhecer; são os mesmos nomes de receita e de marca que o Scribe protege na aula 17, e “bolo de rolo” traduzido como um doce qualquer é o erro que eles evitam. O segundo é webhook_ids: até três ids de webhooks cadastrados na conta, que recebem um POST quando o estado de um idioma muda. Com ele, o script deixa de perguntar o status a cada 15 segundos e espera ser avisado.
O webhook pede um tratamento idempotente, a regra da aula 23: o aviso pode chegar duas vezes, então o receptor baixa o FLAC só se ele ainda não existe. E confira o campo warnings da resposta de criação: se vier voices_not_permitted, uma voz do original não pôde ser usada e uma substituta entrou; decida se aceita antes de pagar outro idioma. Deu certo quando o idioma fica completed, o aviso chega e o FLAC aparece sem nenhuma consulta no log; o erro comum é cadastrar o webhook e manter o laço de consulta, pagando duas vezes a mesma espera. Se o projeto é de uma vez, a consulta periódica basta; se roda toda semana, webhook.
# Substitui a criação do projeto no scripts/dublar.py (SDK 2.71.0).
KEYTERMS = ["Cozinha da Rafa", "bolo de rolo", "mise en place"] # até 1.000, 50 caracteres e 5 palavras cada
WEBHOOKS = [w for w in os.environ.get("ELEVENLABS_WEBHOOK_IDS", "").split(",") if w][:3]
with ENTRADA.open("rb") as video:
projeto = cliente.dubbing.project.create(
file=video,
source_language=ORIGEM,
model_id="dubbing_v2",
reference="Cozinha da Rafa - vídeo longo",
keyterms=KEYTERMS,
webhook_ids=WEBHOOKS or None, # sem webhook cadastrado, o script volta à consulta periódica
)
avisos = getattr(projeto, "warnings", None) or []
if any("voices_not_permitted" in str(a) for a in avisos):
print("Aviso: uma voz do original não pôde ser usada; entrou uma substituta.")
if input("Seguir mesmo assim? Digite SIM: ").strip() != "SIM":
raise SystemExit("Projeto criado e pago; nenhum idioma adicionado.")
estado["project_id"] = projeto.project_id
salvar()
# Receptor do webhook (qualquer servidor HTTP seu): idempotente, baixa só o que falta.
def ao_receber_webhook(corpo: dict) -> None:
if corpo.get("status") != "completed":
return
destino = Path(f"audio/dublagem_{corpo['target_language']}.flac")
if destino.exists(): # o aviso pode chegar duas vezes
return
idioma = cliente.dubbing.project.language.get(
project_id=corpo["project_id"], language_id=corpo["language_id"])
baixar(idioma.outputs.lossless_audio, destino) # a mesma rotina de download do scriptSe a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Decida entre o Studio 4.0 e o script
Em 21/09/2026 a ElevenLabs lançou o Studio 4.0, um editor de vídeo no app web com o Studio Agent: você descreve o vídeo numa conversa, ele monta um primeiro corte, analisa os clipes quadro a quadro e gera voz, música, efeitos, imagem e vídeo dentro do projeto. Está em todos os planos, inclusive o Free com marca d'água, e não tem API: o chat do agente consome créditos por tokens e cada mídia gerada é cobrada na tarifa do serviço. Use o Studio quando a peça é única e a conversa é mais rápida que o script; use o pipeline desta aula quando o vídeo precisa sair toda semana igual, com custo registrado e arquivo reproduzível. Deu certo com o Studio quando o primeiro corte saiu em uma sessão; o erro comum é tentar repetir no app, à mão, o que o script faz em um comando.
Studio 4.0 no app ou pipeline por script
Quando o editor com agente resolve
Studio 4.0 (21/09/2026)
- Peça única, sem repetição semanal
- Primeiro corte a partir de uma conversa
- Geração de voz, música e efeito dentro do projeto
- Custo por tokens do chat mais a tarifa de cada mídia
- Só no app web, sem API nem automação
Quando o pipeline por API resolve
Script desta aula
- Três vídeos por semana com o mesmo processo
- Cada chamada com estimativa e autorização antes
- Modelo, prompt, plano e custo registrados em logs/
- Mesma entrada produz a mesma saída
- Roda no Claude Code ou no Codex, sem clique
Se o destino for TV, rádio, cinema ou um jogo comercial distribuído em mais de uma plataforma (o que os termos chamam de Studio Games), não presuma cobertura: os planos self-serve e o Enterprise Music Lite excluem esses usos, e só o contrato Enterprise Music os libera, e vale homologar e contratar antes de aprovar. Se o idioma ficar stale ou failed, pare e diagnostique em vez de recriar projetos em sequência; cada criação cobra. Se o volume de vídeos crescer, agrupe as dublagens e consulte o andamento com calma, a mesma lógica do desconto por esperar em filas assíncronas.
Na Cozinha da Rafa, o vídeo longo 16:9 da semana ganha uma versão em espanhol para o público de fora do Brasil. Para um teste de um minuto dublado, um minuto de trilha e 1,2 s de efeito, a conta pelos preços de 09/10/2026 fica em US$ 2,20 + US$ 0,15 + US$ 0,0024, cerca de US$ 2,35, sem regenerações. A trilha é instrumental e discreta, e o som da colher entra só quando a imagem mostra a massa do bolo de rolo sendo batida.
Guia prático: dublar em um pedido, assinar a trilha e limpar a voz antes da mixagem
A aula cria o projeto de dublagem e depois adiciona o idioma. Este guia usa a cobrança que a criação já faz: o primeiro idioma entra no mesmo pedido. Também assina a trilha do Eleven Music com C2PA (o selo de procedência gravado no arquivo), explica por que mixar em 48 kHz e usa o Voice Isolator quando a dublagem chega com a música do original.
Funções, casos de uso e aplicações
Funções
Recursos de dublagem, música e áudio que a aula não usou
| Função ou recurso | O que faz | Quando usar | Desde |
|---|---|---|---|
| target_language na criação do projeto | Cria o primeiro idioma no mesmo POST e devolve o id em language_ids | Sempre: a criação já cobra um idioma | Referência de 12/10/2026 |
| Idioma refeito no mesmo projeto | Se um idioma falha, adicione o mesmo idioma de novo ao projeto existente; recrie só se o projeto falhar | Idioma em failed | Guia de dublagem, 12/10/2026 |
| Evento dubbing_language_completed | O webhook do idioma concluído traz as URLs de download | Receptor que baixa o áudio sem consultar o status | Webhooks na dublagem desde 21/09/2026 |
| sign_with_c2pa no Eleven Music | Assina a faixa com C2PA, só em MP3 | Trilha que vai para canal público, junto do registro de licença | Referência de 12/10/2026 |
| model_id do Eleven Music com padrão music_v1 | A referência lista music_v1 como padrão do campo; music_v2_5 só sai quando você o pede | Motivo para manter o model_id explícito do script da aula | Referência de 12/10/2026 |
| output_format: auto no Eleven Music | Entrega mp3_48000_192 nos modelos v2 e mp3_44100_128 no v1 | Mixar em 48 kHz, como o scripts/mixar.sh, sem conversão a mais | Referência de 12/10/2026 |
| Voice Isolator (POST /v1/audio-isolation) | Separa a fala do fundo, a US$ 0,12 por minuto | Dublagem que trouxe a música do original antes de somar a trilha nova | Preço de 12/10/2026 |
Fonte: ElevenLabs, referências Create dubbing project, Compose music e Audio isolation; guia de dublagem; changelog de 21/09/2026; preços da API
Casos de uso
Luana, gerente de marketing de uma escola de programação online em Recife
Educação
Dor
Cada aula dublada para o espanhol gerava dois passos e, quando o idioma falhava, a equipe criava outro projeto e pagava a criação de novo.
Solução
Projeto criado já com target_language; idioma em falha volta ao mesmo projeto; só um projeto em failed justifica criar outro.
Resultado
Compare, no painel de consumo, o número de projetos criados por aula antes e depois da mudança; o esperado é um por aula.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Thiago, produtor de conteúdo de uma marca de cafés especiais em Minas Gerais
Marketing digital
Dor
Um distribuidor pediu prova de origem da trilha dos vídeos de campanha, e o time só tinha o nome do arquivo.
Solução
Trilhas geradas com sign_with_c2pa em MP3 e o logs/ativos_sonoros.json da aula com modelo, prompt, plano e data de cada faixa.
Resultado
Na próxima solicitação, envie o arquivo assinado e a linha do log; observe se o pedido se resolve sem nova rodada de perguntas.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Na prática
O script abaixo substitui só a criação do projeto. Ele grava project_id e language_id no mesmo logs/dublagem_<destino>.json que o scripts/dublar.py da aula lê; como os dois ids já existem, o script da aula pula a criação e a inclusão do idioma e vai direto à espera e ao download. O bloco seguinte gera a trilha assinada e limpa a dublagem quando ela chega com música.
# Uso, na raiz video-ia: DUB_DESTINO=es-MX python scripts/dublar_em_um_pedido.py
# DUB_DESTINO=es-MX python scripts/dublar.py (espera e baixa)
import json, os
from pathlib import Path
from elevenlabs.client import ElevenLabs
DESTINO = os.environ["DUB_DESTINO"]
estado = Path(f"logs/dublagem_{DESTINO}.json")
if estado.exists():
raise SystemExit(f"{estado} já existe: o projeto foi criado. Rode scripts/dublar.py.")
if input("Criar o projeto já cobra um idioma. Digite SIM: ").strip() != "SIM":
raise SystemExit("Cancelado.")
with open("renders/entrada.mp4", "rb") as video:
p = ElevenLabs().dubbing.project.create(
file=video,
source_language="pt", # explícito: sem ele, a API detecta sozinha
model_id="dubbing_v2",
target_language=DESTINO, # o primeiro idioma usa a cobrança da criação
keyterms=["Cozinha da Rafa", "bolo de rolo", "mise en place"],
reference="Cozinha da Rafa - vídeo longo",
)
Path("logs").mkdir(exist_ok=True)
estado.write_text(json.dumps({"project_id": p.project_id, "language_id": p.language_ids[0]},
indent=2), encoding="utf-8")
print("Projeto e idioma criados. Agora rode scripts/dublar.py com o mesmo DUB_DESTINO.")#!/usr/bin/env bash
# uso, na raiz video-ia: bash scripts/trilha_assinada_e_voz_limpa.sh es-MX
set -euo pipefail
: "$ELEVENLABS_API_KEY"
DESTINO="$1"; mkdir -p audio
# 1) Trilha de 60 s em music_v2_5, assinada com C2PA (só vale em MP3)
curl --fail-with-body -sS -X POST "https://api.elevenlabs.io/v1/music?output_format=auto" \
-H "xi-api-key: $ELEVENLABS_API_KEY" -H "Content-Type: application/json" \
--data '{"model_id": "music_v2_5", "force_instrumental": true, "music_length_ms": 60000,
"sign_with_c2pa": true,
"prompt": "Trilha instrumental acolhedora para receita caseira, violão suave, 95 BPM, sem voz"}' \
-o audio/trilha.mp3
ffprobe -v error -show_entries stream=sample_rate -of csv=p=0 audio/trilha.mp3 # esperado: 48000
# 2) Só se a dublagem trouxe música do original: isola a voz antes de mixar
read -rp "A dublagem tem música por baixo? (s/n) " TEM
if [ "$TEM" = "s" ]; then
curl --fail-with-body -sS -X POST "https://api.elevenlabs.io/v1/audio-isolation" \
-H "xi-api-key: $ELEVENLABS_API_KEY" \
-F "audio=@audio/dublagem_$DESTINO.flac" -o "audio/voz_isolada_$DESTINO.mp3"
echo "Voz isolada em audio/voz_isolada_$DESTINO.mp3; use-a no lugar da dublagem no scripts/mixar.sh."
fiVersão dublada com menos pedidos em cinco passos
Passo 1: Crie projeto e idioma juntos
DUB_DESTINO=es-MX python scripts/dublar_em_um_pedido.py.
Deu certo quando: logs/dublagem_es-MX.json tem project_id e language_id.
Erro comum: Rodar o script de novo e criar um segundo projeto pago.
Passo 2: Espere e baixe com o script da aula
DUB_DESTINO=es-MX python scripts/dublar.py.
Deu certo quando: O script pula a criação e baixa o áudio quando o idioma fica completed.
Erro comum: Recriar o projeto quando só o idioma falhou.
Passo 3: Ouça e decida sobre a música do original
Fone de ouvido, do começo ao fim.
Deu certo quando: Você sabe se a dublagem traz música por baixo da voz.
Erro comum: Somar trilha nova por cima da trilha que já veio.
Passo 4: Gere a trilha assinada e isole a voz se preciso
bash scripts/trilha_assinada_e_voz_limpa.sh es-MX.
Deu certo quando: O ffprobe da trilha mostra 48000 e, se pedido, a voz isolada existe.
Erro comum: Pedir C2PA com saída WAV ou PCM, em que a assinatura não se aplica.
Passo 5: Mixe e registre
scripts/mixar.sh da aula e uma linha nova em logs/ativos_sonoros.json com c2pa: true.
Deu certo quando: O MP4 dublado tem a fala clara e o log aponta a procedência da trilha.
Erro comum: Guardar só o MP4 e perder o MP3 assinado.
No fim você tem: Dublagem com uma cobrança de criação, trilha com procedência gravada no arquivo e voz limpa antes da mixagem.
Armadilhas
Dublagem e trilha: o que evitar e o que fazer
Evite
Coluna a evitar
- Criar o projeto sem target_language e tratar o idioma como cobrança à parte
- Omitir source_language num vídeo em português com termos em inglês
- Criar outro projeto quando só um idioma falhou
- Omitir o model_id da música e receber o music_v1
- Achar que a assinatura C2PA substitui o registro de licença
Prefira
Coluna recomendada
- Primeiro idioma no mesmo POST da criação
- source_language="pt" escrito no script
- O mesmo idioma adicionado de novo ao projeto existente
- model_id="music_v2_5" em toda chamada
- C2PA no MP3 e modelo, prompt, plano e data no log
Glossário rápido
Dubbing v2
Dublagem por API da ElevenLabs (model_id dubbing_v2), organizada em projeto com idiomas de destino adicionados depois, a US$ 2,20 por minuto em 09/10/2026.
lossless_audio
Saída de áudio sem perdas (FLAC) de um idioma dublado, entregue por URL assinada que expira uma hora depois de emitida.
Eleven Music
Gerador de música por texto da ElevenLabs; o modelo atual é o music_v2_5, pedido pelo model_id em cada chamada da API.
plano de composição
Roteiro da música em trechos, até 30 trechos de 3 a 120 segundos, cada um com até 6.132 caracteres em até 30 linhas de 200, com nome de seção de 1 a 100 caracteres, como a partitura dividida em seções.
webhook_ids
Até três ids de webhooks da conta que o projeto de dublagem avisa quando o estado de um idioma muda; substitui a consulta periódica.
voices_not_permitted
Aviso na resposta da criação do projeto de dublagem indicando que uma voz do original não pôde ser usada e uma substituta entrou no lugar.
SFX
Efeito sonoro curto gerado por texto (eleven_text_to_sound_v2), como o som de uma colher batendo na tigela.
ducking
Técnica de mixagem que abaixa a trilha enquanto alguém fala e a devolve nas pausas, como o garçom que baixa a voz quando o cliente começa a pedir.
sidechain
Ligação em que um som controla o volume de outro; no ducking, a voz é a chave que comanda a trilha.
music_v2_5
Modelo atual do Eleven Music, aceito na API desde 14/09/2026; passe o model_id em toda chamada, porque a documentação lida em 12/10/2026 não diz qual modelo a rota usa quando o campo é omitido.
force_instrumental
Parâmetro do Eleven Music que gera a faixa sem voz cantada.
prompt_influence
Quanto o efeito sonoro obedece ao texto, de 0 a 1, com padrão 0,3.
adelay
Filtro do FFmpeg que atrasa um som em milissegundos para posicioná-lo no momento certo.
Gere agora a dublagem de um trecho curto, a trilha de 60 segundos e um efeito, e mixe os três. Está pronto quando o áudio dublado foi aprovado por quem fala o idioma, cada arquivo de áudio tem modelo, prompt e plano registrados e o MP4 final tem a fala clara sobre a trilha em ducking, com a mesma duração do vídeo original.
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. Nos vídeos e áudios, use Anotar este momento. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Conexões deste capítulo
Veja o que estudar antes e para onde seguir depois, explore os conceitos e compare abordagens em outros cursos. Sugestões marcadas como “sugerido pelo grafo” vêm dos assuntos em comum, não do índice do curso.
Estude antes
- CursoClaude Code CLI: Programação com IA
- CursoAstra profundosugerido pelo grafoA quinta parte do Astra planeja o vídeo e edita o material bruto com o modelo dirigindo a ferramenta. O curso de vídeo com IA aprofunda esse trabalho com Claude Code, Codex e ElevenLabs, do roteiro à publicação. O grafo já sugeria esta ordem pela regra de entrada da trilha; com a ordem anterior curada, ela passa a ser declarada (Etapa 4, wave 3).
- CursoSetup Completo: do zero ao Claude Codesugerido pelo grafo7 capítulos de “Vídeo com IA: Claude Code, Codex e ElevenLabs” usam conceitos apresentados em “Setup Completo: do zero ao Claude Code”.
Depois, siga para
- CursoFrontends com Vibecodingsugerido pelo grafo21 capítulos de “Frontends com Vibecoding” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
- CursoDo Agile ao Agentic Operating Modelsugerido pelo grafo5 capítulos de “Do Agile ao Agentic Operating Model” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
- CursoAgentes de IA Autônomos: Do Conceito à Produçãosugerido pelo grafo7 capítulos de “Agentes de IA Autônomos: Do Conceito à Produção” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
- CursoLLM FinOps: o custo da IA para quem assina o orçamentosugerido pelo grafo4 capítulos de “LLM FinOps: o custo da IA para quem assina o orçamento” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
O mesmo assunto em outros cursos
- Astra profundoGovernar a esteira: gerar uma vez e multiplicar com cota zeroExaminar conexões de Governar a esteira: gerar uma vez e multiplicar com cota zero
- TikTok Ads e Live Commerce 2027Roteirizar e gravar vídeos verticais que se entendem sem somExaminar conexões de Roteirizar e gravar vídeos verticais que se entendem sem som
- Meta Ads 2027Produzir Reels e Stories que seguram a atenção nos primeiros segundosExaminar conexões de Produzir Reels e Stories que seguram a atenção nos primeiros segundos
- SEO e GEO para PodcastsPublique o episódio com transcrição e capítulos revisadosExaminar conexões de Publique o episódio com transcrição e capítulos revisados
Voltar ao capítulo anterior: Transcrever com Scribe v2 e cortar o vídeo pela palavra falada
Leve uma ideia para a prática
Escolha uma atividade no painel e volte a este curso quando quiser.
Atividades e evolução ficam reunidas no painel da sua conta.
Laboratórios ao vivo deste curso
Cada laboratório monta a biblioteca real dentro da aula, com controles para você mexer e o código do exemplo para copiar. O texto de reserva descreve a demonstração para quem lê sem JavaScript. O link abre o capítulo já no ponto do laboratório.
MediaRecorder, Canvas 2D e Long Animation Frames (plataforma)
Grave a cena em tempo real e veja os quadros que se perdem
Suba as partículas, force um bloqueio de 300 ms e grave seis segundos; compare com o render quadro a quadro desta aula.
Pacote
Abrir no capítuloMontar vídeo em HTML com HyperFrames e escolher entre ele e o Remotionsem pacoteMotion
Ver agentes em paralelo trocando mensagens numa linha do tempo
Reproduza a cena, percorra o tempo pelo controle e compare o tempo de parede com a soma das barras de cada agente.
Pacote
Abrir no capítuloParalelizar cenas com subagentes sem estourar o limite das APIsmotionReact (sem dependência extra), com as APIs do Veo e do fal.ai
Prompt de vídeo em cinco camadas, pronto para a API
Escolha plano, câmera, luz, ação e áudio e copie o prompt e o JSON para o Veo ou para o fal.ai.
Pacote
Abrir no capítuloEscrever prompt de vídeo em cinco camadas e manter o personagem consistentereactReact (sem dependência extra), com o comando para o FFmpeg
Corte o vídeo apagando palavras da transcrição
Aperte as palavras para removê-las, ligue a remoção de pausas e copie o comando FFmpeg e a legenda SRT gerados.
Pacote
Abrir no capítuloRemover pausas e reenquadrar o vídeo de 16:9 para 9:16 com legenda por palavrareactReact (sem dependência extra)
Quanto custa cada etapa do seu pipeline de vídeo
Troque a ferramenta de cada etapa e o percentual de b-roll e veja qual etapa pesa no custo por minuto e por vídeo.
Pacote
Abrir no capítuloOrquestrar o pipeline com etapas idempotentes e teto de gastoreact
Capítulos vizinhos em Vídeo com IA: Claude Code, Codex e ElevenLabs
- 16Clonar ou desenhar uma voz com consentimento por escrito e verificação
- 17Transcrever com Scribe v2 e cortar o vídeo pela palavra falada
- 18Dublar o vídeo e compor trilha e efeitos com licença registrada
- 19Escolher o modelo de vídeo certo para cada peça
- 20Escrever prompt de vídeo em cinco camadas e manter o personagem consistente