Communitygithub.com

LeAnhTuanIT/short-video

Cria vídeos curtos verticais 9:16 (TikTok/Reels/Shorts) para qualquer tema, com narração em português (ou outros idiomas) e legendas embutidas, a partir de um roteiro gerado pelo Claude ou fornecido pelo usuário.

O que é short-video?

Esta skill permite criar vídeos verticais no formato 9:16, ideais para plataformas como TikTok, Reels e Shorts, a partir de um roteiro de texto. A principal funcionalidade é gerar narração em voz sintética (utilizando edge-tts ou FPT.AI), sincronizar legendas no estilo karaokê diretamente no vídeo e combinar com fundo animado, música ou vídeo de fundo. O pipeline é totalmente automatizado: o roteiro é processado pelo `make_video.py`, que chama o TTS para cada frase, gera um arquivo de áudio, cria legendas ASS com base na duração real da fala e renderiza o vídeo final com ffmpeg. A skill suporta dois modos principais: criação com voz sintética (padrão, usando edge-tts ou FPT.AI) e uso de áudio pré-gravado enviado pelo usuário (como de EverAI). Também oferece dois estilos visuais: 'night' (tema noturno com neon) e 'ui' (tutorial de tecnologia com janelas e marcações). Para o modo com áudio existente, o usuário envia o arquivo MP3 e o roteiro; a skill ajusta as legendas exatamente nos cortes de respiração. A skill foi projetada para macOS e Linux (Ubuntu/Debian), com suporte para Windows via WSL.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/LeAnhTuanIT/short-video-skill/tree/HEAD

Perguntar na sua IA favorita

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

Documentação

Vídeo curto com narração + legendas

Pipeline: roteiro .txt → make_video.py (edge-tts lê cada frase → combina áudio → legendas ASS com duração real → fundo + queima de legendas com ffmpeg) → MP4 1080x1920.

Modo confirmado: áudio existente → vídeo (usado por padrão quando o usuário envia mp3)

O usuário cria a voz no EverAI (web, velocidade 0.85), envia mp3 + roteiro. Não chama API, não clona voz, não executa modelo de voz (VieNeu) na máquina.

  1. Divida o roteiro em um arquivo .txt com uma frase curta por linha (nas vírgulas/pontos/reticências), sem linhas #, sem [icon].
  2. python3 make_video.py roteiro.txt ~/Downloads/<nome>.mp4 --audio voz.mp3 --style night --no-wave --bg assets/fundo-noite.mp4 --target <duração±5>
  3. Imprima os marcos de cada linha: execute o mesmo comando com --print-timing (sem renderizar). Verifique: linhas muito longas/curtas em relação ao número de caracteres → mescle/separae renderize novamente.
  4. Extraia 1–2 quadros para verificar as legendas, informe o caminho e a duração. Se não ouvir som, geralmente é porque o Mac está usando AirPods. Instruções para o usuário: HUONG-DAN.md.

Instalação em outra máquina

Copie toda a pasta ~/.claude/skills/short-video/ para a nova máquina (mesmo caminho) e execute bash ~/.claude/skills/short-video/setup.sh. Suporta macOS e Ubuntu/Debian; Windows usar via WSL. Fundo noturno incluído: assets/pho-dem.mp4 (stock Mixkit, uso comercial permitido).

Requisitos (já instalados nesta máquina)

  • ffmpeg-full (necessita do filtro subtitles/libass): brew install ffmpeg-full
  • edge-tts: pipx install edge-tts (se erro de rede, fallback automático para voz say -v Linh)

Passo 1 — Definir o briefing

Extrair da solicitação; se faltar, usar padrões, perguntar apenas se o tema for completamente vago:

  • Tema / perspectiva — se não houver ângulo específico, escolha um ângulo atraente e concreto.
  • Duração — padrão 45–60s.
  • Voz — padrão feminina vi-VN-HoaiMyNeural; masculina vi-VN-NamMinhNeural. Outros idiomas: edge-tts --list-voices | grep <código> (ex: en-US-AriaNeural).
  • Fundo / música — imagem/vídeo fornecido pelo usuário; se não houver, fundo gradiente padrão.

Passo 2 — Escrever o roteiro

Salve como arquivo .txt, primeira linha é o título, cada linha seguinte é uma frase lida:

# Título curto exibido no início (≤ 6 palavras)
Frase de gancho que desperta curiosidade, ≤ 12 palavras.
Frase de conteúdo...
Frase final + chamada para ação.

