Legenda Simples — frases cortas, sin animacion, al ritmo de la voz
Una frase a la vez, texto blanco en negrita, minuscula con inicial mayuscula (como se transcribe), sin fondo, sombra suave, en el tercio inferior, sin rojo y sin animacion de entrada. Ej.: "El problema es que" / "sin practica".
Prerrequisitos
- Premiere Pro (probado en 2027/27.0; ExtendScript) y Python 3.9+ con
pip install -r requirements.txt(Pillow). - Una forma de ejecutar ExtendScript en Premiere (MCP con
execute_extendscripto el bridge CEP por archivo) — verdocs/PREMIERE-BRIDGE.mden la raiz del repositorio. - Fuente Montserrat Bold instalada (gratis, Google Fonts). Si no se encuentra, defina
CAPTION_FONT_DIRo coloque el.ttfenfonts/dentro de la skill. - El modo predeterminado (PNG) no necesita
.mogrt. Solo la alternativa.mogrtnecesitaassets/Simple_Text_WbW.mogrt(veaassets/LEIA-ME.md).
Parametros (fuente de la verdad: style.json y RULES en scripts/plan_phrases.py)
- 9x16 (1080x1920). Montserrat Bold 66 px, blanco, sombra suave (blur 6, dy 4, 55%).
y_center0,70. - Sin animacion de entrada: cada frase es un PNG transparente 1080x1920 (
make_stills.py) que aparece completo en el 1er cuadro y desaparece en corte seco. El.mogrtpalabra por palabra no sirve: la entrada esta incorporada (solo existen "Out Animation" y "Anim Speed" 50-500, no "In Animation"). Contrapartida del PNG: el texto no es editable en Premiere — para corregir, editeblocks.jsony genere de nuevo (segundos). - Frase de 3-4 palabras, por programacion dinamica: evita 1-2 palabras sueltas, no termina en "o/de/que...", prefiere cortar en coma o pausa; coma solo corta con al menos 3 palabras. En habla rapida (frase atravesada en < 0,9 s) junta hasta 5 palabras, sin atravesar fin de frase (. ? !).
- Margen seguro: nada fuera del title safe de Premiere (80% x 80%); ancho util 78% (842 px en 1080), bloque dentro de 10%-90% de la altura. El texto se reduce hasta
min_scaley, si no cabe, se divide en 2 lineas; tamano redondeado hacia ABAJO. Verificar concheck_margins.py(debe darfuera del margen: 0). - Entrega: editar directamente en la secuencia indicada (sin copia), a menos que el usuario pida copia.
Tiempo en pantalla = tiempo de la voz (modo sync, predeterminado)
- La frase nace al inicio de la 1a palabra hablada (retraso cero) y muere al final de la ultima +
tail0,3 s, extendida hastamin_dur0,8 s solo si hay silencio despues (nunca invade la proxima frase). Una frase que quedaria < 0,5 s se pega a la anterior solo si cabe en 5 palabras y la anterior no cerro una frase. - Nota de proyecto: existe tambien el modo
schedule_mode: "lag"(tiempo de lectura: cada frase permanece al menos ~0,9 s y, si la voz es mas rapida, la siguiente entra despues, hasta 0,9 s). Esto despega el subtitulo de la voz (inicio y fin dejan de coincidir y la duracion varia sin relacion con lo que se habla), por eso el predeterminado essync. Uselagsolo si el usuario pide lectura mas lenta (--configcon{"schedule_mode":"lag"}). - Limite honesto: voz muy densa (~3,6 palabras/s, picos de 6/s) hace que algunas frases queden cortas (0,36-0,8 s). Es la voz, no el subtitulo.
Opcion A — solo subtitulo en una secuencia ya editada
- Confirmar el proyecto/secuencia con el usuario y dejarla activa.
- Transcripcion: JSON exportado de Premiere (Texto > Transcripcion > ... > Exportar; queda en Documentos ".json").
PYTHONIOENCODING=utf-8 python -I <skill>/scripts/plan_phrases.py <transcripcion.json> <carpeta>/blocks.json; muestre la lista y las palabras[revisar].python -I <skill>/scripts/make_stills.py <carpeta>/blocks.json <carpeta>/png --track 1(genera PNGs + JSX; use una carpeta NUEVA cada generacion — Premiere bloquea los PNGs ya importados) ypython -I <skill>/scripts/check_margins.py <carpeta>/png/stills_clips.json.- En Premiere, con la secuencia activa: ejecutar
stills_import.jsx(importa los PNGs en un bin) y luegostills_01.jsx...uno por uno (ok=20/20). Los tiempos ya salen en la cuadricula de cuadros (--fps, predeterminado 30).
Opcion B — edicion dinamica completa (cortes + zoom + subtitulo)
- Importar el video en el proyecto y tener la transcripcion de Premiere.
python -I <skill>/scripts/plan_edit.py <transcripcion.json> <carpeta>: elimina pausas/respiros > 0,3 s y las dudas (texto vacio), hace sub-cortes de ~3 s en puntuacion, alterna zoom 100%/116% y escribeclips.json+blocks.jsonya en el tiempo cortado. Ajustes en la parte superior del script (GAP,ZOOM_ALT,SUB_MIN/MAX).python -I <skill>/scripts/build_cut_script.py <carpeta>/clips.json <carpeta> --item <nombre del archivo en el proyecto> --name "<nombre> editado 9x16"->montar.jsx; ejecute en Premiere (la secuencia original no se toca).- Subtitulos: pasos 4 y 5 de la Opcion A con el
blocks.jsonde esta carpeta. - Guardar el proyecto y entregar listando: cortes, zoom, palabras dudosas y lo que no se vio.
Alternativa .mogrt (texto editable, CON entrada palabra por palabra)
python -I <skill>/scripts/make_graphics_script.py <carpeta>/blocks.json <carpeta>/lote.js --track 1 (usa assets/Simple_Text_WbW.mogrt; Anim Speed en style.json) y ejecutar los lotes lote_NN.js. Use solo si el usuario acepta la animacion.
Consejos de Premiere (descubiertos en la practica)
importFilesnecesita ruta absoluta (new File(...).fsName);createNewSequenceFromClipshereda 1080x1920 de un video vertical.- Render:
app.encoder.encodeSequence(...)+startBatch()puede no entrar en la cola de Media Encoder. Lo que funciono:seq.exportAsMediaDirect(salida, preset, app.encoder.ENCODE_ENTIRE)(renderiza dentro de Premiere, ~5 min para 90 s). Preset:<carpeta de Premiere>/MediaIO/systempresets/.../H264 Match Source - High bitrate.epr(busque con glob; queda dentro de la instalacion). El preset "MooV" genera audio PCM en .mov/.mp4; si se va a publicar, reempaquete conffmpeg -c:v copy -c:a aac. - Exportar frame (
exportFramePNGvia QE) puede fallar; los PNGs del subtitulo evitan esto: lo que se ve en el PNG es lo que va al video.
Ajustes rapidos
| Quiero | Modificar en |
|---|---|
| Fuente/tamano/posicion/sombra | style.json (font_path, mogrt_font, mogrt_size, y_center, shadow_*) |
| Mas tiempo en pantalla | min_dur, tail en RULES (en sync solo extiende al silencio) |
| 3 palabras en lugar de 4 | {"max_words": 3} via --config |
| Mas/menos cortes y zoom | GAP, ZOOM_ALT, SUB_MIN/SUB_MAX en plan_edit.py |
Limites conocidos
- PNG no es texto editable (corregir = editar
blocks.jsony regenerar). - La transcripcion de Premiere puede equivocarse; revisar el
blocks.jsonantes de aplicar. - La fuente de referencia parece Proxima Nova Bold (mas estrecha); se usa Montserrat Bold (libre).