Communitygithub.com

Edição de Cortes (sem API)

Esta skill produz um corte vertical (1080×1920) para Reels do Instagram e TikTok, do início ao fim, sem usar APIs. Ela abrange pesquisa e download, ranqueamento, roteiro, corte preciso, conferências e animação no HyperFrames com Whisper local.

Edição de Cortes (sem API)란 무엇인가요?

Esta skill é um guia completo para a criação automatizada de cortes verticais (1080×1920) para Reels e TikTok, sem depender de nenhuma API externa. Ela foi desenvolvida a partir da experiência prática do canal de cortes do Raul Sena e cobre todas as etapas: desde a pesquisa e download de fontes (evitando bloqueios de IP com espaçamento adequado), ranqueamento de falas com base em uma régua de viralidade, roteirização, corte preciso que nunca interrompe uma palavra, conferências de fala e áudio quadro a quadro, animação da metade superior em estilo 'papel recortado' no HyperFrames e renderização final. A skill suporta dois modos: 'Reels de vídeo real' (para perfis institucionais) e 'Papel recortado' (para canais de opinião). Ela utiliza ferramentas locais como Whisper (via HyperFrames ou faster-whisper), alinhador forçado MMS_FA e scripts Python/Node. A skill é distribuída como um conjunto de scripts e referências, e o usuário deve executar comandos específicos em ordem (como `pausas.py`, `cortar.py`, etc.) para produzir o corte final.

지원 대상✓Claude Code✓Codex CLI~Cursor
npx skills add MickaelAlecsander/edicao-de-cortes

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Edição de Cortes (sem API)은(는) 무엇을 하나요?

Esta skill reúne tudo o que o canal aprendeu editando cortes: pesquisa e download, ranqueamento, roteiro, corte, conferências e animação. Cada regra veio de um erro que já foi ao ar ou quase foi. Ela roda num ambiente sem API nenhuma:

  • Editar e renderizar: o HyperFrames (npx --yes [email protected] …).
  • Ler e ouvir o áudio: o Whisper local (whisper.cpp pelo HyperFrames, ou faster-whisper).
  • Medir o tempo de cada palavra: o alinhador forçado local (MMS_FA, torchaudio) e o envelope do áudio.

Dois modos: escolher antes de começar

ModoQuandoModelo
Reels de vídeo realPerfil institucional ou de marca (ex.: @amigosdobem): a pessoa ou a ação na tela inteira, manchete, nome e função, imagens de cobertura, logo e legenda. Pouca ou nenhuma animação.assets/modelo_reels/ (ver o LEIA-ME.md dele)
Papel recortadoCanal de cortes de opinião (o do Raul): a metade de cima animada em papel, o apresentador embaixo e telas cheias de animação.assets/modelo/ e references/animacao-hyperframes.md

Na dúvida, perguntar qual dos dois. Tudo o que vem antes da animação (tema, roteiro, corte sem comer palavra, conferências de fala e de áudio, legenda, área de segurança, finalização e entrega) vale igual para os dois. No reels de vídeo real, a Etapa 3 é o montar_reels.py no lugar das cenas, e as regras de personagem, papel e telas cheias de animação não se aplicam.

