Communitygithub.com

Amartileyton/autovideo

Gere narrações profissionais usando a IA da ElevenLabs. Use quando o usuário precisar criar narrações para vídeos, áudio-narração ou conteúdo de texto para fala. Suporta múltiplas vozes com predefinições de personagens (narrador, vendedor, especialista) para uma entrega natural. Inclui regeneração de cena individual para ajustes finos.

O que é autovideo?

Esta skill permite gerar narrações profissionais de alta qualidade usando a API ElevenLabs diretamente em projetos Remotion. Ela suporta múltiplas vozes e predefinições de personagens (como narrador, vendedor, especialista) que tornam a narração mais natural do que a simples leitura literal do texto, ideal para vídeos explicativos, marketing e tutoriais. A skill também oferece geração baseada em cenas com costura de requisições (request stitching), garantindo prosódia consistente entre cenas, além de regeneração individual de cenas para ajustes finos sem precisar regerar o projeto inteiro. Ela também inclui validação automática de tempo (duração, silêncios, taxa de fala) e incorporação de miniaturas em vídeos MP4, sendo compatível com qualquer plataforma que utilize ElevenLabs, especialmente Remotion para composições de vídeo.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Amartileyton/autovideo/tree/HEAD/.agent/skills/elevenlabs-remotion

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Geração de Narração com ElevenLabs

Gere narrações profissionais com IA para vídeos Remotion usando a API ElevenLabs.

Pré-requisitos

  • ELEVENLABS_API_KEY em .env.local

Início Rápido

# Gerar narração a partir de texto
node .claude/skills/elevenlabs-remotion-skill/generate.js --text "Seu texto aqui" --output public/audio/voiceover.mp3

# Gerar com estilo de narrador (mais natural)
node .claude/skills/elevenlabs-remotion-skill/generate.js --text "Seu texto" --character narrator --output voiceover.mp3

# Gerar cenas com costura de requisições
node .claude/skills/elevenlabs-remotion-skill/generate.js --scenes remotion/scenes.json --output-dir public/audio/project/

# Regenerar uma única cena
node .claude/skills/elevenlabs-remotion-skill/generate.js --scenes scenes.json --scene scene2 --new-text "Texto atualizado"

# Listar vozes e predefinições de personagens disponíveis
node .claude/skills/elevenlabs-remotion-skill/generate.js --list-voices
node .claude/skills/elevenlabs-remotion-skill/generate.js --list-characters

Predefinições de Personagens

Use as predefinições de personagens para narrações mais naturais, em vez da leitura literal de texto de tela:

PersonagemDescriçãoMelhor Para
literalLê o texto exatamente como escritoTexto de tela, citações
narratorContador de histórias profissional, suave e envolventeExplicativos, documentários
salespersonEntusiástico, persuasivo, energéticoMarketing, anúncios
expertAutoritário, confiante, conhecedorConteúdo jurídico, tutoriais
conversationalCasual, amigável, naturalRedes sociais, conteúdo casual
dramaticIntenso, emocional, impactanteGanchos, declarações de problema
calmSuave, tranquilizador, gentilConstrução de confiança, conclusões
# Usar estilo narrador globalmente
node .claude/skills/elevenlabs-remotion-skill/generate.js --scenes scenes.json --character narrator --output-dir public/audio/

# Ou definir por cena em scenes.json
{
  "scenes": [
    { "id": "scene1", "text": "Declaração do problema", "character": "dramatic" },
    { "id": "scene2", "text": "Solução", "character": "calm" }
  ]
}

Geração Baseada em Cenas com Costura de Requisições

Gere múltiplas cenas com prosódia consistente usando a costura de requisições da ElevenLabs:

Formato scenes.json

{
  "name": "product-demo",
  "voice": "George",
  "character": "narrator",
  "scenes": [
    {
      "id": "scene1",
      "text": "Texto para fala genérico soa robótico. Sua marca merece mais.",
      "duration": 4.5,
      "character": "dramatic"
    },
    {
      "id": "scene2",
      "text": "Com clonagem de voz, você pode usar sua própria voz para conteúdo ilimitado.",
      "duration": 5.5
    },
    {
      "id": "scene3",
      "text": "Grave uma pequena amostra. Clone-a. Crie narrações profissionais em minutos.",
      "duration": 6,
      "delay": 0.3
    }
  ]
}

Gerar Todas as Cenas

