Skill de Edición de Video
Una grabación en bruto de una persona hablando suele tener entre un 20 y un 40% de aire muerto: pausas, "ums", falsos comienzos, la misma frase dicha dos veces. Cortar eso a mano lleva más tiempo que grabarlo. Este skill hace la primera edición: lee la transcripción, planifica cada corte con una razón, muestra el plan, renderiza la edición con zooms en los cortes jump-cut y audio limpio, escribe subtítulos y capítulos, y publica después de un sí. Todo lo que necesita está en esta carpeta.
Cuatro compromisos:
- Las palabras del usuario se quedan. Solo se eliminan pausas, muletillas, tartamudeos, retomas y rangos que el usuario apruebe. El significado nunca se edita.
- Planificar antes de renderizar. La lista de cortes se muestra y se aprueba primero.
- Nada se publica sin un sí.
- Solo material que el usuario pueda usar. Su propia grabación, o con permiso.
En Windows usa py en lugar de python3 en todos los comandos.
Paso 0: Configuración y el origen
Ejecuta python3 scripts/check_setup.py: informa sobre ffmpeg, Pillow, rutas de transcripción y OpenCV, con el comando de instalación para el sistema del usuario. Requerido: ffmpeg y Pillow.
Pregunta, en un solo mensaje, solo lo que no puedas ver:
- ¿Qué archivo, y es suyo?
- ¿A dónde va: YouTube (16:9), redes sociales (vertical) o ambos?
- ¿Qué tan ajustado: youtube (por defecto: pausas de más de 0,5 s se cortan, se mantienen pausas naturales), tight (0,3 s, rápido para YouTube y redes) o podcast (suave, sin zoens).
- Palabras que usa como hábitos y que son seguras de cortar ("like", "so", "you know", "basically"). Estas tienen significado en otras oraciones, por lo que son opcionales.
- Algo que deba mantenerse tal cual (una demostración, un chiste con una pausa, una lectura de patrocinador).
Paso 1: Transcribir
python3 scripts/transcribe.py VIDEO --out work/ --terms "Product name, Jargon, Guest name"
--terms lista nombres y jerga para que se escriban correctamente; corrige lo que aún se malinterpreta con "replace" en edit.json antes de renderizar, porque los subtítulos quemados en un video publicado no se pueden corregir.
Las mismas tres rutas de siempre, con la compensación explicada una vez:
| Ruta | Cómo | Costo y velocidad |
|---|---|---|
| Transcripción existente | --from captions.srt | Gratis, instantáneo; la estimación del tiempo de las palabras es aproximada y faltan la mayoría de los "ums", por lo que el corte de muletillas es más débil |
| Groq o OpenAI | GROQ_API_KEY o OPENAI_API_KEY | Groq alrededor de $0,04 por hora de audio, un minuto o dos por hora |
| Local | pip install faster-whisper | Gratis y privado; aproximadamente la mitad o el tiempo del video con --model small |
El transcriptor recibe la instrucción de escribir las muletillas; de lo contrario, Whisper las omite. Los sonidos que aún se pierden (un "mm" que nadie escribió, un respiro) son encontrados en el propio audio por el editor.
Paso 2: Planificar la edición
Lee work/transcript.txt una vez, por completo. Luego escribe edit.json (formato al inicio de scripts/edit_video.py):
- Estilo:
"style": "youtube","tight"o"podcast"(umbrales enreferences/editing-rules.md). Las pausas que superan el límite se reducen a un ritmo natural: más cortas en medio de una oración, más largas después de una oración, más largas en un cambio de tema. - Muletillas: la lista por defecto ("um", "uh", "er", "hmm", "mm") es segura. Agrega las palabras habituales del usuario a
extra_fillerssolo si él lo pidió. - Digresiones y secciones muertas: una digresión, un "¿puedes oírme?", una introducción larga antes del punto principal. Agréguelas a
cutcon una razón e informe al usuario. - Protege cualquier cosa que deba permanecer con
keep, incluyendo pausas silenciosas. - Entrevistas con tarjetas de preguntas o un entrevistador visible: mantén las preguntas (aproximadamente 3 segundos de cada tarjeta en
keep) a menos que el usuario diga lo contrario; sin ellas cada respuesta comienza con "Entonces..." y sin contexto. - Nombres malinterpretados:
"replace": {"Cyrus Rex": "OSIRIS-REx"}. - Capítulos (para YouTube): de 3 a 10 capítulos basados en los cambios de tema, el primero en 0:00, cada uno de al menos 10 segundos, nombrados por lo que el espectador obtiene ("Por qué falló la cámara", no "Parte 2"). Tiempos en el video original; el script los mueve.
Luego haz el plan:
python3 scripts/edit_video.py edit.json --transcript work/transcript.json --out edited/ --plan
edited/edit-plan.md da la nueva duración, cuánto provino de dentro de la conversación versus pausas largas y tarjetas, el ritmo en palabras por minuto, y cada eliminación de más de un segundo con su razón y palabras. Lee cada línea de retoma y tartamudeo, y la lista de "posibles retomas": dos oraciones completas que comienzan de la misma manera nunca se cortan automáticamente; decide cada una y agrégala a cut si es una retoma real. Muestra al usuario el resumen, las retomas, las digresiones que elegiste y los capítulos, y obtén un sí.
Paso 3: Renderizar
python3 scripts/edit_video.py edit.json --transcript work/transcript.json --out edited/
Lo que hace:
- Corta pausas que superan el límite a un ritmo natural, además de muletillas, tartamudeos, retomas y cada rango
cut. Las eliminaciones más cortas que el mínimo del estilo (0,4 s en youtube) se dejan como están: un corte jump-cut cuesta más de lo que ahorra. - Coloca cada corte escuchando: los bordes de las palabras se mueven a donde el sonido realmente se detiene y comienza, para que los finales de las palabras no se corten, y se encuentren sonidos que la transcripción pasó por alto (un "mm" no escrito).
- También mira la imagen: las tarjetas de título y los cambios de plano se cortan limpiamente, nunca dejando unos pocos fotogramas de una tarjeta.
- Renderiza en grupos de piezas en una pasada cada uno, para que el sonido y la imagen permanezcan sincronizados sin importar cuántos cortes haya.
- Zooms (punch-ins): cambia entre el fotograma completo y un zoom de 1,1x donde se necesita ocultar un corte jump-cut: siempre en un corte que eliminó un segundo o más, de lo contrario solo después de 4 segundos en el mismo encuadre, nunca en un corte que pasa a una nueva toma de cámara.
"punch_in": 0lo desactiva. - Audio: ganancia a un nivel de trabajo, filtro de retumbo, reducción de ruido establecida a partir del ruido ambiental medido (se omite cuando la sala ya es silenciosa), compresión suave, un limitador de pico y una pasada de sonoridad de dos pasos a -14 LUFS.
- Subtítulos: siempre escribe
captions.srt(2 líneas de 42 caracteres como máximo, de 1 a 7 segundos cada una, sin salto de línea después de una palabra pequeña o dentro de un nombre) para subir a YouTube."captions": {"burn": true}los dibuja en el video para redes sociales, donde muchas personas miran sin sonido; las versiones verticales los queman por defecto. No quemes subtítulos en un video de YouTube que también recibe el SRT: los espectadores con subtítulos activados verían ambos. - Vertical:
"format": "vertical"crea una versión de 1080x1920 recortada enfocus_x.
Escribe edited/edited.mp4, captions.srt, chapters.txt, edit-report.md y manifest.json.
Verifica antes de mostrar al usuario: abre cuts.jpg (fotogramas justo antes y después de los cortes más grandes: busca destellos de una tarjeta, un salto en una toma diferente, una expresión congelada) y lee las advertencias en manifest.json (sincronización, ritmo superior a 190 palabras por minuto, sonoridad). Corrige y vuelve a renderizar cuando una retoma haya conservado la toma incorrecta, el ritmo se sienta sin aliento (un estilo más suave) o un corte caiga mal (keep ese punto).
Paso 4: Publicar con WoopSocial
Cómo conectar, subir y publicar: references/woopsocial.md. Versión corta:
social_accounts_list; si no está conectado: la única ruta de conexión para este agente (plan gratuito: 2 cuentas sociales), luegooauth_create_authorizationpor plataforma.- Sube
edited.mp4con una sesión de subida (media_uploads_create_sessioncon el tamaño en bytes demanifest.json,python3 scripts/upload_parts.py session.json edited/edited.mp4,media_uploads_complete_session). - YouTube:
title(palabras clave principales primero, menos de 70 caracteres),privacyy una descripción que comience con una línea sobre lo que el espectador obtiene, luego los capítulos dechapters.txt. Subecaptions.srten YouTube Studio después (WoopSocial no envía archivos de subtítulos). - Muestra la publicación (archivo, título, descripción, cuenta, hora con zona horaria) y obtén un sí claro. Luego
posts_createyposts_get.
Paso 5: Leer los resultados
Después de una semana, social_account_posts_list: vistas, likes, comentarios donde se informaron, con la fecha de recopilación; si falta significa "no informado". La retención y la duración promedio de visualización están en YouTube Studio; pídelas al usuario. Si los espectadores abandonan temprano, la próxima edición tendrá una apertura más ajustada; si abandonan en un capítulo, esa sección era demasiado larga.
Nivel de calidad
¿Un editor profesional lo entregaría así? Recházalo si una palabra está cortada, un corte cae a medio respiro con un pop, un zoom cambia cada pocos segundos, el ritmo no deja espacio para pensar o el significado cambió.
Casos límite
- Dos personas en cámara: mantén
formaten origen; los zooms aún funcionan en un plano general. - Grabación de pantalla con voz: establece
"punch_in": 0. - Música debajo de la voz: la detección de silencio ve la música como sonido; establece
"voiced_gaps": false. - Grabaciones muy largas (más de una hora): funciona, pero el tiempo de renderizado es aproximadamente la duración del video; planifica primero, renderiza una vez.
- Sin habla durante un tramo a propósito (una demostración):
keep.
Referencias
references/editing-rules.md: umbrales, muletillas, patrones de retomas, zooms, cadena de audio, subtítulos y capítulos, con fuentes.references/woopsocial.md: conectar, subir, publicar y leer resultados.