Regras de ouro (valem em toda etapa)

  1. Sem API. Nada de chave da OpenAI ou de qualquer serviço pago. O Whisper local dá o TEXTO. O tempo fino vem do alinhador MMS_FA e da pausa real no envelope (scripts/pausas.py). O Whisper não é prova de tempo: no C29, o large-v3 pôs palavras até 1,4 s fora do lugar, e cada erro virou uma ponta errada.
  2. Aprovação antes de avançar. Roteiro aprovado → edição → animação → prévia. Nada é agendado ou publicado sem o "pode agendar" do dono do canal. Quando ele pedir "faz até o final", as aprovações do meio se juntam numa só: a da prévia.
  3. Nunca cortar no meio de uma palavra. A ponta é sempre um vale de energia abaixo de −40 dB, antes da palavra SEGUINTE. Toda emenda é ouvida de novo depois de montada (scripts/ouvir_emendas.py).
  4. O Raul inteiro, centrado, sem zoom e nunca travado. A imagem é sempre a do mesmo instante do áudio; em podcast, ela fica em quem está no raciocínio, e quem fala se marca em todo corte com 2 pessoas. Cabeça nunca cortada. Na tela dividida da fonte, o painel dele preenche a janela de baixo; nada de laterais desfocadas. Não pode haver quadro parado com fala. Foto ou gráfico em tela inteira na fonte vai para debaixo de uma TELA CHEIA da animação.
  5. A legenda fica do começo ao fim, de 1 a 3 palavras, com palavrão censurado (F**A).
  6. Área de segurança sempre. Nada embaixo da busca do TikTok, nada saindo pelas laterais, nada embaixo dos botões ou do texto do post. scripts/zona_segura.mjs precisa dar ✓ antes de todo render.
  7. Tela cheia: 3 vezes de 5 s ou mais em vídeo de até 2 min, 4 vezes acima de 2 min. A 1ª vem logo após o gancho.
  8. A melhor faixa de áudio (o Opus do YouTube), um mínimo de recompressão e a saída em −14 LUFS. O efeito sonoro fica sempre por baixo da fala.
  9. Download espaçado. Um pedido por vez, nunca em rajada, com folga entre eles (scripts/baixar.py já faz isso). Um IP marcado com 429 só volta com tempo. O cliente web_safari,mweb serve só para LISTAR vídeos e ler os dados deles (título, idioma, canal). Com ele a legenda some ("has no subtitles" em todo vídeo) e a resolução vem falsa (360p), então legenda e mídia vão no cliente padrão.
  10. Nunca apagar de vez. O que sai vai para _lixeira/, e quem esvazia é o dono do canal. Nunca digitar senha nem token: o login é sempre a própria pessoa quem faz.

Instalação (uma vez por máquina)

O jeito mais fácil: o comando de um passo do README (instalar.ps1 no Windows, instalar.sh no Mac) instala os programas que faltam, baixa a skill e roda o scripts/instalar.py.

O Python dos scripts: se existir o arquivo .python na pasta da skill, todo python dos comandos desta skill é o caminho escrito nele (ex.: ~/.venv-cortes/bin/python). O instalador cria esse ambiente quando o Python do sistema recusa o pip (PEP 668: o do Homebrew no Mac, o do Debian/Ubuntu).

python scripts/instalar.py (com o Python 3.11+) prepara a máquina numa rodada só. No fim, ele diz "✓ pronto para editar" ou lista o que faltou. Ele faz cinco coisas:

  1. Confere o Python, o ffmpeg e o ffprobe, o Node 18+ com o npx e o Chrome. O que não sai por pip ou npm, ele diz como instalar no seu sistema.
  2. Faz o pip install só do que falta (faster-whisper, torch e torchaudio de CPU, numpy, scipy, soundfile, opencv, yt-dlp). O que já está instalado não é atualizado nem rebaixado.
  3. Faz o npm install playwright-core em scripts/, que é de onde o zona_segura.mjs e o erros_js.mjs o importam.
  4. Baixa o Whisper large-v3 (~3 GB) e o MMS_FA (~1,2 GB) e aquece o npx --yes [email protected] e o Chrome do render.
  5. Faz o autoteste: o --help de 3 scripts, o node --check dos .mjs e o assets/modelo/ montado numa pasta temporária.

Ele tem três opções:

  • --so-conferir: só confere e não instala nada.

  • --sem-modelos: pula os modelos.

  • --modelo-whisper medium: para máquina fraca. Depois, passe --modelo medium ao transcrever_local.py.

  • Whisper do HyperFrames (opcional): npx --yes [email protected] transcribe <arquivo> -e whisper -m large-v3 -l pt --json. Ele precisa do whisper-cpp, e o npx --yes [email protected] doctor diz se ele está instalado.

  • O que precisa de internet (o resto roda offline):

    • baixar as fontes (yt-dlp);
    • na 1ª vez, os modelos (o Whisper large-v3 e o MMS_FA) e o Chrome do render; o instalador já baixa os três;
    • o GSAP do CDN, em todo render;
    • as fontes do Google Fonts, na 1ª montagem (depois ficam guardadas em ~/.cache/hyperframes/fonts).
  • Testar a máquina a qualquer hora: python scripts/instalar.py --so-conferir.

Estrutura do projeto