node .claude/skills/elevenlabs-remotion-skill/generate.js \
  --scenes remotion/product-demo-scenes.json \
  --output-dir public/audio/product-demo/

Isso cria:

  • product-demo-scene1.mp3 até sceneN.mp3
  • product-demo-combined.mp3 (todas as cenas costuradas)
  • product-demo-info.json (metadados com durações)

Regeneração de Cena Individual

Se uma cena começar muito cedo, tiver tempo errado ou precisar de texto diferente:

# Regenerar scene2 com novo texto
node .claude/skills/elevenlabs-remotion-skill/generate.js \
  --scenes remotion/scenes.json \
  --scene scene2 \
  --new-text "Texto atualizado da cena 2" \
  --output-dir public/audio/project/

# Regenerar scene3 com personagem diferente
node .claude/skills/elevenlabs-remotion-skill/generate.js \
  --scenes remotion/scenes.json \
  --scene scene3 \
  --character salesperson \
  --output-dir public/audio/project/

# Apenas regenerar (mesmo texto, mesmo personagem)
node .claude/skills/elevenlabs-remotion-skill/generate.js \
  --scenes remotion/scenes.json \
  --scene scene1 \
  --output-dir public/audio/project/

# Incorporar miniatura em um vídeo MP4
node .claude/skills/elevenlabs-remotion-skill/generate.js \
  --embed-thumbnail public/videos/my-video.mp4 \
  --thumbnail public/videos/my-thumbnail.png \
  --output public/videos/my-video-with-thumb.mp4

A ferramenta automaticamente:

  • Usa costura de requisições de cenas anteriores para prosódia consistente
  • Atualiza o arquivo info.json com novos metadados
  • Atualiza scenes.json se --new-text for fornecido

Incorporação de Miniatura

Incorpore uma imagem de miniatura em vídeos MP4 para que plataformas como Twitter, YouTube e players de vídeo exibam sua miniatura personalizada em vez do primeiro quadro.

Incorporar Miniatura no Vídeo

# Uso básico - gera video-thumb.mp4
node .claude/skills/elevenlabs-remotion-skill/generate.js \
  --embed-thumbnail public/videos/promo.mp4 \
  --thumbnail public/videos/thumbnail.png

# Caminho de saída personalizado
node .claude/skills/elevenlabs-remotion-skill/generate.js \
  --embed-thumbnail public/videos/promo.mp4 \
  --thumbnail public/videos/thumbnail.png \
  --output public/videos/promo-final.mp4

Fluxo de Trabalho com Remotion

# 1. Renderize seu vídeo
npx remotion render MyVideo public/videos/my-video.mp4

# 2. Renderize sua miniatura (use composição Still)
npx remotion still MyVideoThumbnail public/videos/my-thumbnail.png

# 3. Incorpore a miniatura
node .claude/skills/elevenlabs-remotion-skill/generate.js \
  --embed-thumbnail public/videos/my-video.mp4 \
  --thumbnail public/videos/my-thumbnail.png \
  --output public/videos/my-video-final.mp4

Formatos Suportados

  • Vídeo: MP4 (H.264/H.265)
  • Miniatura: PNG, JPG, JPEG

A incorporação usa a flag -disposition:v:1 attached_pic do ffmpeg para definir a miniatura como uma imagem anexada, que a maioria dos players de vídeo e plataformas reconhece.

Validação de Tempo

A skill valida automaticamente o tempo após a geração usando ffprobe:

O Que Verifica

VerificaçãoLimiarDescrição
Discrepância de duração>15%Avisa se a duração real difere da esperada
Silêncio inicial>200msÁudio começa tarde (narração atrasada)
Silêncio final>500msSilêncio desnecessário no final
Taxa de fala2-4.5 ppsIdeal ~3 palavras/segundo

Validar Áudio Existente

# Validar todas as cenas de um projeto
node .claude/skills/elevenlabs-remotion-skill/generate.js --validate public/audio/product-demo/

Exemplo de saída:

🔍 Validando product-demo (6 cenas)

❌ scene1: 3.00s (esperado: 4.5s)
   ❌ Áudio 1.50s mais curto que o esperado
   👍 8 palavras @ 3.1 palavras/seg
⚠️ scene2: 6.35s (esperado: 5.5s)
   ⚠️ Silêncio inicial: 235ms (pode começar tarde)
   🐢 10 palavras @ 1.8 palavras/seg
✅ scene4: 4.36s (esperado: 4s)
   👍 9 palavras @ 2.3 palavras/seg

