Video Editor · Trabalhador de Vídeo
Sintetiza vídeos curtos no formato 9:16 / 16:9 talking-head + material sobreposto (título / B-roll cutaway / chyron / legenda). A síntese principal é autossuficiente; material stock real / cartões de notícias são delegados por este skill como diretor ao footage-finder / news-highlight.
Quando Acionar
O usuário diz:
- "corta este vídeo", "editar vídeo", "editar" —— entrada mais comum
- "fazer um episódio", "produzir vídeo completo", "sintetizar narração e B-roll"
- "novo episódio [série X / AI startup / série Y]"
- "adicionar legenda / chyron / texto pop-up / cartão de título à narração"
- "adicionar efeito / adicionar animação / adicionar visual"
- "adicionar imagens de artigo real / reação humana / imagem local ao estilo Maria à narração" →
reaction_overlay(1080×1920 vertical; primeiro lerrecipes/reaction_overlay.md)
Não aciona mas relacionado (delegado a skill irmão, video-editor como diretor):
- Material stock real / stock footage / B-roll vazio → chamar skill
footage-finder - Cartão de destaque de notícias (captura de tela da fonte real + luz amarela destacando) → chamar skill
news-highlight - Apenas geração de voice-over, material curto menor que 30s → não aciona
Delegação: Tipo de Cue de Cena → Qual Skill
Na fase de cenas (porta 1), cada cue recebe um tipo; os dois tipos não nativos deste skill são delegados:
| tipo de cue | quem faz | produto |
|---|---|---|
real_footage | skill footage-finder | mp4 candidatos de stock real cortados no formato + página de revisão |
news_highlight | skill news-highlight | cartão de destaque de notícias reais com luz amarela (estilo Vox) mp4 |
source_progressive_highlight | este skill animator/cutaway/scene_source_progressive_highlight.html | destaque frase por frase em capturas de tela reais de artigos/notícias, sem redesenhar a página da mídia |
tenure_bullets | este skill animator/cutaway/scene_tenure_bullets.html | bullet numerado com pessoa no quadro: item atual amarelo, itens antigos desbotam |
numbered_pills | este skill animator/cutaway/scene_numbered_pills.html | estilo YC 01–04 cápsulas brancas + borda laranja, visão geral em grupo aparece item por item; mesmo conteúdo que listicle, escolher um dos dois na prévia |
company_site | este skill recipes/compose_company_site.py | gravação de rolagem de site real em tela cheia + PIP circular contínua da pessoa real; site padrão com PIP, evitando legendas e áreas críticas por parágrafo |
cutout_sticker_slidein | este skill animator/cutaway/scene_sticker_slidein.html | adesivo transparente de pessoa/objeto com fonte, permanência breve, desliza de direções diferentes; não usar cartão de reação com moldura branca antiga |
source_quote / source_screenshot | este skill busca o texto original e captura a página real | captura de tela real com link da página original, parágrafo correspondente e destaque; citação não pode ser substituída por cartão redesenhado |
real_person_reaction | este skill primeiro busca material do usuário / vídeo público original, se necessário delega a footage-finder | foto ou vídeo curto de pessoa real com fonte; não substituir automaticamente por Emoji |
| opener / chyron / cutaway / listicle / spec_review | este skill animator/opener | HTML→mov/mp4 |
reaction_overlay (pessoa aparece continuamente, material real aparece parcialmente) | este skill recipes/reaction_overlay.py + síntese de vídeo existente | síntese de imagens estáticas sobrepostas e trechos de pessoa real; cue JSON, links de fonte e material reutilizáveis |
| legenda | este skill subtitle | legenda queimada com destaque de palavras-chave |
Sugestões de Material no Roteiro de Narração: Ler Antes de Fazer Cues
Aplica-se a vídeo completo com imagens, cues de animação, reaction_overlay e slidecast 3:4. Quando o usuário fornece o roteiro de narração (HTML / Markdown / documento Feishu), primeiro ler o corpo da narração e a seção separada de "Sugestões de Material"; se apenas o áudio ou vídeo foi fornecido, primeiro verificar se há um roteiro de narração correspondente na mesma pasta do tópico. Tarefas de ponto único (apenas legenda ou cartão de título) não precisam deste passo.
- "Sugestões de Material" é a intenção editorial, não é texto a ser lido em voz alta; a transcrição do Whisper apenas verifica o que foi realmente dito e determina os timecodes, não pode descartar as sugestões de imagem do roteiro só porque foi retranscrito.
- Cada sugestão é lida como "frase âncora original / imagem a mostrar / material original ou link da fonte / alternativa". Primeiro usar a âncora para encontrar a posição na transcrição real; quando a narração muda palavras ou ordem, realinhar por semântica, não usar mecanicamente os segundos estimados do roteiro. Parágrafos não ditos não forçam material.
- Na tabela de cues da porta 1, adicionar uma coluna "Sugestão de Material do Roteiro → Adotada / Ajustada / Pulada". Ao adotar, manter o link original correspondente; ao ajustar ou pular, escrever o motivo e dar uma imagem alternativa. Parágrafos sem sugestão no roteiro ainda podem receber cues com base no conteúdo da narração, mas devem ser marcados como "novo".
- Quando o link original falha, o fato muda ou a imagem não se adequa ao formato atual, verificar antes de substituir; não usar capturas de tela imprecisas, páginas falsificadas ou imagens dessincronizadas com a narração real apenas para seguir a lista.
- Se o roteiro de narração existe mas a seção de sugestões de material não foi encontrada, concluir a edição normalmente, sem pedir ao usuário para reescrever o roteiro. O plano final de cues deve ser baseado na narração real + feedback do usuário na porta 1.
Ao escrever um novo roteiro de narração, o formato correspondente está na seção "Sugestões de Material de Narração" do skill html-report.
Páginas Reais e Animações Dinâmicas: Regras de Edição Padrão
- Ao mencionar uma empresa/produto específico, mostrar seu site oficial real ou interface do produto. Manter a identidade do site, nome da empresa e visuais reais que comprovem a identidade; priorizar gravação de rolagem de página, posicionamento do mouse, demo do produto ou close-up parcial. Gravação de site usa
recipes/capture_company_site.js, síntese usarecipes/compose_company_site.py; não colocar apenas o logotipo, nem usar cartões falsos que imitam o site. Só usar capturas de tela oficiais verificáveis quando o site não estiver acessível, e escrever o motivo na tabela de cues. - Informações que podem avançar com a narração devem aparecer item por item. Por exemplo, quatro direções "1, 2, 3, 4" reveladas uma a uma na ordem dita, destacando o item atual e, no final, mostrando brevemente a visão completa; listas completas de 11 itens podem entrar em grupo/divisão de tela, mas no final o espectador deve ver todos os 11 itens. Não colocar os quatro itens como página estática logo no primeiro, nem usar flutuação circular sem informação no lugar da apresentação item por item.
- Material estático de tela cheia pode ter PIP dinâmico da pessoa real; sites reais de empresas padrão têm PIP mesmo que o site esteja rolando. Site usa
recipes/compose_company_site.py: gravação de página real em tela cheia, vídeo de narração contínua cortado em círculo pequeno. Vídeos de stock B-roll não têm PIP por padrão. Cada cue primeiro marca a área de legenda e o visual key mais importante, depois escolhe um dos quatro locais seguros: canto superior esquerdo, canto superior direito, meio esquerdo, meio direito; cues adjacentes com múltiplos locais seguros alternam, para que nem todos os sites da empresa fiquem no mesmo canto. Dentro da mesma cue, posição fixa, sem saltos. Se não houver local seguro, reduzir o tamanho, alterar o corte da página; se ainda sem solução, registrar exceção e cancelar. Material estático usarecipes/compose_static_pip.py. Detalhes na seção 9 deCONVENTIONS.md. - Listas ordenadas primeiro dão duas opções de imagem real para escolha. Para o mesmo conjunto de 3–5 itens,
scene_numbered_pills.htmlfaz cápsulas numeradas em tela cheia,scene_listicle.htmlfaz lista numerada com círculo amarelo e pessoa no quadro; a porta 2 exibe ambos lado a lado com o mesmo texto. Visão geral de categorias/direções prioriza cápsulas numeradas, explicação contínua de cada item prioriza listicle; o bullet superior estilo Hunger é uma terceira opção mais leve com pessoa no quadro. Após definição final, os itens aparecem um a um conforme o tempo real da narração, não revelando o todo no primeiro item. - Adesivos curtos e imagens adequadas para entrada podem deslizar das quatro bordas. Adesivos de pessoas/objetos reais, memes, fotos, capturas de tela parciais podem entrar das direções superior, esquerda, inferior ou direita, alternando ou usando uma semente fixa aleatória; primeiro verificar que o caminho não cruza legendas, rostos, texto original ou dados críticos. Gravações de tela cheia de sites e vídeos de postagens originais que precisam ser identificados diretamente decidem se deslizar com base no conteúdo, não forçando transição só para ter movimento. Entrada leva cerca de 0,25–0,35 segundos, pousando com tempo suficiente para leitura; dentro da mesma tomada, não mover aleatoriamente repetidamente. Adesivos usam
animator/cutaway/scene_sticker_slidein.html, não ativar o cartão de reação com moldura branca e Emoji antigo. - Limiar de ritmo visual: narração explicativa com imagem de pessoa pura por mais de 8 segundos não é permitido. O tempo conta da saída do visual auxiliar efetivo anterior até a entrada do próximo; acima de 8 segundos, deve ser marcado na tabela de cues com a explicação do porquê do espaço em branco. Nos primeiros 5 segundos, dar o título ou a primeira evidência. Esta é a linha de verificação de edição desta conta, não uma frequência fixa medida no vídeo de Mariah; não inserir Emoji ou cartões de texto repetindo a narração só para preencher segundos. Visual auxiliar efetivo deve ser página de fonte, operação de produto, stock real, gráfico, lista item por item ou novo estado visual com informação; legendas comuns, títulos fixos e mudanças de boca não contam. Detalhes completos e FAQ em
CONVENTIONS.md.
Passo Zero · Formato + Entrada (★ video-editor é a única entrada para todo o projeto)
video-editor é o diretor-geral——o usuário entra aqui para fazer vídeo, não precisa ir ao footage-finder / news-highlight / data-viz sozinho. Ao ser acionado, a primeira coisa é perguntar o formato com AskUserQuestion:
Este vídeo é vertical ou horizontal?
- 9:16 vertical (Douyin / Xiaohongshu / Video Account / Reels) → 1080×1920
- 16:9 horizontal (YouTube / Bilibili) → 1920×1080
- 3:4 tutorial prático (demonstração de gravação de tela / "como eu uso AI para fazer X") → 1080×1440 · usar submódulo
slidecast/
Formato segue o tipo de conteúdo: tutorial prático / demonstração de gravação de tela padrão é 3:4 (slidecast); outros tipos de narração (opinião / vlog / cultura geral) são 9:16. Não forçar narração comum no layout de gravação de tela 3:4, nem fazer tutorial prático em 9:16.
Atalho de decisão: se o usuário já disse o formato ("faz um 16:9" / "publica no YouTube" / "publica no Bilibili"), não perguntar, definir diretamente.
O formato determina o downstream:
| 9:16 | 16:9 | |
|---|---|---|
| tela do submódulo | 1080×1920 | 1920×1080 |
| stock real vazio | footage-finder --vertical | footage-finder (horizontal padrão) |
| cartão de notícias | news-highlight (versão vertical) | news-highlight (Root padrão 1920×1080) |
| gráfico de dados | data-viz (1080×1920) | data-viz (1920×1080) |
| compose | recipes/compose_dual.sh.template | recipes/compose_16x9.sh.template |
| zona segura | CONVENTIONS seção 3 | CONVENTIONS seção 1 linha 16:9 |
Esses sub-skills já suportam horizontal; video-editor é responsável por delegar + síntese final, o usuário só conversa com video-editor todo o tempo. 16:9 também tem um recurso extra person-pip (narração com rosto limpo → sem conteúdo, rosto em tela cheia; com conteúdo, rosto em janela pequena no canto inferior direito, ver CONVENTIONS seção 9 + template compose_16x9).
Após definir o formato, seguir para a rota de forma final abaixo.
Passo Um · Consulta de Rota (★ Executar imediatamente após acionamento)
Não presumir que o usuário quer o fluxo completo. Primeiro perguntar uma vez com AskUserQuestion. Dividir por "qual a forma final" (produto final), não por "o que você quer fazer" (ação)——a mente do usuário pensa no produto final, não no processo.
Qual o resultado final que você quer?
- Um vídeo completo com legenda: já tem o vídeo, só adicionar legenda → submódulo
subtitle/(não passa pelas três portas)- Um cartão de título / abertura: sobreposição alfa transparente de 4,5s → submódulo
opener/(não passa pelas três portas)- Um vídeo completo com efeitos: adicionar chyron / cutaway / animação de listagem → submódulo
animator/(passa pelas três portas)- Fazer um vídeo completo do zero: narração → título → efeito → legenda, tudo incluído → opener → animator → subtitle em sequência
- Tutorial prático narrado (3:4): narração → slide de janela de gravação de tela case-step + legenda, você sobrepõe gravação/rosto → submódulo
slidecast/(passa pelas três portas)
Padrão de numeração de opções: o prefixo das opções de AskUserQuestion usa apenas números puros 1 / 2 / 3 / 4, proibido ①②③④, ㋐㋑㋒㋓ ou caracteres com círculo / katakana——a fonte do usuário muitas vezes não suporta, resultando em renderização ilegível.
Atalhos de decisão (casos que podem ir direto sem perguntar):
| Fala do usuário | Vai direto para |
|---|---|
| "me ajuda a colocar legenda / adicionar legenda / queimar legenda" | 1 · subtitle/ |
| "fazer uma abertura / cartão de título / opener" | 2 · opener/ |
| "novo episódio da série X" / "fazer um episódio" / "produzir vídeo completo" | 4 · fluxo completo |
| contexto já está fazendo vídeo completo, quer adicionar chyron / cutaway | 3 · animator/ |
| "tutorial prático / demonstração de gravação de tela / como eu uso AI para fazer X" / série de 100 casos práticos de AI | 5 · slidecast/ (3:4) |
| "como a Maria adiciona artigos reais, reações humanas e imagens à narração vertical", e o usuário já deu o vídeo original | 3 · reaction_overlay; primeiro confirmar que o vídeo fonte é 1080×1920, ler recipes/reaction_overlay.md |
Princípio chave: 1 e 2 são operações de ponto único, não passam pelas três portas; 3 e 4 devem passar pelas três portas.
★ Fluxo de Trabalho das Três Portas (Obrigatório para opções 3 e 4, sem pular)
⚠ A opção de rota não é uma licença de renderização——o usuário escolher 3 ou 4 significa apenas "quer seguir o fluxo animator". Ao entrar no animator, deve seguir as três portas, parando em cada porta até o usuário confirmar explicitamente antes de avançar para a próxima. Mesmo que o usuário já tenha dito o título / número de cues / texto, isso não significa que ele permite pular as portas.
Porta 1 · Plano de texto ─► dar tabela de cues em markdown no chat
PARAR · esperar o usuário dizer algo como "OK / mudar X / cortar Y / confirmar"
❌ Não escrever nenhum cue HTML
❌ Não começar a renderizar
│
Porta 2 · Spec Review ─► escrever o HTML de cada cue
★ Primeiro executar node recipes/lint_layout.js --all <diretoria de cues>
(zona segura / tamanho mínimo de fonte / largura do texto / centralização, FAIL corrigir antes de continuar)
Depois gerar _review/spec_review.html
PARAR · dizer ao usuário "Abrir file:///<projeto>/_review/spec_review.html e ver, depois de feedback me responder"
❌ Não renderizar ProRes mov
❌ Não compor o vídeo completo
│
Porta 3 · Última chamada antes da renderização ─► AskUserQuestion: recap + judgment calls + escolha de formato de saída entre três
PARAR · esperar o usuário escolher
❌ Não presumir o formato de saída
│
Renderizar + compor + legenda
Se o usuário não disser "confirmar / OK / começar / renderizar / sim" ou expressão afirmativa clara, você ainda está na porta anterior.
❌ Contraexemplos (Não fazer assim)
| Comportamento errado | Perda |
|---|---|
| Usuário escolheu 4 + deu o título → você extrai narração + transcreve + escreve HTML + renderiza | Pula a porta 1 "mudar 1-2 linhas de texto já corrige", o checkpoint mais barato, economizaria 5-10 min + 10k tokens |
| Usuário diz "quero assim" → você decide "já que ele quer, então renderiza direto" | Pula a porta 2, erros visuais/tamanho de fonte no HTML custam 5x mais para renderizar novamente (30s de renderização × número de falhas) |
| Usuário na porta 2 feedback "cue 3 mudar X" → você muda e renderiza direto | Pula a porta 3 última chamada, não deixou o usuário escolher o formato de saída (sintetizar vídeo original / trilha broll transparente / ambos), pode renderizar 500MB ProRes a mais |
| Usuário não disse sim → você assume que quer avançar e avança | O usuário ainda está revisando, renderiza e sai errado, precisa refazer todo o ciclo |
✅ Exemplo correto
"Entrando no animator. Primeiro transcrever + dar tabela de cue plan markdown para você ver. Esta é a porta 1——não escrevo HTML nem renderizo, espero seu OK / mudança / corte."
Ao final de cada porta, usar frase explícita semelhante para dizer ao usuário "agora estamos na porta X, espero seu OK"——não avançar silenciosamente.
Detalhes do fluxo + lista de produtos específicos de cada porta + baseline de número de cues em animator/README.md.
Submódulos de Entrada
| Submódulo | O que faz | Documento de entrada |
|---|---|---|
opener/ | Cartão de título com serifa amarela de 4,5s, sobreposição alfa transparente | opener/README.md |
animator/ | chyron / cutaway / listicle / spec_review, fluxo de trabalho das três portas | animator/README.md |
subtitle/ | transcrição Whisper → overlay PNG com destaque de palavras-chave → queimar legenda. 9:16 usa add_subtitles.py; 16:9 vídeos longos devem usar make_events_16x9.py + burn_chunked_16x9.py (uma cadeia contínua pode travar, ver README) | subtitle/README.md |
slidecast/ | Tutorial prático narrado (3:4): narração → slide de janela de gravação de tela case-step com corte por timecode + legenda → mp4 de prévia + mov de camada transparente | slidecast/README.md |
reaction_overlay | Narração de pessoa como base, priorizando capturas de tela de fontes reais e reações humanas reais; material e permanência decididos pelo conteúdo, não por frequência fixa de Emoji | recipes/reaction_overlay.md |
Normas Compartilhadas
- Norma de entrega:
做内容/_运营文档/视频成片流水线-模板.md—— um vídeo = duas pastas com o mesmo nome (trabalho / entrega) + porta 3 três produtos padrão (vídeo final / camada de título 3:4 / linha do tempo) em~/Movies/<série>/<código do vídeo>/. Fluxo completo segue este modelo - Receita de produto de entrega:
recipes/deliverables.md(como renderizar a camada de título transparente · como gerar linha do tempo a partir do plano de cues · nomeação da pasta de entrega) - Porta de entrega P0: vídeo completo 9:16 após a porta 1 executar
python3 recipes/preflight.py plan <projeto>/preflight.json, antes de cada rodada de entrega executarpython3 recipes/preflight.py final <projeto>/preflight.jsone verificar frames extraídos, preencher review e passar novamente; verificar título de 0 segundos, preset de legenda, lacuna visual >8 segundos e obstrução de PIP/Logo/assinatura. Formato emrecipes/preflight.example.jsonerecipes/deliverables.md. - Norma visual:
CONVENTIONS.md(zona segura, paleta Hana, temporização de chyron, hierarquia de tamanhos de fonte, regras de clímax) —— qualquer submódulo deve ler antes de escrever HTML - Lint de layout (★ obrigatório na porta 2):
node recipes/lint_layout.js <cue.html>——puppeteer renderiza e verifica zona segura / tamanho mínimo de fonte 22px / largura do texto ≤920 / centralização / número de tipos de fonte, três predefinições 9:16·16:9·3:4 identificadas automaticamente, cues de animação julgadas pelo estado final. FAIL corrigir antes de mostrar spec review ao usuário. Elementos decorativos intencionalmente fora dos limites adicionamdata-lint-ignore - Auto-verificação de ambiente:
bash recipes/doctor.sh——máquina nova / erro de renderização executar primeiro (ffmpeg / whisper / Chrome / puppeteer-core / avconvert / fontes, 11 itens) - Receita de dupla saída ffmpeg:
recipes/compose_dual.sh.template(mp4 + alpha mov opcional) - Armadilhas conhecidas:
recipes/PITFALLS.md(broll_reel piscando / HyperFrames webm sem alpha / ffmpeg#escape / camada alfa cinza / caminho chinês TCC etc., 23 itens) - Índice de casos históricos:
recipes/examples.md(11 paradigmas de cue dos seus vídeos reais)
Estratégia de Dupla Saída
| Arquivo | Uso | Quando sai | Especificação |
|---|---|---|---|
<nome>_整片.mp4 | Prévia / publicação / revisão | Sai em cada iteração | H.264 yuv420p · CRF 20 · com áudio + sobreposição |
<nome>_broll层.mov | Sobreposição em software de edição (Premiere / AE / FCP) | Sai apenas quando o usuário diz explicitamente "versão final / sair camada de edição / sair camada ProRes / B-Roll only" | ProRes 4444 yuva444p10le · transparente · mudo |
Durante iterações, só sai mp4 do vídeo completo por padrão. A camada broll leva ~30s para renderizar + ~500MB de escrita em disco, não é necessária para revisão durante iterações.
⚠ A camada broll é sempre uma trilha completa sincronizada. Quando o usuário diz "B-Roll only", quer esta trilha completa, não é dar N cues em arquivos mov separados para ele mesmo editar.
A trilha completa alfa com cues não sobrepostas deve ser sintetizada usando concat: gap transparente + cue + gap transparente + cue, o gap é calculado com
ffprobebaseado na duração real da cue / número de frames. Não sobrepor cartões semitransparentes um a um em uma tela transparente[email protected]; isso faria com que cartões bege claro ficassem cinza escuro quando sobrepostos à narração final. Detalhes no item 23 derecipes/PITFALLS.mde emrecipes/compose_dual.sh.template.Antes de entregar a camada broll, deve fazer QA com fundo real: sobrepor o
<nome>_broll层.movfinal à narração original, extrair 4-8 quadros-chave / contact sheet, verificar cor, alfa, oclusão de rosto e timing.spec_review.htmlsó revisa HTML/animação, não substitui a verificação final de síntese ffmpeg.
Matriz de Decisão de Título (Quando o usuário diz "adicionar título / adicionar abertura / palavra-chave")
| O usuário diz | Padrão = | Parâmetros chave |
|---|---|---|
| "adicionar título" / "title card" / "abertura" / "opener" | opener/yellow.html (título grande com serifa amarela + subtítulo itálico branco) | alfa transparente · início do vídeo 0s · top-third (padding-top 280px) · 4,5s · ProRes 4444 mov |
| "enfatizar uma palavra no momento X" / "texto pop-up" | animator/chyron/chyron.html | cápsula amarela · top 16% (y≈307 centro) · 1-2s pop |
| "lista 1, 2, 3" / "três / quatro elementos" | animator/cutaway/scene_listicle.html | lista numerada revelada linha por linha · cartão top 280px |
| "cartão de dados em tela cheia / gráfico de comparação" / "mudar para dados X" | animator/cutaway/scene_blank.html | cutaway em tela cheia com fundo branco · caption top 280px · mp4 opaco |
Princípios chave:
- "Título" do vídeo = abertura 0s, padrão é esse. Mesmo que a narração só diga a frase aos 22s, o título ainda aparece aos 0s. Manter o formato da conta: título principal amarelo + subtítulo branco; título principal com apenas uma linha ainda mantém a camada branca, a menos que o usuário especifique explicitamente uma versão monocromática. Cena de título personalizada na porta 2 deve ser verificada contra
opener/yellow.htmlem cor e hierarquia. - Título de abertura = sobreposição alfa transparente sobre o talking head. Não é um plano independente com fundo dourado sólido.
- Cutaway de cartão de dados = tela cheia opaca, cobrindo o talking head; outras sobreposições (título / chyron) são transparentes por padrão.
Skills Complementares
hyperframes/hyperframes-cli— CLI HyperFrames (renderiza HTML → mov/mp4), dependência de renderização do submódulo de animação
Fora do Escopo Deste Skill (Delegado)
- Captura de material stock real (Pexels / Pixabay) → skill
footage-finder - Cartão de destaque de notícias → skill
news-highlight - Geração de roteiro de texto / TTS de narração → funcionalidade TTS do skill
hyperframes - Revisão de conformidade de conteúdo → skill
content-audit