Habilidade de Edição de Vídeo
Uma gravação crua de "talking head" geralmente tem de 20 a 40% de ar morto: pausas, "ums", falsos começos, a frase dita duas vezes. Cortar isso manualmente leva mais tempo do que gravar. Esta skill faz a primeira edição: ela lê a transcrição, planeja cada corte com um motivo, mostra o plano, renderiza a edição com zoom nos cortes abruptos e áudio limpo, escreve legendas e capítulos, e publica após um "sim". Tudo que ela precisa está nesta pasta.
Quatro compromissos:
- As palavras do usuário permanecem. Apenas pausas, palavras de enchimento, gaguejos, retomadas e intervalos que o usuário aprova são removidos. O significado nunca é editado.
- Planeje antes de renderizar. A lista de cortes é mostrada e aprovada primeiro.
- Nada é publicado sem um "sim".
- Apenas material que o usuário pode usar. A própria gravação do usuário, ou com permissão.
No Windows use py em vez de python3 em todos os comandos.
Passo 0: Configuração e a origem
Execute python3 scripts/check_setup.py: ele informa sobre ffmpeg, Pillow, rotas de transcrição e OpenCV
com o comando de instalação para o sistema do usuário. Necessário: ffmpeg e Pillow.
Pergunte, em uma única mensagem, apenas o que você não pode ver:
- Qual arquivo, e é dele?
- Para onde vai: YouTube (16:9), mídia social (vertical) ou ambos.
- Quão apertado: youtube (o padrão: pausas acima de 0,5 s cortadas, batidas naturais mantidas), tight (0,3 s, YouTube rápido e social) ou podcast (suave, sem zoom).
- Palavras que eles usam como vícios de linguagem e que são seguras para cortar ("tipo", "então", "sabe", "basicamente"). Essas carregam significado em outras frases, então são opcionais.
- Qualquer coisa que deve permanecer como está (uma demonstração, uma piada com pausa, uma leitura de patrocinador).
Passo 1: Transcrever
python3 scripts/transcribe.py VIDEO --out work/ --terms "Nome do Produto, Jargão, Nome do Convidado"
--terms lista nomes e jargões para que sejam escritos corretamente; corrija o que ainda for ouvido errado com
"replace" no edit.json antes de renderizar, porque legendas queimadas em um vídeo postado não podem ser
corrigidas.
As mesmas três rotas de sempre, com a troca explicada uma vez:
| Rota | Como | Custo e velocidade |
|---|---|---|
| Transcrição existente | --from legendas.srt | Grátis, instantâneo; tempo das palavras estimado e a maioria dos "ums" ausente, então o corte de enchimentos é mais fraco |
| Groq ou OpenAI | GROQ_API_KEY ou OPENAI_API_KEY | Groq cerca de $0,04 por hora de áudio, um ou dois minutos por hora |
| Local | pip install faster-whisper | Grátis e privado; aproximadamente metade a uma vez a duração do vídeo com --model small |
O transcritor é instruído a escrever as palavras de enchimento; o Whisper as descarta caso contrário. Sons que ele ainda perde (um "mm" que ninguém escreveu, uma respiração) são encontrados no próprio áudio pelo editor.
Passo 2: Planejar a edição
Leia work/transcript.txt uma vez, inteiro. Em seguida, escreva edit.json (formato no topo de
scripts/edit_video.py):
- Estilo:
"style": "youtube","tight"ou"podcast"(limiares emreferences/editing-rules.md). Pausas acima do limite encolhem para uma batida natural: mais curta no meio da frase, mais longa após uma frase, mais longa na mudança de tópico. - Enchimentos: a lista padrão ("um", "uh", "er", "hmm", "mm") é segura. Adicione as palavras de hábito do usuário
em
extra_fillerssomente quando elas pedirem. - Digressões e seções mortas: uma digressão, um "você consegue me ouvir?", uma longa preparação antes do
ponto principal. Adicione-os a
cutcom um motivo e informe o usuário. - Proteja qualquer coisa que deva permanecer com
keep, incluindo pausas silenciosas. - Entrevistas com cartões de pergunta ou um entrevistador visível: mantenha as perguntas (cerca de 3
segundos de cada cartão em
keep) a menos que o usuário diga o contrário; sem elas cada resposta começa com "Então..." e sem contexto. - Nomes ouvidos errado:
"replace": {"Cyrus Rex": "OSIRIS-REx"}. - Capítulos (para YouTube): 3 a 10 capítulos a partir das mudanças de tópico, primeiro em 0:00, cada um com pelo menos 10 segundos, nomeados pelo que o espectador obtém ("Por que a câmera falhou", não "Parte 2"). Tempos no vídeo original; o script os ajusta.
Em seguida, faça o plano:
python3 scripts/edit_video.py edit.json --transcript work/transcript.json --out edited/ --plan
edited/edit-plan.md fornece a nova duração, quanto veio do interior da fala versus pausas longas
e cartões, o ritmo em palavras por minuto, e cada remoção acima de um segundo com seu motivo
e palavras. Leia cada linha de retomada e gaguejo, e a lista de "possíveis retomadas": duas frases
completas que começam da mesma forma nunca são cortadas automaticamente; decida cada uma e adicione-a a
cut se for uma retomada real. Mostre ao usuário o resumo, as retomadas, as digressões que você escolheu e
os capítulos, e obtenha um "sim".
Passo 3: Renderizar
python3 scripts/edit_video.py edit.json --transcript work/transcript.json --out edited/
O que faz:
- Corta pausas acima do limite para uma batida natural, além de enchimentos, gaguejos, retomadas e cada
intervalo
cut. Remoções mais curtas que o mínimo do estilo (0,4 s no youtube) são deixadas de lado: um corte abrupto custa mais do que economiza. - Coloca cada corte ouvindo: as bordas das palavras se movem para onde o som realmente para e começa, para que os finais das palavras não sejam cortados, e sons que a transcrição perdeu (um "mm" não escrito) são encontrados.
- Olha também para a imagem: cartões de título e mudanças de cena são cortados de forma limpa, nunca deixando alguns quadros de um cartão.
- Renderiza em grupos de pedaços em uma passada cada, para que som e imagem permaneçam sincronizados não importa quantos cortes existam.
- Zoom: alterna entre o quadro completo e um zoom de 1,1x onde um corte abrupto precisa ser
escondido: sempre em um corte que removeu um segundo ou mais, caso contrário apenas após 4 segundos no mesmo
enquadramento, nunca em um corte para uma nova tomada de câmera.
"punch_in": 0desliga. - Áudio: ganho para um nível de trabalho, filtro de ruído, redução de ruído definida a partir do ruído ambiente medido (pulado quando a sala já está silenciosa), compressão suave, um limitador de pico e uma passagem de loudness em duas passadas para -14 LUFS.
- Legendas: sempre escreve
captions.srt(2 linhas de no máximo 42 caracteres, de 1 a 7 segundos cada, sem quebra de linha após uma palavra pequena ou dentro de um nome) para upload no YouTube."captions": {"burn": true}as desenha no vídeo para mídias sociais, onde muitas pessoas assistem sem som; versões verticais queimam as legendas por padrão. Não queime legendas em um vídeo do YouTube que também recebe o SRT: espectadores com legendas ativadas veriam ambas. - Vertical:
"format": "vertical"cria uma versão 1080x1920 cortada emfocus_x.
Ele escreve edited/edited.mp4, captions.srt, chapters.txt, edit-report.md e
manifest.json.
Verifique antes de mostrar ao usuário: abra cuts.jpg (quadros imediatamente antes e depois dos maiores
cortes: procure por flashes de um cartão, um pulo em uma tomada diferente, uma expressão congelada) e leia os
avisos em manifest.json (sincronia, ritmo acima de 190 palavras por minuto, loudness). Corrija e renderize novamente
quando uma retomada manteve a tomada errada, o ritmo parece sem fôlego (um estilo mais suave) ou um corte
termina mal (keep naquele ponto).
Passo 4: Publicar com WoopSocial
Como conectar, fazer upload e publicar: references/woopsocial.md. Versão resumida:
social_accounts_list; não conectado: o único caminho de conexão para este agente (plano gratuito: 2 contas sociais), entãooauth_create_authorizationpor plataforma.- Faça upload de
edited.mp4com uma sessão de upload (media_uploads_create_sessioncom o tamanho em bytes demanifest.json,python3 scripts/upload_parts.py session.json edited/edited.mp4,media_uploads_complete_session). - YouTube:
title(principais palavras de pesquisa primeiro, abaixo de 70 caracteres),privacye uma descrição que começa com uma linha sobre o que o espectador obtém, depois os capítulos dechapters.txt. Faça upload decaptions.srtno YouTube Studio depois (WoopSocial não envia arquivos de legenda). - Mostre a publicação (arquivo, título, descrição, conta, hora com fuso horário) e obtenha um "sim" claro.
Em seguida,
posts_createeposts_get.
Passo 5: Leia os resultados
Após uma semana, social_account_posts_list: visualizações, curtidas, comentários onde relatados, com a
data da coleta; ausente significa "não relatado". Retenção e duração média de visualização estão no
YouTube Studio; pergunte ao usuário por elas. Se os espectadores caírem cedo, a próxima edição terá uma abertura
mais apertada; se caírem em um capítulo, essa seção estava muito longa.
Padrão de qualidade
Um editor profissional entregaria isso? Rejeite se uma palavra estiver cortada, um corte cair no meio de uma respiração com um estalo, um zoom mudar a cada poucos segundos, o ritmo não deixar espaço para pensar, ou o significado mudou.
Casos extremos
- Duas pessoas na câmera: mantenha
formatna origem; zooms ainda funcionam em um plano aberto. - Gravação de tela com voz: defina
"punch_in": 0. - Música sob a voz: a detecção de silêncio vê música como som; defina
"voiced_gaps": false. - Gravações muito longas (mais de uma hora): funciona, mas o tempo de renderização é aproximadamente a duração do vídeo; planeje primeiro, renderize uma vez.
- Sem fala por um trecho de propósito (uma demonstração):
keep.
Referências
references/editing-rules.md: limiares, enchimentos, padrões de retomada, zooms, cadeia de áudio, legendas e capítulos, com fontes.references/woopsocial.md: conectar, fazer upload, publicar e ler resultados.