<projeto>/
  _fontes/            vídeos e áudios baixados (o <id>_opus.mkv é a fonte do corte)
  _pesquisa/          legendas, transcrições (<id>_palavras.json), radar e notas
  _lixeira/           o que sai (fontes depois de publicadas etc.)
  cortes/cNN-slug/    um corte: ROTEIRO.md, cortes_gerar.py, cortes.json, pos_cortar.py, _cenas.js, montar.py,
                      gera_som.py, som.json, capa/, post.json, assets/ (raul.mp4, raul.wav, tempos.json, dados.js),
                      renders/ (etapa3_bruto.mp4, etapa3.mp4, cNN_previa.mp4, cNN_capa.jpg)
  LOG_CORTES.md       uma entrada por corte (id da fonte, o que foi ao ar, o que o dono decidiu) e as "Lições acumuladas";
                      sem ele, o ranking_shorts.py não tira nenhum id já usado
  REGUA.md            as correções do dono à régua (ler antes de dar nota); RADAR.md é gerado pelo nota_viral.py

O fluxo de um corte

Ler a referência da etapa ANTES de começá-la. Cada uma tem as regras completas e o porquê de cada uma.

EtapaO que fazerReferênciaScripts
0 · TemaAchar candidatos, ranquear falas e shorts, dar a nota da régua, escolher pelo placarreferences/ranqueamento.mdnota_viral.py, ranking_shorts.py, analise_shorts.py, acha_frase.py
1 · FonteListar, ler a legenda, baixar a melhor faixa sem tomar bloqueioreferences/pesquisa-e-download.mdbaixar.py, vtt2txt.py
1 · RoteiroTranscrever o trecho, montar o raciocínio completo, entregar para ✋references/roteiro.mdtranscrever_local.py
2 · CorteMedir as pontas, achar as trocas de câmera, cortar, realinhar, legendarreferences/corte-e-fala.mdpausas.py, trocas.py, cortar.py, alinhar.py, legendas.py, borrar_regiao.py, reenquadrar.py
2 · ConferirOuvir as emendas, olhar quadro a quadroreferences/conferencias.mdouvir_emendas.py, conferir_fins.py, folha_contato.py, travada.py
3 · AnimaçãoRoteiro da animação, cenas, telas cheias, área de segurançareferences/animacao-hyperframes.mdassets/modelo/, roteirista.py, marca.py, zona_segura.mjs, erros_js.mjs
3 · Reels de vídeo realManchete, nome e função, coberturas, logo, cores da marca (no lugar da animação)assets/modelo_reels/LEIA-ME.mdmontar_reels.py, zona_segura.mjs, erros_js.mjs
3 · SomDeixas na palavra da cena, sonoplastia por baixo da falareferences/audio.mdsonoplastia.py (+ assets/foley/)
4 · RenderRender, mux, finalizar, conferir o pronto e mandar a préviareferences/conferencias.mdfinalizar.py, folha_contato.py

Comandos, na ordem (da pasta cortes/cNN-slug/; $S = pasta scripts/ desta skill)

Começar copiando assets/modelo/ para cortes/cNN-slug/ (ver assets/modelo/LEIA-ME.md): ele traz o cortes_gerar.py, o pos_cortar.py, o montar.py, o gera_som.py, a capa e o post.json para preencher. Se a skill não estiver em ~/.claude/skills/edicao-de-cortes, definir EDICAO_CORTES=<pasta da skill>.

python $S/pausas.py <fonte> --palavras <palavras.json> <t:antes:depois> ... --perfil   # cada ponta, antes de escrever
python $S/trocas.py <fonte> --de <s> --ate <s>   # trocas de câmera e de layout no trecho
python cortes_gerar.py                       # escreve o cortes.json (blocos, janelas, recortes, trocas)
python $S/cortar.py .                        # monta assets/raul.mp4, raul.wav e tempos.json (barra ponta em fala)
python pos_cortar.py                         # TEXTO do roteiro realinhado pelo MMS_FA (palavra a palavra)
python $S/legendas.py .                      # assets/dados.js: a legenda em blocos de 1 a 3 palavras
python $S/ouvir_emendas.py .                 # cada emenda no Whisper local + envelope
python $S/conferir_fins.py .                 # as pontas de cada bloco
python $S/folha_contato.py assets/raul.mp4 --cada 2   # o Raul inteiro e a pessoa certa em cada quadro
# (✋2, se o dono pedir: ver o fim de references/corte-e-fala.md) · aqui, pedir o esforço extra antes de animar
python $S/roteirista.py batidas .            # batidas.md: frases, âncoras T() com o n certo, alusões a pessoas
python montar.py                             # index.html (animação + Raul + legenda + marca)
python gera_som.py && python $S/sonoplastia.py .   # trilha de efeitos; no fim confere JS e área de segurança
npx --yes [email protected] render . --fps 24 -q standard -w 6 -o renders/etapa3_bruto.mp4
python $S/sonoplastia.py . --mux             # som sem perda na imagem do render
python $S/finalizar.py .                     # −14 LUFS, travada, prévia de 720p
python $S/folha_contato.py renders/etapa3.mp4 --cada 3   # olhar o vídeo pronto antes de mandar

