¿Qué hace Interior Reels?
Transforma clips sin editar de proyectos de interiorismo en un Reel 9:16 listo para subir. El script es solo una herramienta. Las decisiones editoriales (qué toma, qué parte, qué orden) son tarea de Claude y deben basarse en ver la imagen de cada clip, no en adivinar por el nombre del archivo.
SKILL = carpeta de esta skill. Todos los scripts: python3 SKILL/scripts/<nombre>.py.
Antes de comenzar (una vez por sesión)
Ejecuta bash SKILL/setup.sh. Si algo FALLA, resuélvelo primero. Lee SKILL/brand.json para obtener el nombre del estudio, CTA, logo, patrón predeterminado y preferencias del cliente.
Reglas absolutas (no se pueden violar)
- El texto y el logo no son tarea del asistente. El texto y el logo los configura el cliente en la GUI y se guardan en
<carpeta>/_edit/overlay.json.render.pylee este archivo y sobrescribe todotextoylogoen el plan. No escribastextonilogoenplan.json, no preguntes al cliente por el contenido del texto y no añadas texto propio aoverlay.json(incluyendo CTA debrand.json) a menos que el cliente lo solicite. - El patrón solo define cortes y apariencia. Lo que se toma del patrón: secuencia de slots, duración, movimiento, transiciones y gradación.
texto,ejemplo_contenidoylogoen el patrón son solo anotaciones del video de referencia, no se renderizan. - Cambiar texto o logo por chat = editar
overlay.json. Si el cliente pide cambiar el contenido del texto, fuente, posición, momento de aparición, tamaño, color o logo, edita<carpeta>/_edit/overlay.json(formato enPLAN.mdsecciónoverlay.json), luego renderiza de nuevo. La GUI recarga este archivo después de tu respuesta. Las fuentes solo provienen deSKILL/fonts/. La lista de fuentes, categorías, características y usos está enfonts/fonts.json; elige de ahí según el ambiente que pida el cliente. Las fuentes o tamaños diferentes por línea (ej. "segunda línea usa Great Vibes") se configuran mediantetexto[].por_linea. El logo solo puede sernegro(brand/logo.png) oblanco(brand/logo-blanco.png). Los datos del estudio (nombre, sitio webkeziakarin.com, Instagram@keziakarin.studio) se mantienen debrand.json. - El audio también viene de
overlay.json(audio). No elijas ni cambies la música por tu cuenta, y no escribasmusicaen el plan. Si el cliente lo pide por chat (cambiar canción, volumen, punto de inicio, final con/sin música, sincronizar al ritmo), editaaudioenoverlay.json(formato enPLAN.md). La música solo proviene del audio guía del patrón (patterns/audio/) o de la biblioteca del estudio (brand/musica/). Recuerda al cliente que el audio de referencia es propiedad de otros si quieren usarlo en el producto final. - Si
overlay.jsonaún no existe, el renderizado se ejecuta sin texto ni logo del patrón. Menciona al cliente que el texto y el logo se pueden completar en la sección Detalle de la GUI. - No elimines ni reemplaces
overlay.jsonsin que te lo pidan. Este archivo son las elecciones del cliente. - La estabilización se maneja automáticamente.
render.pymide el movimiento en cada segmento y estabiliza por sí solo ("estabilizar": "auto", predeterminado). No rellenesestabilizara menos que haya una razón:truefuerza la estabilización,falsela desactiva (ej. movimiento intencional de la cámara). Lee la tabla "Estabilización" en el registro de renderizado:! movimiento visible restante= revisa el resultado;! FALLO= el renderizado se detiene, elige otro rango o clip para ese segmento. Al revisar, sigue rellenandomovimientoen_review/*.jsonpara las partes claramente movidas/desenfocadas: ese rango no se usará cuando el renderizado desplaceinicio. - Selecciona las partes adecuadas, no uses todos los segundos del clip. Al renderizar,
render.pyanaliza automáticamente el clip (_calidad/) y marca las partes oscuras, vacías (sin objeto) o borrosas. Los segmentos que contengan más de 0.3 segundos de partes malas se rechazan y se sugiere uninicio. Obligatorio: desplazainicioa la sugerencia, o reduceduracion, o cambia de clip. No está permitido usar--ignorar-calidadsin permiso del usuario. - La duración sigue al metraje, no al patrón. Si el rango bueno del clip es más corto que el slot del patrón, acorta ese slot. La duración total del reel puede ser más corta que
duracion_totaldel patrón. No rellenes slots con partes malas. - Mira el fotograma antes del final. Las sugerencias del análisis deben verificarse mirando el fotograma en ese rango (cuadrícula o vista previa). El análisis no sabe si el objeto principal es bueno o si esa parte es la apertura adecuada.
- Revisa todos los clips de material primero. Ejecuta
scripts/review_material.py <carpeta-material>, mira CADA hoja en_review/hasta terminar, luego rellena el JSON de cada clip (visto,movimiento,rango_valido,decision).render.pyrechaza el renderizado si el clip no ha sido revisado o si el segmento está fuera derango_valido(a menos que se use--ignorar-calidad). - Verifica el texto después del renderizado. La posición del texto la elige el cliente (cuadrícula 3x3). Después del renderizado, mira
*_texto<N>_check.jpg(cuadro rojo = área aproximada del texto). Si el texto cubre una cara u objeto principal, informa al cliente y sugiere otra posición. No cambies la posición por tu cuenta sin aprobación. - Los clips elegidos por el cliente están en
<carpeta>/_edit/clips.json. Lee este archivo antes de crear el plan (formato enPLAN.mdsecciónclips.json).apertura= clip del primer segmento,cierre= clip del último segmento,evitar= no se puede usar en ningún segmento. Las elecciones del cliente prevalecen sobretipo_tomadel patrón; si el tipo de toma del clip es diferente al slot del patrón, informa al cliente. Los mejores segundos dentro del clip elegido los sigue seleccionando el asistente.render.pyrechaza los planes que violen este archivo (no se puede omitir con--ignorar-calidad). No modifiques ni eliminesclips.json; este archivo lo escribe la GUI.
Flujo: editar clips en un reel
- Recopila información. Lo obligatorio: carpeta de clips. Lo opcional: patrón y archivo de audio (narración/voz en off, mp3/m4a/wav). El texto y el logo ya están en
_edit/overlay.json, no los preguntes. Pregunta solo lo que realmente falte, máximo 1 pregunta. Si hay un archivo de audio, rellenavozen el plan (verPLAN.md). La voz no la graba la skill: el usuario debe proporcionar el archivo de audio. Compara el número de clips en la carpeta conmin_clipsdel patrón. Si es insuficiente, informa al cliente y sugiere un patrón conmin_clipsmás pequeño o que añada clips. Puedes continuar si el cliente está de acuerdo. - Escanea. Ejecuta
scan_clips.py <carpeta>para crear<carpeta>/_scan/. - Mira CADA cuadrícula
_scan/<clip>.jpgcon la herramienta de vista. Para cada clip, anota en una tabla: tipo de toma (general / medio / detalle / recorrido / paneo), habitación, calidad (movimiento, oscuro, demasiado claro, presencia de personas o desorden), mejores segundos (segundo_fotogramaenmanifest.jsonasigna los cuadros de la cuadrícula a segundos) y dirección del movimiento de la cámara. No continúes hasta que todas las cuadrículas hayan sido vistas. - Elige el patrón de
SKILL/patterns/*.json, según la solicitud o el predeterminado. Si la selección es automática, elige aquel cuyoadecuado_paracoincida mejor con la cantidad y contenido de los clips. Lee lasnotas_entrenamientodel patrón elegido (si las hay) y aplica sus lecciones al rellenar los slots. - Rellena los slots. Para cada slot en
flujo, elige un clip y un segundoinicioque coincida contipo_toma, siguiendo las reglas narrativas a continuación. Copiaduracion,movimiento,transicion_entrada,efecto_entrada,efecto_salida,atenuary la gradación del patrón. Copia tambiénmarcoyfinalal plan, cambialogo_slotporlogo_segmento(índice del segmento de ese slot), y rellenaapertura_segmentocon el índice del segmento del primer slot de texto del patrón (texto[0].slot), para que el texto de apertura de la GUI aparezca en ese slot. Si el patrón tienetexto[0].duracion, escribe tambiénapertura_duracion_texto(valor numérico, segundos) en el plan — esto asegura que el texto de apertura se muestre el tiempo suficiente para ser leído. Si el patrón tienetexto[0].hasta_slot, escribe tambiénapertura_textoen el plan:inicio,animacion,fundido,salidase copian detexto[0], yhasta_segmento= índice del segmento del slothasta_slot. No copies el texto ni el logo. Escribe<carpeta>/_edit/plan.jsonsegúnSKILL/PLAN.md, usando rutas absolutas.- Patrón con
marcoletterbox: prioriza clips apaisados. Los clips verticales se recortan en el centro formando una banda 16:9; si es necesario usarlos, informa al cliente. - Reutilizar clips está permitido si los clips son insuficientes para el número de slots: los rangos
inicioen el mismo clip deben estar separados por al menos 1 segundo, y no deben estar en dos segmentos consecutivos. El renderizado muestra una advertencia si se viola esta regla. - Si el patrón tiene
aun_no_soportado, menciona ese efecto al cliente antes de renderizar. - Modo de edición desde la GUI (mencionado en el mensaje "Iniciar edición"):
seguir referencia(predeterminado): copia el flujo del patrón exactamente, no elimines, intercambies ni combines slots. El texto superpuesto ya está numerado según el slot del patrón (cuando), y el logo usalogo_segmento, por lo que el orden de los segmentos debe ser el mismo queflujo. Si faltan clips, reutiliza clips (regla anterior), no elimines slots.personalizado: el patrón es solo un punto de partida de estilo (gradación, transiciones, efectos, marco). La duración y el número de segmentos se pueden ajustar a los clips. Escribe"modo": "personalizado"en el plan, para que el audio de referencia se sincronice con el ritmo.
- Patrón con
- Vista previa. Ejecuta
render.py <plan> --vista-previa, luego mira*_vista-previa_check.jpg. Verifica: orden lógico, sin tomas malas, texto de superposición legible y que no cubra el objeto principal, sin fotogramas congelados extraños. Corrige el plan y repite si es necesario. - Final. Ejecuta
render.py <plan>, mira*_check.jpguna vez más, luego reporta la ruta del video junto con un resumen del orden de las tomas en 1-2 frases.
Reglas narrativas de interiorismo
- Los primeros 3 segundos determinan si la gente deja de hacer scroll. La apertura debe ser la toma más impactante: luminosa, recta, espacio completo visible.
- Sigue el plano. Orden de espacios desde la entrada hasta las áreas públicas (salón, comedor, cocina) y luego a las áreas privadas (dormitorios, baños). No saltes de un lado a otro entre habitaciones.
- Alterna escalas. General, luego detalle, luego general. Dos tomas generales de diferentes habitaciones seguidas deberían unirse con una transición, no con un corte.
- La dirección del movimiento debe continuar. Un paneo a la izquierda se une con una toma que se mueva a la izquierda o una transición
slideleft/smoothleft. Evita direcciones opuestas en una misma unión. - Toma partes estables. Elige segundos en medio del movimiento, no cuando la cámara empieza o se detiene. Omite las partes con movimiento, borrosas o con personas.
- El cierre usa la toma más bonita que tenga un área lisa para el CTA y el logo.
- Texto: lo configura el cliente mediante
overlay.json. Si pides consejo, sugiere un máximo de 6 palabras por texto. - Si hay menos clips que slots: elimina primero los slots de
detalle. Si hay clips de sobra: usa solo los mejores, no es necesario usar todos los clips. - Clips apaisados: usa
"relleno": "desenfoque"si la composición es importante. Si el objeto principal está en el centro,recortares suficiente.
Flujo: revisión después del resultado
Se aplica si el mensaje del cliente termina con [modo revision: ...] (la GUI lo añade cuando _edit/plan.json ya existe). El objetivo: entender la intención de la revisión antes de cambiar nada, porque renderizar de nuevo lleva tiempo. El cliente solo hace clic en un botón, por lo que todas las preguntas DEBEN enviarse mediante un bloque preguntas, no en texto libre.
- Nuevo mensaje de revisión (no es una respuesta, ni "Ejecutar"):
- Lee
plan.jsony mira*_check.jpgdel último resultado. No modifiques ningún archivo. - Envía una ronda: máximo 4 preguntas. Su contenido son preguntas sobre la intención (qué toma, cuánto, qué estilo) y un máximo de 2 hallazgos del resultado (ej. toma oscura, texto que cubre un objeto), cada uno con opciones como "Corregir" / "Dejar".
- Cada pregunta debe tener 2-4 opciones cortas (≤ 6 palabras), exactamente una opción con
"recomendado": true."multi": truesolo para opciones que permitan más de una selección (ej. qué tomas reemplazar). No añadas la opción "Otros"; la GUI ya la proporciona. - Escribe un máximo de 1 frase introductoria, luego el bloque, luego detente y espera.
- Lee
- Mensaje que comienza con
Respuesta:= respuesta de la ronda. Si aún hay algo poco claro y esta es la primera ronda, envía una segunda ronda (mismas reglas). Después de eso (o si ya está claro), envía un bloqueresumen: lista de cambios que se harán, un punto por cambio. Detente y espera. Ejecutar resumen:= usa la opciónrecomendadopara todas las preguntas de la última ronda, luego ejecuta sin resumen.Ejecutar según resumen.= ejecuta exactamente el contenido del último resumen (editar plan/overlay, vista previa, final), luego reporta como de costumbre.- Mensaje de texto libre cuando la tarjeta está abierta = respuesta libre. Trátalo como
Respuesta:. - Máximo 2 rondas de preguntas por revisión. Las solicitudes muy claras (ej. "cambia la fuente a Great Vibes") pasan por una ronda corta (solo hallazgos, o 1 pregunta de confirmación), luego resumen.
- Mensaje "clip elegido ha cambiado" (enviado por la GUI después de que el cliente cambie el clip de apertura, cierre o evitar usar) = revisión normal: lee el
_edit/clips.jsonmás reciente y aplícalo al plan mediante los pasos 1-4 anteriores (regla absoluta 13).
Formato del bloque (JSON válido, un bloque por respuesta):
```preguntas
{"tipo": "preguntar", "preguntas": [
{"id": "q1", "titulo": "¿Qué toma quieres cambiar?", "multi": true,
"opciones": [{"etiqueta": "Toma 2 (cocina)", "recomendado": true}, {"etiqueta": "Toma 4 (dormitorio)"}]},
{"id": "q2", "titulo": "Hallazgo: la toma 3 está un poco oscura", "multi": false,
"opciones": [{"etiqueta": "Corregir", "recomendado": true}, {"etiqueta": "Dejar"}]}
]}
```
```preguntas
{"tipo": "resumen", "resumen": ["Toma 2 reemplazada por clip de cocina segundo 4", "Toma 3 iluminada"]}
```
Flujo: entrenamiento de estilo
Se aplica si el mensaje termina con [modo entrenamiento: ...] (enviado desde la pestaña Entrenamiento de estilo en la GUI). El objetivo: probar patrones existentes contra su video de ejemplo, reportar las discrepancias y corregir el patrón con la aprobación del cliente. Todas las preguntas DEBEN ir mediante bloques preguntas (formato en "Flujo: revisión después del resultado").
- Entrada del mensaje de la GUI: nombre del patrón, modo (
seguir referencia/personalizado) y carpeta de clips. - Material. Lee
SKILL/patterns/<patron>.jsonincluyendonotas_entrenamiento. Video de ejemplo =skill/ejemplo-video/<video_ejemplo>(carpetaejemplo-videojunto a la carpeta de la skill). Hoja de referencia: usaSKILL/_ref/<nombre>/existente (busca el nombre del patrón o el nombre del archivovideo_ejemplosin extensión; mirafilmstrip.jpg/shots.jpg). Si no existe, ejecutaanalyze_ref.py <video de ejemplo> --name <patron> --out <carpeta>/_training/<patron>/ref. - Carpeta de trabajo =
<carpeta>/_training/<patron>/. No toques<carpeta>/_edit/en absoluto. El plan de entrenamiento se escribe en<carpeta>/_training/<patron>/plan_entrenamiento.json. El video renderizado va a<carpeta>/_training/<patron>/. - Flujo: sigue la misma secuencia que "Editar clips en un reel", pero con estas diferencias:
- Después del paso 5, primero pregunta al cliente qué tomas del patrón son incorrectas. Muestra el
flujoactual del patrón yshots.jpgcomo referencia. Haz preguntas de opción múltiple: "¿La toma X debería ser un detalle en lugar de un plano general?" (opciones: "Sí, corregir patrón" / "No, dejar patrón"). Elige los segmentos de video con el comandoyy-mmy herramientas de vista. - Después de que el cliente responda, aplica los cambios al patrón en
patterns/<patron>.json(soloflujo,audio,tipo_toma,duracion,movimiento,transicion_entrada,efecto_entradayefecto_salidapor slot) y vuelve al paso 5. No toquestextonilogo. - Después de cada actualización del patrón, ejecuta
analyze_ref.pyde nuevo, luego renderiza con--vista-previa. - La renderización final se hace solo cuando el cliente dice "Listo".
- Si el patrón no tiene un video de ejemplo o falta el archivo de video de ejemplo, el entrenamiento no puede continuar. Informa al cliente.
- Patrón no encontrado: responde con un bloque de preguntas que liste todos los patrones disponibles como opciones con
multi: false.
- Después del paso 5, primero pregunta al cliente qué tomas del patrón son incorrectas. Muestra el
- Notas de entrenamiento. Si el cliente hace una petición que no se puede codificar directamente en el patrón, escríbela en
catálogo_notas_entrenamientodel patrón para referencia futura.
Archivo de plan: formato
Ver SKILL/PLAN.md para el esquema completo de plan.json. Los campos clave:
patron: ruta al archivo del patrón usadomodo:"seguir referencia"o"personalizado"segmentos: lista de objetos de segmento- Cada segmento:
clip,inicio(segundos),duracion,movimiento,transicion_entrada,efecto_entrada,efecto_salida,atenuar,estabilizar,tipo_toma logo_segmento: índice del slot del logo en el patrón (para posicionamiento)apertura_segmento: índice del segmento donde aparece el primer texto de aperturaapertura_duracion_texto: cuánto tiempo se muestra el texto de apertura (segundos)
- Cada segmento:
voz: lista de objetos de voz en off (si los hay)audio: ruta al archivo de música de fondo (desdeoverlay.json, no desde el plan)marco: objeto de marco (letterbox, etc.)final: efecto final del patrón
Herramientas
scan_clips.py <carpeta>: genera miniaturas de cuadrícula para cada clip en<carpeta>/_scan/.analyze_ref.py <video> [--name <nombre>] [--out <carpeta>]: analiza un video de ejemplo y extrae fotogramas de referencia.render.py <plan> [--vista-previa] [--ignorar-calidad]: renderiza el plan a un video 9:16.--vista-previahace un renderizado rápido de baja resolución.review_material.py <carpeta>: genera hojas de revisión para clips.- Scripts de utilidad en
SKILL/scripts/.