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.
- Divida o roteiro em um arquivo
.txtcom uma frase curta por linha (nas vírgulas/pontos/reticências), sem linhas#, sem[icon]. 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>- 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. - 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 filtrosubtitles/libass):brew install ffmpeg-fulledge-tts:pipx install edge-tts(se erro de rede, fallback automático para vozsay -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; masculinavi-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.mp3ignora 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émbanmai,thuminhfemininas Norte,lannhi,linhsanfemininas Sul,myanfeminina Central,giahuymasculina Central). Requerexport 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;--rateaplicado 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/, linkassets.mixkit.co/videos/<id>/<id>-1080.mp4), combine vários clipes, corte vertical,setpts=1.4*PTSpara 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: vozvi-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. --musicreduzido 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--ratee 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.