Como entregar

  • Roteiro: no formato de references/roteiro.md: linha da história, blocos com o texto completo e a cena de cada um, telas cheias, capa, autocrítica com nota e, no fim, a lista do que fica de fora.
  • Prévia: a prévia de 720p e a capa, com o resumo do vídeo:
    • as telas cheias;
    • o que foi conferido (área de segurança, travada, loudness);
    • o que foi corrigido depois do 1º render;
    • a legenda do post. Depois, esperar o "pode agendar". O pedido explícito de deixar agendado ("quero pronto, tudo perfeito, agendado") já vale como o "pode agendar" daqueles vídeos.
  • Legenda do post (post.json): informação útil com o crédito ao apresentador ("Para o Raul Sena, …"), até ~430 caracteres (no TikTok, a de ~600 perdeu o começo no campo em 3 tentativas; as de 421 e 426 entraram), sem travessão nem aspa angular e com palavrão censurado. No fim, as hashtags: as 2 da marca, de 3 a 5 do tema do jeito que as pessoas buscam e de 1 a 2 gerais, sem acento nem espaço. O trecho do post.json é o começo da legenda: ele acha o post no Studio.
  • Três redes no mesmo horário: o "pode agendar" do TikTok vale para o Instagram e o Facebook no MESMO horário, sem pedir de novo. Depois do horário, conferir que o post saiu nas três (no C80 e no C83 o Instagram falhou por bloqueio da conta).
  • Folga no TikTok: conta nova passa todo post pela revisão ("Conteúdo sob análise", até 12 h). Agendar com 2 h ou mais de folga, nunca a menos de 20 min do horário.
  • Decisão visual (layout, estilo, capa): mandar as opções em IMAGEM para o dono escolher.
  • Depois de mexer em código ou ferramenta: o resumo vem completo: o que mudou, por quê, o que ficou de fora e o que falta fazer.

Instagram (Reels)

O mesmo vídeo serve para o Reels e para o TikTok. No Instagram:

  • Subir o arquivo renderizado (renders/etapa3.mp4), nunca um vídeo baixado do TikTok: o Instagram diminui o alcance de vídeo reciclado com marca d'água.
  • A legenda do post aceita até 2.200 caracteres, mas só a 1ª linha aparece antes do "mais": ela precisa ser o gancho. Hashtags: de 3 a 5 do tema, mais as da marca (o Instagram recomenda poucas e relevantes).
  • A capa aparece na grade do perfil no recorte 3:4 do centro: o rosto e a manchete inteiros dentro dele (a capa do modelo já é feita assim). No app, ela entra em "Editar capa" → "Adicionar da galeria".
  • A área de segurança do zona_segura.mjs (busca em cima, botões à direita, texto do post embaixo) vale para os dois. No 1º post, olhar um print do Reels publicado em cada tela cheia e, se a interface cobrir algo, ajustar os limites.
  • Duração: de 1 a 2 min (o Reels aceita até 3).
  • Os números da régua e da grade (horários, pesos, limites de views) foram medidos no TikTok deste canal: no Instagram, recomeçar o placar com os próprios dados.

Outro canal

A skill nasceu no canal de cortes do Raul Sena e os exemplos são dele. Para usar com outro apresentador ou outra marca, trocar:

  • A marca: CONTA e o avatar nos modelos (em assets/modelo/ e assets/modelo_reels/), a logo, a família de cores e o nome da conta nos scripts e no post.json.
  • A régua: os pesos da REGUA.md foram calibrados para o público dele; começar com uma régua vazia e ajustar depois de alguns cortes.
  • As fontes e os modelos de áudio: o Whisper large-v3 e o MMS_FA funcionam em qualquer idioma, mas as fontes do Google Fonts e os efeitos sonoros podem ser adaptados.
  • Os scripts de conferência: ouvir_emendas.py e conferir_fins.py leem os arquivos do modelo; se a convenção de nomes mudar, ajustar os scripts.
  • Os tempos de download: se o fornecedor de vídeos mudar (ex.: YouTube para Vimeo), o baixar.py precisa ser adaptado.

관련 스킬