Yap Video Editor (Editor de Vídeo Yap)
Transforme gravações brutas de pessoas falando diretamente para a câmera em um curta-metragem bem editado e projetado. Tudo é executado localmente com ffmpeg + Whisper local; nenhuma chave de API é necessária (ElevenLabs Scribe é um transcritor opcional melhor).
Sintetizado a partir de uma leitura revisada de segurança de: browser-use/video-use, adukhan98/video-edit, chrislema/videoeditor, zyziyun/video-studio, eyadhussain00-hub/Videoediting (apenas ideias), AgriciDaniel/claude-shorts, Barty-Bart/motion-graphics, ZiadAbdelkarim/beat-synced-edit, 6missedcalls/video-editing-skill, haidrrrry/claude-remotion-skill, digitalsamba/claude-code-video-toolkit, blixvip/easyedit (apenas ideias).
Os números exatos estão em references/params.md. Leia-o antes de construir filtergraphs. references/pipeline.md é o padrão de implementação testado em batalha de edições reais (planejador de cortes, renderizador de L-cut, sobreposição de tipo Pillow, adesivos/adereços, master 4K): siga-o em vez de reinventar.
Regras rígidas
- Planeje primeiro, depois espere. Após transcrever, mostre um plano em inglês claro (gancho, o que será cortado, abordagem de zoom/legenda/SFX, duração, formato) e obtenha um sim antes de renderizar. As escolhas de gosto (linha de gancho, quais frases vão, estilo de legenda) são oferecidas como um menu curto com uma recomendação, nunca escolhidas silenciosamente.
- Nunca sobrescreva a fonte. Escreva em
<pasta>/edit/. Mantenha os intermediários até o usuário aprovar, então ofereça a limpeza (liste arquivos + tamanhos primeiro; nunca exclua automaticamente). - Nunca corte dentro de uma palavra. Encontre as bordas pelo envelope de áudio, não pelos tempos das palavras do Whisper (o Whisper marca os inícios tarde e os finais cedo, o que corta a primeira/última sílaba): retroceda do início da palavra até 0,25 s e avance do final da palavra até 0,20 s enquanto a energia da fala permanecer acima do piso + 8 dB, depois adicione 30 ms de margem. Fade de áudio de 15-30 ms em cada junção.
- Re-codifique os cortes, nunca
-c copypara qualquer coisa com precisão de quadro (cópia cai em keyframes e causa falhas). - As legendas vão por último, depois de zooms e sobreposições, para que os zooms nunca as cortem.
- Comprove. Renderize, depois inspecione: quadros em cada corte +/-1,5 s, folha de contato, leitura de loudness
ebur128. Máximo de 3 passagens de correção, depois relate o que resta. Relate números; você não pode ouvir o áudio. - Mídia de terceiros: apenas de propriedade do usuário, CC0/CC-BY ou gerada. Nada de baixar filmes/música do YouTube. Nunca leia, envie ou reutilize tokens de login do Claude/Anthropic ou outras credenciais; nunca copie as configurações de hook
.claude/de outros repositórios. - Pergunte antes de baixar modelos (whisper ggml-medium tem ~1,5 GB) ou instalar pacotes. Informe nome, fonte, tamanho.
Pipeline
0. Ingestão e briefing
ffprobecada clipe: resolução, fps, duração, áudio. Detecte orientação.- Pergunte apenas o que importa (use um menu curto): plataforma/ aspecto alvo, duração alvo, vibe (veja Vibes), estilo de legenda, música sim/não, quaisquer linhas obrigatórias. Se o usuário disser "apenas faça", padrão para: 9:16, 30-60 s, vibe "criador", legendas em negrito, SFX leve, sem música.
1. Transcreva (nível de palavra, literal)
- Prefira: mlx-whisper (Apple Silicon) ou faster-whisper
medium.en/distil-large-v3, timestamps de palavras ativados. Use medium, não small: small perde falsos inícios. Opcional: ElevenLabs Scribe se o usuário tiver uma chave (nunca escreva a chave na pasta do projeto). - Mantenha preenchimentos na transcrição (literal) para que possam ser cortados. Armazene em cache a transcrição.
- Peculiaridades do Whisper: ele engole pausas longas em uma palavra (uma palavra durando segundos é uma pausa engolida; use um envelope RMS para spans de fala verdadeiros), inicia palavras 0,2-0,4 s atrasado após uma pausa e alucina em caudas silenciosas. Aparar no final do conteúdo real. Para o tempo das legendas, retranscreva por segmento final.
- Revise nomes/termos; aplique uma lista de correções (
chat gpt->ChatGPT).
2. Escolha a história (para yaps longos)
- Pontue segmentos candidatos 0-100:
gancho*0,30 + coerência*0,25 + emoção*0,20 + valor*0,15 + pay-off*0,10. Ganchos fortes: afirmação ousada/contraditória, lacuna de curiosidade, número específico, interrupção de padrão. Fraco: "Então hoje eu quero falar sobre...". Teste independente: sem "como eu disse antes", sem pronomes soltos. - 15-55 s cada (ponto ideal 25-40), pontuação >= 60, ajuste o início a um início de palavra/frase (janela de 1,5 s) e o final a um final de frase (janela de 3 s) + 300 ms de margem.
- O gancho é escrito/escolhido POR ÚLTIMO: ofereça ~5-12 aberturas candidatas numeradas com texto, tipo e duração. Abertura fria com resultado primeiro ou afirmação ousada vence uma introdução lenta. Os primeiros 1-3 s decidem tudo.
- Para yaps de uma só tomada: reordene apenas se melhorar o gancho; caso contrário, mantenha a ordem do falante.
3. Corte (aperte)
Perfis de aperto (compressão de pausa; as pausas são encurtadas, não excluídas):
| perfil | comprimir pausas acima de | manter |
|---|---|---|
| suave | 0,80 s | 0,35-0,70 s |
| padrão | 0,45 s | 0,18-0,40 s (0,30 após final da frase) |
| apertado (padrão para yap) | 0,25 s | 0,08-0,20 s |
- Detecte: envelope RMS em saltos de 10 ms, fala = piso de ruído + 8 dB. Alternativa:
silencedetect=noise=-30dB:d=0,5. - Remova: hums/ahs, gaguejos e reinícios, palavras repetidas, falsos inícios, retomadas (a tomada anterior vai), slate/cauda, limpadores de garganta ("Então,", "Basicamente"). Preenchimentos semânticos ("tipo", "sabe") apenas quando o áudio os isola. Mantenha repetição deliberada para ênfase.
- Cortes de baixa confiança ou ambíguos (retomadas, preenchimentos mesclados, ruído ASR) são confirmados com o usuário, não aplicados automaticamente.
- Verifique cada junção: retranscreva uma janela em cada junção; ela deve ler como as palavras pretendidas. Espere 2-3 rodadas. Após o corte completo, diferencie as palavras de conteúdo em relação ao plano; falhe se alguma for perdida.
- Verificação visual: evite bordas de corte onde o falante olha para baixo em anotações ou no meio de uma piscada/movimento de cabeça; finalize apertado (<=30 ms) em bordas de movimento de cabeça.
- Peças exatas de quadro: quantize cada peça para quadros inteiros (
n = round(dur*fps)) e planeje a linha do tempo de saída a partir delas, ou as legendas vão derivar (~1 s em 40 cortes). - L-cuts: renderize imagem e som separadamente. Em cada nova linha (não compressões de pausa interna) o corte de imagem cai 2 quadros após o corte de áudio; compressões internas permanecem cortes secos. Suaviza cortes de salto sem erro visível de sincronia labial.
- Olhando para baixo / para anotações: em trechos onde o falante olha para baixo entre frases, aperte mais (pausas acima de 0,10 s, mantenha 0,03 s de cada lado). Olhares para baixo durante a fala não podem ser cortados; esconda-os com um punch-in ou um adesivo/b-roll.
- Mantenha os momentos humanos que o usuário pedir (uma risada, uma reação) como intervalos protegidos com bordas brutas; apare-os por segundos exatos quando solicitado ("corte 0:09-0:11").
- Ritmo: um novo evento visual (zoom, ênfase de legenda, gráfico, b-roll) a cada 1,5-4 s; nenhum quadro estático acima de ~8 s. Aceleração opcional de 1,1-1,25x no corpo (nunca acima de ~1,3x, soa falso; gancho até 1,5x é o teto).
4. Zoom (reconhecimento facial)
- Rastreie o rosto: OpenCV Haar (
opencv-python-headless<5) ou MediaPipe; amostre a cada 0,5 s por seção, pegue a mediana, rejeite detecções abaixo de 0,6x a largura mediana, banda morta de 2% da largura do quadro, nunca panorama dentro de uma seção. Se uma seção tiver menos de 2 detecções, pegue emprestado de um vizinho. - Escada de zoom por seção (3-6 s cada): normal 1,0x, ênfase ~1,15-1,25x, crítico ~1,3-1,6x (paisagem). Para 9:16 a partir de 16:9 use frações de altura bloqueadas 1,0 / 0,92 / 0,85 (mais apertado parece desconfortável).
- Misture por duração: ~60% normal / 30% ênfase / 10% crítico. Primeira seção normal. Nunca mais de 2 seções consecutivas no mesmo nível. Zoom de ênfase no máximo 1 em cada 4 frases.
- Escolha de estilo (pergunte ou infira da vibe):
- Punch-ins de corte seco (padrão para yaps com cortes de salto): alterne 1,0x e 1,15x nos segmentos de corte de salto, comece com zoom no gancho, frases de ênfase em ~1,3x.
- Push-in suave em crescendos:
scale=w='iw*z(t)':h='ih*z(t)':eval=framedepoiscropde tamanho fixo, ease-out cúbico (1-(1-t)^3), 0,4-0,5 s de entrada. Teste em um clipe de 2 s primeiro; zoompan é instável. - Punch-and-stay (1,16x, 0,5 s) 1-2 vezes por vídeo no ponto alto.
- Enquadramento vertical: rosto a ~30% do topo do crop;
cy = min(face_cy - 0.3*ch, head_top - 0.03*ch). - Efeitos de impacto opcionais apenas em picos: tremor, flash branco de 2 quadros, divisão RGB, rampa de velocidade (veja params).
5. Legendas (animadas, nível de palavra)
- Gere
.asslibass a partir de timestamps de palavras (apenas instâncias de fonte estáticas; fontes variáveis travam o libass). Retranscrição por segmento para tempo preciso. - Padrões: 1-3 palavras por cue (<=18 caracteres), quebre em pontuação e pausas >=0,3 s, cue mínimo 0,35 s (cresça para 3 palavras em vez de piscar), segure 0,12 s após a última palavra. Fonte ~4,6% da altura da tela 1920 (~88 px), ExtraBold, contorno pesado ou sombra suave.
- Visual (renderize 3 em um quadro real como grade e deixe o usuário escolher):
- Negrito: Montserrat 800, MAIÚSCULAS, branco, palavra ativa amarela
#FFD700, contorno preto de 3 px, pop-in de mola. - Saltitante: fonte display, 1-2 palavras, cores de destaque rotativas, overshoot 0,7 -> 1,2 -> 1,0.
- Limpo: Inter 700, maiúsculas/minúsculas naturais, 3-5 palavras, fade suave.
- Hormozi-lite (alternativa): branco com contorno preto, centralizado.
- Negrito: Montserrat 800, MAIÚSCULAS, branco, palavra ativa amarela
- Ênfase: ~1 palavra-chave em cada 4 palavras recebe cor/escala 112%; números/dinheiro automaticamente coloridos (ex.
#3CE07A); uma palavra-chave por grupo de legenda recebe tratamento de tamanho 2-4x na vibe "projetada". Pop na palavra falada: escala 108-112% suavizada em ~110 ms. - Posicionamento: respeite as zonas seguras da plataforma (área segura universal 9:16 x60-940, y285-1480). Legendas y do Reels ~1360, TikTok ~1400, Shorts ~1440. Nunca sobre a boca/queixo. Linhas nunca excedam 4 palavras, empilhamento equilibrado.
- Nenhuma face display condensada como padrão para legendas do corpo (lê apertado).
Sistema de tipo criador (comprovado em edições reais; usuário disse "coisa de criador de conteúdo real, mas limpa"):
- Corpo: Gotham Narrow Black (ou Montserrat 800), MAIÚSCULAS, branco, ~70 px a 1080 w, traço escuro + sombra projetada desfocada suave. As palavras aparecem conforme são faladas; apenas a palavra mais recente está ativa (amarelo + pop de 112% suavizando ao longo de 3 quadros). Nunca duas palavras destacadas ao mesmo tempo.
- Sem pontuação nas legendas (mantenha apóstrofos e palavrões mascarados como
m*rda,p*rra). - Palavras-chave (produto, nomes, números, o tópico): Ultra condensado (Gotham XNarrow Ultra), 1,5x, amarelo, inline na linha de base.
- Destaque de script (SignPainter / uma script brush), creme, inclinado ~6 graus, para 4-6 palavras emocionais por vídeo no máximo.
- Grandes batidas (ponto alto, tese, revelação do produto): batida Ultra condensada 1,28 -> 1,0 ao longo de 4 quadros, palavra por palavra, 200-250 px, abaixo da boca (verifique se o zoom punch-in move o rosto para baixo).
- Cartões de momento: texto que o falante não disse, mas que o momento merece (ex. "ri em rico" em script sobre uma risada).
- Construção de série/título: cada linha de título aparece com sua palavra falada (linha display condensada / linha script / linha de cor da marca / small caps rastreadas), colocada abaixo do queixo, nunca sobre a boca.
- Masque palavrões nas legendas apenas quando solicitado; o áudio permanece como gravado.
- Pergunte antes de adicionar rótulos persistentes (contadores de dias, tags de série); os criadores geralmente preferem sem.
5b. Adereços, adesivos e cutouts (opcional, alto impacto)
- Referências a pessoas reais/marcas (ex. "Bruce Wayne", "Alfred", um carro): mostre UMA VEZ na primeira menção como um recorte de adesivo com contorno branco (alpha MaxFilter ~19 px sob o recorte), pop-in com overshoot (0 -> 1,12 -> 1,0 em 0,22 s), balanço suave (+/-2,5 graus), ~1,9 s, pop-out; coloque no canto superior esquerdo/direito ao lado da cabeça, nunca sobre o rosto. Combine com um SFX (whoosh, ou temático: campainha para um mordomo).
- Objetos podem se mover: ex. um recorte de carro dirige pela parte inferior na palavra falada (smoothstep através de ~2 s, pequeno salto, 2 cópias fantasma de velocidade com 18%/32% de alfa), com um SFX de passagem de motor.
- Origem: ativos do usuário primeiro; para pessoas reais, use fotos com licença aberta (Wikimedia Commons CC BY / CC BY-SA / PD) e informe ao usuário a linha de crédito; remova fundos com uma ferramenta disponível (ex. uma API de remoção de fundo ou rembg) após perguntar. Uso pessoal/social apenas, a menos que o usuário limpe os direitos.
6. Design de som
Ordem de trabalho: música (se houver) primeiro, imagem depois, SFX por último.
- Cues: whoosh em mudanças de layout/cena e grandes movimentos de câmera (comece 2 quadros antes; comece pelo tempo de ataque antes do quadro de contato); pop na entrada de gráfico/palavra-pop; impacto/sub-drop UMA VEZ no gancho ou revelação; riser que TERMINA no próximo hit; tick/flick com moderação em destaques; digitação = teclas.
- Moderação (mais importante): SFX marcam mudanças, não cada palavra. Nada em preenchimentos. Cerca de 8 em 18 s lê como projetado; cerca de 20 lê genérico. Limite de densidade: 2 por janela de 2 s para pessoa falando. Mesmo SFX dentro de 1,5 s alterna variante e reduz 1,5 dB por repetição. Escada de intensidade: yap casual = esparso; hype reel = som na maioria das batidas; corporativo = quase nenhum.
- Fontes: biblioteca do usuário, ou gerar (pacote de efeitos sonoros/gerado ElevenLabs), ou a abordagem de kit sintetizado (whoosh/pop/tick/impact/riser construídos com numpy/ffmpeg; sem downloads). Coloque pelo pico transitório, +/-1 quadro.
- Música: opcional. Cama com duck de 10-15 dB sob a voz (
sidechaincompress=threshold=0.02:ratio=8:attack=20:release=350), ganho da música em torno de -18 dB quando com duck. Para vibes de corte de batida: detecte batidas (librosa), corte a cada batida / 2 batidas / compasso, verifique se os cortes caem dentro de 3 quadros. - Cadeia de voz, mix, limitador e alvos de loudness estão em
references/params.md.
7. Visual
- Apenas correção de luz suave: predefinição de punch quente ou grade automática limitada a +/-8%. Não desfoque pessoas falando estáticas (parece falso). Grão opcional 3-6% e vinheta sutil para a vibe "projetada".
- Gravação Log (DJI Osmo Pocket 3 D-Log M, 10-bit HEVC; a câmera marca como bt709 mesmo sendo log): converta primeiro com o LUT DJI D-Log M -> Rec.709, depois corrija por cima. Trabalhe em 16-bit:
format=rgb48le,lut3d=file='<lut>.cube':interp=tetrahedral. O LUT escurece os médios; para tomadas internas de baixa luz de peles mais escuras, levante os médios em vez de esmagar. Ponto de partida testado (visual: pretos ricos, sala ligeiramente fria, pele natural):curves=master='0/0 0.04/0.025 0.25/0.31 0.6/0.70 0.9/0.92 1/0.98',colorbalance=rs=-0.025:bs=0.04:rm=0.03:bm=-0.015,eq=saturation=1.06,unsharp=5:5:0.3. Sempre renderize raw | LUT | grade lado a lado em 2 quadros e verifique antes da renderização em lote. Corrija tomadas individualmente quando a iluminação mudar; mantenha a taxa de quadros da fonte (24000/1001). - Clipes verticais Pocket 3 são 1728x3072 (ou 2160x3840): espaço de manobra suficiente para 1,15-1,3x de punc…
[...truncado para tradução]