Communitygithub.com

legenda-simples

Legenda "simples" para videos verticales 9x16 en Premiere Pro: frases cortas (3-4 palabras, hasta 5 en tramo rapido), una linea, blanco con sombra suave, Montserrat Bold, mayuscula solo al inicio de la frase, SIN animacion de entrada (aparece entera y desaparece en corte seco), sincronizada con la voz y dentro del margen seguro. Incluye el pipeline de edicion dinamica (corta pausas/respiros y alterna zoom). Estilo de cortes de podcast. USAR cuando el usuario pida "legenda simples", "legenda de podcast", "legenda por frase", "o modelo simples" o "edita esse video com a legenda simples". Para el estilo grande/rojo/palabra por palabra usa legenda-impacto.

¿Qué es legenda-simples?

Esta skill automatiza la creacion de subtitulos "simples" para videos verticales 9x16 en Premiere Pro. Genera frases cortas (3-4 palabras, hasta 5 en tramos rapidos) en texto blanco, negrita, sin animacion de entrada, sincronizadas con la transcripcion de voz y ajustadas al margen seguro. Incluye dos opciones: solo subtitulos sobre una secuencia ya editada, o edicion dinamica completa que corta pausas/respiros y alterna zoom entre 100% y 116%. El proceso utiliza scripts en Python y ExtendScript para generar PNGs transparentes y colocarlos automaticamente en la linea de tiempo. Esta pensado para creadores de contenido tipo podcast que buscan un estilo limpio y profesional sin animaciones llamativas. Soporta configuracion via archivos JSON para ajustar fuente, tamaño, posicion y sombra. Notablemente, no permite editar el texto directamente en Premiere (los PNGs no son editables), por lo que cualquier correccion requiere modificar el archivo `blocks.json` y regenerar. Si se desea texto editable con animacion palabra por palabra, existe una alternativa usando un archivo `.mogrt`.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/gbrand-lab/premiere-legendas-skills/tree/HEAD/skills/legenda-simples

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

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_extendscript o el bridge CEP por archivo) — ver docs/PREMIERE-BRIDGE.md en la raiz del repositorio.
  • Fuente Montserrat Bold instalada (gratis, Google Fonts). Si no se encuentra, defina CAPTION_FONT_DIR o coloque el .ttf en fonts/ dentro de la skill.
  • El modo predeterminado (PNG) no necesita .mogrt. Solo la alternativa .mogrt necesita assets/Simple_Text_WbW.mogrt (vea assets/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_center 0,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 .mogrt palabra 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, edite blocks.json y 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_scale y, si no cabe, se divide en 2 lineas; tamano redondeado hacia ABAJO. Verificar con check_margins.py (debe dar fuera 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 + tail 0,3 s, extendida hasta min_dur 0,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 es sync. Use lag solo si el usuario pide lectura mas lenta (--config con {"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

  1. Confirmar el proyecto/secuencia con el usuario y dejarla activa.
  2. Transcripcion: JSON exportado de Premiere (Texto > Transcripcion > ... > Exportar; queda en Documentos ".json").
  3. PYTHONIOENCODING=utf-8 python -I <skill>/scripts/plan_phrases.py <transcripcion.json> <carpeta>/blocks.json; muestre la lista y las palabras [revisar].
  4. 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) y python -I <skill>/scripts/check_margins.py <carpeta>/png/stills_clips.json.
  5. En Premiere, con la secuencia activa: ejecutar stills_import.jsx (importa los PNGs en un bin) y luego stills_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)

  1. Importar el video en el proyecto y tener la transcripcion de Premiere.
  2. 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 escribe clips.json + blocks.json ya en el tiempo cortado. Ajustes en la parte superior del script (GAP, ZOOM_ALT, SUB_MIN/MAX).
  3. 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).
  4. Subtitulos: pasos 4 y 5 de la Opcion A con el blocks.json de esta carpeta.
  5. 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)

  • importFiles necesita ruta absoluta (new File(...).fsName); createNewSequenceFromClips hereda 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 con ffmpeg -c:v copy -c:a aac.
  • Exportar frame (exportFramePNG via QE) puede fallar; los PNGs del subtitulo evitan esto: lo que se ve en el PNG es lo que va al video.

Ajustes rapidos

QuieroModificar en
Fuente/tamano/posicion/sombrastyle.json (font_path, mogrt_font, mogrt_size, y_center, shadow_*)
Mas tiempo en pantallamin_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 zoomGAP, ZOOM_ALT, SUB_MIN/SUB_MAX en plan_edit.py

Limites conocidos

  • PNG no es texto editable (corregir = editar blocks.json y regenerar).
  • La transcripcion de Premiere puede equivocarse; revisar el blocks.json antes de aplicar.
  • La fuente de referencia parece Proxima Nova Bold (mas estrecha); se usa Montserrat Bold (libre).

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Skills relacionados