Edición con gráficos en movimiento + interfaz de edición
Habla con el usuario en su idioma. Escribe los subtítulos con las palabras exactas del orador (nunca parafrasees).
Rutas: ME = esta carpeta del skill, W = una carpeta de proyecto por video. Todos los scripts son bash/python/node; scripts/env.sh encuentra ffmpeg, node, python, Chrome y el motor empaquetado (engine/). Primera vez: consulta README.md → Instalación (npm install en la carpeta del skill, pip install -r requirements.txt).
Reglas (no negociables)
- Solo logotipos oficiales para cualquier marca mencionada — nunca un icono "inspirado" redibujado. Obténlo del sitio web de la marca (
capture_site.js) o pregúntale al usuario. - Manual de marca: para un cliente, lee los colores, fuentes y logotipo de su sitio web (
captures/info.json) y escribe la paleta al inicio departs/top.js. Para los videos del propio usuario, pregunta por su manual una vez y guárdalo entheme.json+top.js. - Capturas del sitio web: captura el sitio del cliente (páginas completas, escritorio + móvil) y úsalas en los paneles (navegador con scroll, ilustraciones oficiales recortadas). Los banners de cookies se ocultan, nunca se aceptan. Las pantallas de producto con sesión iniciada no son accesibles: indícalo y ofrece integrar capturas de pantalla que el usuario proporcione.
- Ritmo: pantalla completa ↔ paneles (alejamiento ENTRANDO, acercamiento SALIENDO), acercamientos en palabras fuertes (~1 cada 2-3 s), exactamente un momento destacado (revelación del logotipo/nombre), música de fondo atenuada bajo la voz, efectos de sonido (whoosh en cada zoom, pops, clics, tecleo, impacto en la revelación), destello de luz en los cortes.
- Anuncios pagados: nada importante en el 14 % superior (y < 270) ni por debajo de y ≈ 1250 (interfaz de Reels/TikTok); subtítulos elevados (
CAPDY); sin subtítulos dentro de los paneles (el panel muestra las palabras como títulos); tarjeta final = logotipo de la marca + URL + las palabras del orador; sin afirmaciones ni números inventados. - Subtítulos nunca sobre el rostro. Idiomas LTR →
"sens": "ltr"enprojet.json(el build corrige el orden de las palabras); RTL (árabe) →"rtl". Nombre de la marca como una píldora (fx: "pill", colores enprojet.json → pill). - Mezcla: el usuario ajusta voz / música / efectos en el editor. Valores predeterminados: voz 100 %, música 46 %, efectos 36 %. Siempre normaliza el volumen a -14 LUFS.
- Cada animación es un ELEMENTO del registro (ver más abajo) para que el usuario pueda seleccionarlo, desplazarlo, ocultarlo y comentarlo. No hay animación fuera del registro.
- Anclajes: cada
wS(card, word)debe apuntar a la palabra que la animación ilustra — ejecutascripts/ancres.pyy lee la tabla; nunca adivines un índice.
Flujo de trabajo
- Preparar:
bash $ME/scripts/preparer.sh <video> <W> <lang> "<Whisper prompt: nombres propios>"→ fuente copiada, recorte a pantalla completa, fotogramas, cortes probables, transcripción palabra por palabra. Luego el recorte de la persona en el fondo (~1 s/fotograma; no ejecutes Whisper al mismo tiempo — RAM):python $ME/engine/mask.py u2net_human_seg <W> && python $ME/engine/make_head.py <W>. - Cliente (si aplica):
node $ME/scripts/capture_site.js <url> <W>→captures/,assets/logo-*.png, colores/fuentes. Revisa las capturas; recorta elementos visuales útiles enW/assets/(ilustraciones, una página larga para un navegador con scroll). - Subtítulos: escribe
W/cartes.json(palabras exactas + tiempos de Whisper; tarjetas de 2-5 palabras;hot,fx) →python $ME/scripts/cartes.py <W>. Plantilla:templates/cartes.EXAMPLE.json. - Plan de edición: divide el guion en bloques (gancho, problema, producto, prueba, CTA…), elige para cada uno: pantalla completa o panel, qué objeto concreto mostrar, un momento destacado, sonidos. Escribe
W/plan-montage.md(plantillatemplates/plan.EXAMPLE.md) y muéstralo brevemente al usuario antes de animar. - projet.json (plantilla
templates/projet.EXAMPLE.json):nom,titre,langue,sens,outro,vol,musique_gain,pill,coupes,cadrage(tomas que van a un panel → ventana de medición),cadrage_forcesi la máscara captura el fondo. Luegopython $ME/scripts/framing.py <W>. - Escenas en
W/parts/:top.js←templates/top.EXAMPLE.js(paleta,CUTS/SEGB,PANELS, zoomsZP,CAPDY);primitives.js←templates/primitives.js;gfx.js←templates/gfx.EXAMPLE.js(SCENES_ED, unEL(...)por animación, capas, tarjeta final, fuentes). - Sonidos:
W/sons.json(plantillatemplates/sons.EXAMPLE.json):musique{bpm, intro_filtree, coupure = silencio antes de una revelación, accords} yevents=[element|null, time|"fin+x", "sound[:param]", gain, [repeat, step]]. Sonidos: pop, bulle, clic, shutter, succes, buzz, tick, touche, impact, tape, whoosh_in:dur, whoosh_out:dur, ding:freq:dur, shimmer:dur, riser:dur, souffle:dur. Vincula cada sonido a su elemento para que lo siga cuando el elemento se desplaza u oculta. - Anclajes:
python $ME/scripts/ancres.py <W>. - Vistas previas:
python $ME/scripts/build.py <W>luegonode $ME/engine/04_render_frames.js <W> preview t1 t2 …→ hoja de contactos → revisa como un editor exigente (¿legible? ¿rostro claro? ¿zonas seguras para anuncios?) y corrige antes de renderizar. - Renderizar:
bash $ME/scripts/rendu.sh <W>(segundo plano, 3-6 min) →<nom>.mp4(+.srt/.txt), pistas enmixage/pistes/, medios del editor. Revisa 6-8 fotogramas del MP4, -14 LUFS, tamaño. - Editor: ejecuta
python $ME/scripts/editor_server.py <W> <port>(en Claude Code de escritorio: agrégalo a.claude/launch.jsony usa la herramienta de vista previa), abrehttp://localhost:<port>/editeur/. Verifica que la vista previa, la selección con clic y la reproducción funcionen. - Monitorear comentarios: vigila
W/comments.jsony emite una línea por cada comentario nuevo constatus == "à faire"(comando enreferences/editor.md).
Procesar un comentario
- Léelo (
target=el:<id>|scene:<id>|cap:<n>|audio:<track>,t, clicx,y). - Establece el estado "en cours":
POST /api/comments/status {"id":…,"status":"en cours"}. - Cambia el elemento en
parts/gfx.js(otop.jspara zooms/paneles,cartes.jsonpara subtítulos,sons.jsonpara sonidos), manteniéndote dentro del manual de marca y el registro. Si la solicitud es vaga, aplica la mejor opción y menciona una alternativa en la respuesta. python $ME/scripts/build.py <W>(+sons.pysi cambian los sonidos) → el editor recarga su vista previa automáticamente. Revisa 1-2 fotogramas de vista previa.- Estado "fait" + un
replybreve (qué cambió) — se muestra en el editor. Recuerda al usuario que puede hacer clic en "Renderizar el video". - Una preferencia general ("Nunca quiero X") → agrégala a las Reglas de este archivo.
Registro de elementos (contrato con el editor)
EL(id, name, scene, layer, [x,y,w,h], ()=>[start,end], t=>{…draw…})
layer:'panel'(dibujado dentro del panel, detrás de la cabeza emergente) ·'full'(pantalla completa, al frente) ·'none'(globales: destellos, tarjeta final).trecibido = tiempo desplazado por el editor (EDITS.off); dibuja solo dentro de tu ventana; oculto siEDITS.hide[id].- La caja
[x,y,w,h]se usa para hacer clic en la vista previa: mantenla precisa. SCENES_ED= escenas listadas a la izquierda del editor (id,label,a,b,kind).- Zooms: cada entrada
ZPes el elementozoom<i>(se puede eliminar en el editor).
Archivos del proyecto
projet.json · cartes.json → caps.json (caps.orig.json = base del editor) · sons.json · parts/{top,primitives,gfx}.js · framing.js · edits.json (configuración del editor: off, hide, caps, vol) · comments.json · captures/, assets/ · mixage/pistes/ · editeur/ · <nom>.mp4/.srt/.txt.