Regras:

  • Duração em português: ~2.3 palavras/segundo (medido: 155 palavras ≈ 65s). 45–60s → 110–140 palavras; 30s → ~65 palavras; 15s → ~30 palavras.
  • Cada linha uma frase, 8–20 palavras. Os primeiros 3 segundos são o gancho (pergunta/fato surpreendente). Meio: 3–5 ideias específicas e fáceis de lembrar. Final: CTA (salvar, seguir, comentar).
  • Fatos devem ser precisos; temas de saúde/finanças/jurídico: sem diagnósticos, sem conselhos específicos como especialista; sugerir consultar um profissional quando necessário.
  • Escreva números/símbolos por extenso quando a leitura for ambígua ("quatro - sete - oito" em vez de "4-7-8", "por cento" em vez de "%"). Evite emojis, caracteres {} \.

Permita que o usuário revise o roteiro antes de renderizar, a menos que ele já tenha fornecido o conteúdo ou tenha dito para prosseguir.

Passo 3 — Renderizar

python3 ~/.claude/skills/short-video/make_video.py roteiro.txt saida.mp4 \
  [--voice vi-VN-HoaiMyNeural] [--rate -5%] [--target 45-60] \
  [--bg imagem_ou_video_fundo] [--music musica_fundo.mp3] [--gap 0.35] \
  [--pitch -8Hz] [--style default|night]
  • Áudio existente: --audio voz.mp3 ignora TTS. O roteiro deve corresponder exatamente à fala, cada linha uma frase curta (separada por vírgula/ponto); os marcos de tempo se alinham às pausas. Imprima os marcos com --print-timing (normalmente ~12–16 caracteres/segundo); linhas muito longas/curtas → mescle/separae renderize novamente.
  • FPT.AI: --engine fpt --voice leminh (voz masculina Norte; também banmai, thuminh femininas Norte, lannhi, linhsan femininas Sul, myan feminina Central, giahuy masculina Central). Requer export FPT_API_KEY=... (chave no console.fpt.ai, pacote Free Tier 100.000 caracteres/mês). Sem marcos por palavra, então karaokê divide por comprimento de caractere; --rate aplicado com atempo. Nunca grave a chave no arquivo da skill.
  • Todos os motores produzem ritmo natural de fala (leve variação de velocidade/tom por frase, pausa maior após perguntas) + processamento de voz quente, compressão e leve reverberação. Escreva o roteiro em linguagem falada, use "..." e pontos entre frases para criar pausas.
  • Voz masculina Norte (grave, madura) (edge): --voice vi-VN-NamMinhNeural --pitch=-8Hz --rate=-10% (NamMinh é a única voz masculina do Vietnã no edge).
  • --style night --no-wave + roteiro sem linhas #, sem tag [icon] → apenas fundo + legendas.
  • --style night (estilo reel "noite urbana"): título em maiúsculas com espaçamento, cor teal + sublinhado, ícone neon de traço fino, legendas em maiúsculas com karaokê palavra por palavra (marcos reais do edge-tts), forma de onda em barras. Coloque [icon] no início da frase para trocar o ícone a partir dela: sun hourglass gift heart leaf book star eye. O fundo deve ser vídeo real de rua noturna: estoque gratuito no Mixkit (https://mixkit.co/free-stock-video/night-city-street/, link assets.mixkit.co/videos/<id>/<id>-1080.mp4), combine vários clipes, corte vertical, setpts=1.4*PTS para câmera lenta.
  • --style ui (vídeo tutorial de tecnologia): fundo escuro com grade, barra de série (título #) + caixas de etapa 1..n, janela de aplicativo simulada, terminal com digitação, moldura de legenda destacada em laranja *palavra-chave*. Tags no início da frase: [step:Nome da Etapa] (avança para nova etapa), [card:Título|item 1|item 2] (janela, mantida até a próxima cena), [term:comando]. Frases com atalhos de teclado escreva por extenso ("Comando, Shift, três"), mas no card escreva "Comando + Shift + 3". Exemplo: voz vi-VN-NamMinhNeural --pitch=-4Hz --rate=+15% --gap 0.25.
  • Sem --bg → fundo gradiente azul-roxo escuro com movimento lento (adequado para temas suaves; temas vibrantes devem solicitar imagem/vídeo de fundo). Imagem → efeito de zoom lento. Vídeo → loop automático.
  • --music reduzido para 12% do volume, fade no final.
  • O script imprime a duração e avisa se estiver fora do --target → adicione/remova frases ou ajuste --rate e renderize novamente.

Passo 4 — Verificar

Extraia 1 quadro para ver se as legendas estão quebradas ou fora dos limites: ffmpeg -v error -y -ss 5 -i saida.mp4 -frames:v 1 quadro.jpg e depois leia quadro.jpg. Informe ao usuário o caminho absoluto do vídeo e a duração.

Exemplo de roteiro: example-sleep.txt na pasta da skill.

Habilidades Relacionadas