Edición de cortes (sin API)
Esta skill reúne todo lo que el canal aprendió editando cortes: investigación y descarga, clasificación, guion, corte, verificación y animación. Cada regla proviene de un error que ya salió al aire o casi. Se ejecuta en un entorno sin API alguna:
- Editar y renderizar: HyperFrames (
npx --yes [email protected] …). - Leer y escuchar el audio: Whisper local (whisper.cpp mediante HyperFrames, o faster-whisper).
- Medir el tiempo de cada palabra: el alineador forzado local (MMS_FA, torchaudio) y la envolvente del audio.
Dos modos: elegir antes de empezar
| Modo | Cuándo | Modelo |
|---|---|---|
| Reels de video real | Perfil institucional o de marca (ej.: @amigosdobem): la persona o acción en pantalla completa, titular, nombre y cargo, imágenes de cobertura, logo y pie de foto. Poca o ninguna animación. | assets/modelo_reels/ (ver su LEIA-ME.md) |
| Papel recortado | Canal de cortes de opinión (el de Raul): la mitad superior animada en papel, el presentador abajo y pantallas llenas de animación. | assets/modelo/ y references/animacao-hyperframes.md |
En caso de duda, preguntar cuál de los dos. Todo lo que viene antes de la animación (tema, guion, corte sin cortar palabras,
verificación de habla y audio, pie de foto, zona de seguridad, finalización y entrega) aplica igual para ambos. En el reel de
video real, la Etapa 3 es el montar_reels.py en lugar de las escenas, y las reglas de personaje, papel y pantallas llenas de
animación no aplican.
Reglas de oro (aplican en toda etapa)
- Sin API. Sin clave de OpenAI ni de ningún servicio pago. El Whisper local da el TEXTO. El tiempo fino proviene del
alineador MMS_FA y de la pausa real en la envolvente (
scripts/pausas.py). Whisper no es prueba de tiempo: en el C29, el large-v3 colocó palabras hasta 1,4 s fuera de lugar, y cada error se convirtió en un corte incorrecto. - Aprobación antes de avanzar. Guion aprobado → edición → animación → vista previa. Nada se agenda o publica sin el "puedes agendar" del dueño del canal. Cuando pide "haz hasta el final", las aprobaciones intermedias se unifican en una sola: la de la vista previa.
- Nunca cortar en medio de una palabra. El corte siempre es en un valle de energía por debajo de −40 dB, antes de la palabra
SIGUIENTE. Cada empalme se vuelve a escuchar después de montarlo (
scripts/ouvir_emendas.py). - Raul completo, centrado, sin zoom y nunca congelado. La imagen siempre es del mismo instante que el audio; en podcast, permanece en quien está razonando, y quien habla se marca en cada corte con 2 personas. Cabeza nunca cortada. En la pantalla dividida de la fuente, el panel de él llena la ventana inferior; nada de laterales desenfocados. No puede haber un fotograma congelado mientras se habla. Foto o gráfico en pantalla completa en la fuente va debajo de una PANTALLA LLENA de la animación.
- El pie de foto va de principio a fin, de 1 a 3 palabras, con palabrotas censuradas (
F**A). - Zona de seguridad siempre. Nada debajo de la barra de búsqueda de TikTok, nada saliendo por los laterales, nada debajo de los botones
o del texto de la publicación.
scripts/zona_segura.mjsdebe dar ✓ antes de cada render. - Pantalla completa: 3 veces de 5 s o más en video de hasta 2 min, 4 veces por encima de 2 min. La primera viene justo después del gancho.
- La mejor pista de audio (el Opus de YouTube), un mínimo de recompresión y la salida a −14 LUFS. El efecto de sonido siempre queda por debajo de la voz.
- Descarga espaciada. Una solicitud a la vez, nunca en ráfaga, con espacio entre ellas (
scripts/baixar.pyya lo hace). Una IP marcada con 429 solo vuelve con tiempo. El clienteweb_safari,mwebsirve solo para LISTAR videos y leer sus datos (título, idioma, canal). Con él, el pie de foto desaparece ("has no subtitles" en todo video) y la resolución viene falsa (360p), así que pie de foto y medio van en el cliente estándar. - Nunca borrar del todo. Lo que sale va a
_lixeira/, y quien vacía es el dueño del canal. Nunca escribir contraseña ni token: el inicio de sesión siempre lo hace la propia persona.
Instalación (una vez por máquina)
La forma más fácil: el comando de un solo paso del README (instalar.ps1 en Windows, instalar.sh en Mac) instala los
programas que faltan, descarga la skill y ejecuta scripts/instalar.py.
El Python de los scripts: si existe el archivo .python en la carpeta de la skill, todo python de los comandos de esta skill es la
ruta escrita en él (ej.: ~/.venv-cortes/bin/python). El instalador crea este entorno cuando el Python del sistema
rechaza pip (PEP 668: el de Homebrew en Mac, el de Debian/Ubuntu).
python scripts/instalar.py (con Python 3.11+) prepara la máquina en una sola pasada. Al final, dice "✓ listo para editar"
o lista lo que falta. Hace cinco cosas:
- Verifica Python, ffmpeg y ffprobe, Node 18+ con npx y Chrome. Lo que no se instala con pip o npm, indica cómo instalarlo en tu sistema.
- Ejecuta
pip installsolo de lo que falta (faster-whisper, torch y torchaudio de CPU, numpy, scipy, soundfile, opencv, yt-dlp). Lo que ya está instalado no se actualiza ni baja de versión. - Ejecuta
npm install playwright-coreenscripts/, que es de dondezona_segura.mjsyerros_js.mjslo importan. - Descarga Whisper large-v3 (~3 GB) y MMS_FA (~1,2 GB) y calienta
npx --yes [email protected]y Chrome del render. - Realiza la autoprueba: el
--helpde 3 scripts,node --checkde los.mjsyassets/modelo/montado en una carpeta temporal.
Tiene tres opciones:
-
--so-conferir: solo verifica y no instala nada. -
--sem-modelos: salta los modelos. -
--modelo-whisper medium: para máquina débil. Después, pasa--modelo mediumatranscrever_local.py. -
Whisper de HyperFrames (opcional):
npx --yes [email protected] transcribe <archivo> -e whisper -m large-v3 -l pt --json. Necesita whisper-cpp, ynpx --yes [email protected] doctorindica si está instalado. -
Lo que necesita internet (el resto funciona sin conexión):
- descargar las fuentes (yt-dlp);
- la primera vez, los modelos (Whisper large-v3 y MMS_FA) y Chrome del render; el instalador ya los descarga los tres;
- GSAP desde CDN, en cada render;
- las fuentes de Google Fonts, la primera vez que se montan (después quedan guardadas en
~/.cache/hyperframes/fonts).
-
Probar la máquina en cualquier momento:
python scripts/instalar.py --so-conferir.
Estructura del proyecto
<proyecto>/
_fontes/ videos y audios descargados (el <id>_opus.mkv es la fuente del corte)
_pesquisa/ pies de foto, transcripciones (<id>_palavras.json), radar y notas
_lixeira/ lo que sale (fuentes después de publicadas etc.)
cortes/cNN-slug/ un 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 una entrada por corte (id de la fuente, lo que salió al aire, lo que decidió el dueño) y las "Lecciones acumuladas";
sin él, ranking_shorts.py no descarta ningún id ya usado
REGUA.md las correcciones del dueño a la regla (leer antes de dar nota); RADAR.md es generado por nota_viral.py
El flujo de un corte
Leer la referencia de la etapa ANTES de empezarla. Cada una tiene las reglas completas y el porqué de cada una.
| Etapa | Qué hacer | Referencia | Scripts |
|---|---|---|---|
| 0 · Tema | Encontrar candidatos, clasificar intervenciones y shorts, dar la nota de la regla, elegir por puntuación | references/ranqueamento.md | nota_viral.py, ranking_shorts.py, analise_shorts.py, acha_frase.py |
| 1 · Fuente | Listar, leer el pie de foto, descargar la mejor pista sin ser bloqueado | references/pesquisa-e-download.md | baixar.py, vtt2txt.py |
| 1 · Guion | Transcribir el fragmento, armar el razonamiento completo, entregar para ✋ | references/roteiro.md | transcrever_local.py |
| 2 · Corte | Medir los cortes, encontrar los cambios de cámara, cortar, realinear, poner pie de foto | references/corte-e-fala.md | pausas.py, trocas.py, cortar.py, alinhar.py, legendas.py, borrar_regiao.py, reenquadrar.py |
| 2 · Verificar | Escuchar los empalmes, revisar cuadro por cuadro | references/conferencias.md | ouvir_emendas.py, conferir_fins.py, folha_contato.py, travada.py |
| 3 · Animación | Guion de la animación, escenas, pantallas llenas, zona de seguridad | references/animacao-hyperframes.md | assets/modelo/, roteirista.py, marca.py, zona_segura.mjs, erros_js.mjs |
| 3 · Reels de video real | Titular, nombre y cargo, coberturas, logo, colores de marca (en lugar de la animación) | assets/modelo_reels/LEIA-ME.md | montar_reels.py, zona_segura.mjs, erros_js.mjs |
| 3 · Sonido | Acentos en la palabra de la escena, sonoplastia por debajo de la voz | references/audio.md | sonoplastia.py (+ assets/foley/) |
| 4 · Render | Render, mux, finalizar, verificar el producto terminado y enviar la vista previa | references/conferencias.md | finalizar.py, folha_contato.py |
Comandos, en orden (desde la carpeta cortes/cNN-slug/; $S = carpeta scripts/ de esta skill)
Empezar copiando assets/modelo/ a cortes/cNN-slug/ (ver assets/modelo/LEIA-ME.md): trae el
cortes_gerar.py, pos_cortar.py, montar.py, gera_som.py, la portada y el post.json para rellenar. Si la skill
no está en ~/.claude/skills/edicao-de-cortes, definir EDICAO_CORTES=<carpeta de la skill>.
python $S/pausas.py <fuente> --palavras <palavras.json> <t:antes:después> ... --perfil # cada corte, antes de escribir
python $S/trocas.py <fuente> --de <s> --ate <s> # cambios de cámara y de diseño en el fragmento
python cortes_gerar.py # escribe el cortes.json (bloques, ventanas, recortes, cambios)
python $S/cortar.py . # monta assets/raul.mp4, raul.wav y tempos.json (barra corte en habla)
python pos_cortar.py # TEXTO del guion realineado por MMS_FA (palabra a palabra)
python $S/legendas.py . # assets/dados.js: el pie de foto en bloques de 1 a 3 palabras
python $S/ouvir_emendas.py . # cada empalme en Whisper local + envolvente
python $S/conferir_fins.py . # los cortes de cada bloque
python $S/folha_contato.py assets/raul.mp4 --cada 2 # Raul completo y la persona correcta en cada fotograma
# (✋2, si el dueño lo pide: ver el final de references/corte-e-fala.md) · aquí, pedir el esfuerzo extra antes de animar
python $S/roteirista.py batidas . # batidas.md: frases, anclas T() con el n correcto, alusiones a personas
python montar.py # index.html (animación + Raul + pie de foto + marca)
python gera_som.py && python $S/sonoplastia.py . # pista de efectos; al final verificar JS y zona de seguridad
npx --yes [email protected] render . --fps 24 -q standard -w 6 -o renders/etapa3_bruto.mp4
python $S/sonoplastia.py . --mux # sonido sin pérdida en la imagen del render
python $S/finalizar.py . # −14 LUFS, congelada, vista previa de 720p
python $S/folha_contato.py renders/etapa3.mp4 --cada 3 # revisar el video terminado antes de enviar
Cómo entregar
- Guion: en el formato de
references/roteiro.md: línea de la historia, bloques con el texto completo y la escena de cada uno, pantallas llenas, portada, autocrítica con nota y, al final, la lista de lo que queda fuera. - Vista previa: la vista previa de 720p y la portada, con el resumen del video:
- las pantallas llenas;
- lo que se verificó (zona de seguridad, congelada, loudness);
- lo que se corrigió después del 1er render;
- el pie de foto de la publicación. Después, esperar el "puedes agendar". La solicitud explícita de dejarlo agendado ("quiero listo, todo perfecto, agendado") ya vale como el "puedes agendar" de esos videos.
- Pie de foto de la publicación (
post.json): información útil con el crédito al presentador ("Para Raul Sena, …"), hasta ~430 caracteres (en TikTok, la de ~600 perdió el inicio en el campo en 3 intentos; las de 421 y 426 entraron), sin guion ni comillas angulares y con palabrotas censuradas. Al final, los hashtags: los 2 de la marca, de 3 a 5 del tema como la gente busca y de 1 a 2 generales, sin acento ni espacio. Eltrechodelpost.jsones el inicio del pie de foto: encuentra la publicación en el Studio. - Tres redes al mismo horario: el "puedes agendar" de TikTok aplica para Instagram y Facebook en el MISMO horario, sin pedir de nuevo. Después del horario, verificar que la publicación salió en las tres (en C80 y C83 Instagram falló por bloqueo de la cuenta).
- Margen en TikTok: la cuenta nueva pasa toda publicación por revisión ("Contenido bajo análisis", hasta 12 h). Agendar con 2 h o más de margen, nunca a menos de 20 min del horario.
- Decisión visual (diseño, estilo, portada): enviar las opciones en IMAGEN para que el dueño elija.
- Después de modificar código o herramienta: el resumen debe ser completo: qué cambió, por qué, qué quedó fuera y qué falta hacer.
Instagram (Reels)
El mismo video sirve para Reels y TikTok. En Instagram:
- Subir el archivo renderizado (
renders/etapa3.mp4), nunca un video descargado de TikTok: Instagram reduce el alcance de video reciclado con marca de agua. - El pie de foto de la publicación acepta hasta 2.200 caracteres, pero solo la 1ª línea aparece antes del "más": debe ser el gancho. Hashtags: de 3 a 5 del tema, más los de la marca (Instagram recomienda pocos y relevantes).
- La portada aparece en la cuadrícula del perfil en el recorte 3:4 del centro: el rostro y el titular completos dentro (la portada del modelo ya está hecha así). En la app, se ingresa en "Editar portada" → "Añadir desde galería".
- La zona de seguridad de
zona_segura.mjs(búsqueda arriba, botones a la derecha, texto de la publicación abajo) aplica para ambos. En la 1ª publicación, mirar una captura del Reels publicado en cada pantalla llena y, si la interfaz cubre algo, ajustar los límites. - Duración: de 1 a 2 min (Reels acepta hasta 3).
- Los números de la regla y de la cuadrícula (horarios, pesos, límites de vistas) se midieron en TikTok de este canal: en Instagram, reiniciar la puntuación con los datos propios.
Otro canal
La skill nació en el canal de cortes de Raul Sena y los ejemplos son suyos. Para usarla con otro presentador u otra marca, cambiar:
- La marca:
CONTAy el avatar en los archivos de configuración (buscar referencias a "raul"). - Las fuentes: los referentes de estilo y tono en
references/. - Los modelos de animación:
assets/modelo/yassets/modelo_reels/pueden personalizarse. - Las reglas de la regla (
REGUA.md): ajustar los umbrales de viralidad según el nicho.
Para más detalles, consultar la documentación de cada script y referencia en references/.