📊 Duração total: 30.80s (esperado: 30.00s)

info.json Atualizado

Após a validação, o info.json inclui medições reais:

{
  "scenes": [
    {
      "id": "scene1",
      "duration": 4.5,
      "actualDuration": 3.0,
      "leadingSilence": 0.05,
      "wordsPerSecond": 3.1
    }
  ]
}

Use actualDuration em sua composição Remotion para sincronia precisa.

Opções

OpçãoDescriçãoPadrão
--text, -tTexto para converter em falaObrigatório (ou --file/--scenes)
--file, -fLer texto de arquivo-
--output, -oCaminho do arquivo de saídaoutput.mp3
--output-dirDiretório de saída para cenaspublic/audio
--voice, -vNome ou ID da vozGeorge
--model, -mID do modeloeleven_multilingual_v2
--character, -cPredefinição de personagemliteral
--scenesArquivo JSON com cenas-
--sceneRegenerar ID de cena individual-
--new-textNovo texto para regeneração de cena-
--validateValidar diretório de áudio existente-
--skip-validationPular validação automáticafalse
--embed-thumbnailArquivo de vídeo para incorporar miniatura-
--thumbnailArquivo de imagem de miniatura (PNG/JPG)-
--stabilityEstabilidade da voz (0-1)varia por personagem
--similaritySimilaridade da voz (0-1)varia por personagem
--styleExagero de estilo (0-1)varia por personagem
--no-combinedPular arquivo combinadofalse

Vozes Recomendadas

VozEstiloMelhor Para
GeorgeBritânica calorosa e cativanteNarração, explicativos
AntoniProfissional, calorosaConteúdo jurídico, tutoriais
ArnoldAutoritária, profundaCorporativo, tópicos sérios
JoshAmigável, conversacionalMarketing, conteúdo casual

Integração com Remotion

Após gerar as narrações das cenas, use-as em sua composição:

import { Audio, Sequence, staticFile } from "remotion";

// Use arquivos de áudio de cena individuais para sincronia precisa
const SCENE_DURATIONS = {
  scene1: 4.5,  // De info.json
  scene2: 5.5,
  scene3: 8.0,
};

export const VideoWithVoiceover: React.FC = () => {
  const { fps } = useVideoConfig();

  const scene1Frames = Math.round(SCENE_DURATIONS.scene1 * fps);
  const scene2Frames = Math.round(SCENE_DURATIONS.scene2 * fps);

  return (
    <>
      <Sequence from={0} durationInFrames={scene1Frames}>
        <Audio src={staticFile("audio/project/project-scene1.mp3")} />
        <Scene1Visual />
      </Sequence>

      <Sequence from={scene1Frames} durationInFrames={scene2Frames}>
        <Audio src={staticFile("audio/project/project-scene2.mp3")} />
        <Scene2Visual />
      </Sequence>
    </>
  );
};

Dicas para Melhores Resultados

  1. Use predefinições de personagens: Não leia texto de tela literalmente - use narrator ou expert para fluxo natural
  2. Pontuação importa: Use pontos para pausas, vírgulas para pausas breves
  3. Números: Escreva números por extenso ("quinhentos" não "500") para fala natural
  4. Abreviações: Escreva palavras completas ("vinte e quatro horas" não "24h")
  5. Cena por cena: Cenas diferentes podem ter personagens diferentes (introdução dramática, CTA calmo)
  6. Ajuste fino: Use --scene para regenerar cenas individuais sem refazer tudo
  7. Costura de requisições: Mantém a voz consistente em todas as cenas

Exemplo de Fluxo de Trabalho

# 1. Crie scenes.json com seu roteiro
# 2. Gere todas as cenas com estilo narrador
node .claude/skills/elevenlabs-remotion-skill/generate.js \
  --scenes remotion/my-video-scenes.json \
  --character narrator \
  --output-dir public/audio/my-video/

# 3. Visualize no Remotion, perceba que a cena2 começa muito cedo
# 4. Regenerar apenas a cena2 com texto atualizado
node .claude/skills/elevenlabs-remotion-skill/generate.js \
  --scenes remotion/my-video-scenes.json \
  --scene scene2 \
  --new-text "Texto um pouco mais longo para preencher o tempo visual" \
  --output-dir public/audio/my-video/

# 5. Atualize a composição do vídeo com a nova duração do info.json
# 6. Repita até que o tempo esteja perfeito

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

Habilidades Relacionadas