Communitygithub.com

Visual Guide Video

Analiza videos (mp4) y produce videos explicativos y de destacados con dirección escénica mediante código. Gestiona diferentes tipos de video como grabaciones de pantalla, juegos, vlogs, animaciones y contenido promocional, aplicando efectos, música y narración personalizados.

¿Qué es Visual Guide Video?

Esta habilidad permite generar videos de alta calidad con dirección artística automatizada, utilizando un enfoque basado en código y scripts de Python en lugar de software de edición tradicional. Analiza el video de entrada para identificar su tipo (grabación de pantalla, juego, vlog, animación o promocional) y luego aplica un perfil de efectos predefinido, que incluye zoom, resaltados, texto emergente, etiquetas, efectos de sonido, música de fondo y corrección de color. El usuario puede personalizar el resultado final ajustando un archivo de línea de tiempo (`timeline.py`) que contiene todos los parámetros de la edición. La habilidad está diseñada para funcionar en plataformas como Claude Code, Cursor y Codex, y utiliza bibliotecas de Python como OpenCV, imageio-ffmpeg, NumPy, SciPy y Pillow, así como Edge-TTS para la narración. Su principal ventaja es la automatización de tareas complejas de edición de video mediante código, ofreciendo un control preciso sobre cada aspecto del resultado final. El flujo de trabajo típico comienza con el análisis del video, seguido de la selección de un perfil, la personalización de la línea de tiempo, la previsualización iterativa y la renderización final. El usuario puede dar instrucciones en lenguaje natural como "agrega efectos explicativos a la grabación de pantalla", "edita el video del juego para hacerlo divertido" o "crea un video promocional", y la habilidad se encarga del resto.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add bitlife70/visual-guide-video

Preguntar en tu IA favorita

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

Documentación

¿Qué hace Visual Guide Video?

Analiza el video y escribe un único archivo de línea de tiempo (timeline.py). El motor renderiza todos los efectos, música y sonidos en código. No se utilizan herramientas de edición externas ni archivos de audio.

SKILL_DIR = carpeta donde se encuentra este SKILL.md. Los scripts se ejecutan con python "$SKILL_DIR/scripts/<name>.py".

0. Preparación

pip install -r "$SKILL_DIR/requirements.txt"   # opencv-python imageio-ffmpeg numpy scipy pillow edge-tts

ffmpeg se usa mediante el paquete imageio-ffmpeg. Las fuentes para coreano y emoji se detectan automáticamente del sistema operativo (se pueden especificar con VGUIDE_FONT_BOLD/REGULAR/EMOJI). La carpeta de trabajo se coloca junto al video: project/timeline.py, resultados en project/build/, project/output/.

1. Identificación del tipo de video → Selección del perfil

python "$SKILL_DIR/scripts/analyze.py" VIDEO --out build/analysis

Observa el Tipo estimado en la consola y las imágenes en build/analysis/sheets/*.jpg. Decide el tipo de video. El PROFILE cambia los valores predeterminados, y los valores escritos en timeline.py siempre tienen prioridad.

PROFILEObjetivoValores predeterminadosEfectos clave
screenGrabación de pantalla, tutorial, demoMúsica pop, audio original desactivado, barra de progresoSHOTS zoom, CLICKS, LINKS, HIGHLIGHTS, CARDS, HUD, FLOW
gameJugabilidad, jefe final, destacadosMúsica épica (bajo), audio original activado, corrección de color cinematográfica, 30fpsMAGNIFY, IMPACTS, SPEED/FREEZE, POPS, CALLOUTS(@track), análisis de barra de HP
vlogVida diaria, viajes, reseñasMúsica chill, audio original activado, corrección de color cálidaCALLOUTS, STICKERS, SPEED (avance rápido), subtítulos, GRADES
animAnimación, video de personajesMúsica cute, corrección de color vívidaPOPS (divertido), STICKERS, CALLOUTS, FREEZE
promoPublicidad, promoción, viajes, marcaMúsica épica (alto), audio original desactivado, 30fpsTYPE (tipografía publicitaria, sello), CLEANUP (borrar texto original), transición INK, GLOWS, LETTERBOX, partículas estacionales, arco de música zen

Cada tipo define qué explicar:

  • screen: "¿Dónde se hace clic y qué cambia?" → zoom en el punto de clic, flechas hacia el panel cambiado, tarjetas de estado.
  • game: "¿Qué sucedió (ataque, defensa, impacto, recuperación, patrón del jefe)?" + diversión → sensación de impacto, ventanas emergentes de reacción, lupa para objetivos lejanos, pausa explicativa en momentos clave, avance rápido en secciones aburridas.
  • vlog: "¿Dónde y qué se hace?" + emoción → ambiente más que explicación. Los clímax de eventos (cumpleaños, viajes, graduación) se ralentizan y se potencian con partículas; las secciones con movimiento tembloroso se aceleran; los momentos de tomar fotos se congelan con efecto Polaroid; el final es un collage de fotos como outro.
  • anim: Énfasis en la reacción del personaje → ventanas emergentes lindas, stickers, congelación de expresiones clave.
  • promo: "Que el espectador quiera ir y comprar" → en lugar de subtítulos, copias publicitarias cortas (2 líneas de apertura → título principal → capítulos por escena → tarjeta final). Transiciones características como manchas de tinta al cambiar de escena. Curva de energía musical (tranquilo → creciente → clímax → eco → final). Si el original tiene texto en otro idioma, se elimina y se reemplaza por el idioma objetivo (versión internacional).

Principios de edición comunes (lo que más gusta a los usuarios): Las secciones innecesarias (movimiento, carga, cámara temblorosa) se aceleran, los momentos importantes se congelan para agregar explicación o decoración. En la fase de análisis, cada sección se clasifica como "esencial / de conexión / relleno".

2. Análisis — Cuándo, dónde, qué sucede

Tipos de eventos en events.json:

  • Comunes: cut (cambio de escena), flash (destello), loud (pico de sonido = golpe, explosión), motion (pico de movimiento)
  • screen: switch (candidato a clic/toque), big-change, scroll
  • Barra de HP (--bar): bar-drop/bar-big-drop (impacto), bar-low (peligro), bar-empty (muerte), bar-rise (recuperación)

En juegos, se debe medir la barra de HP. Los momentos de impacto, recuperación y muerte se identifican con precisión de fotograma.

python "$SKILL_DIR/scripts/crops.py" VIDEO --t 10,30 --box 200,940,500,100 --step 25 --out build/hp.jpg   # Medir coordenadas de la barra
python "$SKILL_DIR/scripts/analyze.py" VIDEO --out build/analysis --bar player:337,982,626,988 --bar boss:1015,911,1590,915
  • La caja de la barra se define como una sola línea dentro de la barra (altura 4~8px). Para barras blancas usar light, para barras de color usar :any.
  • Observa bar_<nombre>.png (cairograma: vertical = tiempo) y verifica si los eventos coinciden. Si la barra parpadea en rojo al recibir daño o la interfaz desaparece, puede haber falsos positivos. Cruza la verificación con graph.png y las hojas.
  • Las hojas tienen intervalos de 2 segundos. En las secciones de combate, extrae fotogramas cada 0.3~0.6 segundos para interpretar qué acción es (ataque/rodar/recibir daño/transformación).

Coordenadas precisas: Mide siempre con recortes de cuadrícula.

python "$SKILL_DIR/scripts/crops.py" VIDEO --t 7.4,13.5 --box 0,760,420,240 --out build/crops.jpg  # Área, cuadrícula de 50px
python "$SKILL_DIR/scripts/crops.py" VIDEO --t 12 --full --out build/grid.jpg                    # Completo, cuadrícula de 100px

3. Escribir timeline.py

Comienza con una receta. Copia la receta correspondiente al tipo de video en timeline.py y solo completa los [valores a rellenar 1] (tiempos, coordenadas, frases de los momentos clave). La estructura de efectos ya está verificada. Luego, con la vista previa, ajusta o agrega elementos según el video.

RecetaObjetivoValores a rellenar
recipes/screen_walkthrough.pyTutorial de pantalla, demoClics (tiempo, coordenadas, frase, lugar cambiado, tarjeta), área a resaltar, subtítulos
recipes/game_boss_fight.pyDestacados de combate en juegosPosición de la barra de HP, impactos (tiempo, HP restante), ataque propio, caída del jefe, recuperación, muerte/eliminación, secciones de movimiento, subtítulos explicativos
recipes/event_vlog.pyVlog de cumpleaños, aniversario, fiestaTiempo y objetivo del clímax, secciones temblorosas, cuenta regresiva de fotos/fotograma congelado, aparición de invitados, última escena
recipes/promo_shorts.pyShort vertical de 30s (montaje promocional)Lista de segmentos (segmento original, duración de salida), paneo por escena, palabras estacionales/frases de capítulo, tipo de transición
recipes/promo_film.pyPelícula promocional, de viajeCopia de apertura, tarjeta principal y final, escenas (segmento, velocidad, frase de capítulo, sello, cámara, partículas, energía, sonido de fondo), tiempo de transición de tinta, objeto brillante, texto a borrar

Los valores predeterminados de las recetas están verificados con videos reales; si se dejan igual, el resultado se verá como el ejemplo (para otros videos, se debe volver a medir). Para elementos que no están en la receta, consulta el esquema completo en templates/timeline_template.py. Si no hay una receta adecuada, comienza con la plantilla. Guarda timeline.py del video trabajado en la carpeta de ese video. No coloques en el repositorio de la habilidad líneas de tiempo de videos específicos (nombres de personas, escenas personales, contenido del trabajo); los patrones generalizables se trasladan a las recetas y a este documento.

Regla: Los tiempos son siempre del 'video original', las coordenadas son 'píxeles originales'. Aunque SPEED/FREEZE cambien la duración de salida, el motor lo convierte automáticamente. Para tiempos dentro de una sección congelada, escribe (tiempo original, segundo de desplazamiento de salida): (49.45, 1.6) = la congelación comienza en 49.45 segundos y 1.6 segundos después. Se usa para mostrar ventanas emergentes, Polaroid ou outros, en orden, durante la congelación.

Elementos universales (todos los perfiles)

ElementoUso
TRIM, SPEED, FREEZERecortar sección, velocidad/cámara lenta (etiqueta de badge, si label=None sin badge), pantalla congelada (look desat=para explicación / photo=solo flash de obturador). El avance rápido tiene desenfoque de movimiento automático (SPEED_BLEND)
TRACKSFotogramas clave de objetos en movimiento. auto=True (seguimiento OpenCV: personas, animales) / auto="match" (coincidencia de plantilla: objetos de forma fija como pasteles, letreros, seguimiento con una sola clave hasta until) / follow="padre" (objeto unido al track padre, ej. vela sobre pastel). Se referencia en otros elementos como "@nombre", "@nombre:top"
PARTICLESPartículas confetti/hearts/sparkle/bokeh/notes/stars/snow/petals/leaves/fireflies (especificar color como palette=[6]). Desde track/coordenadas con burst (explosión única) o rate (continuo), pantalla completa (at="screen")
PHOTOSMostrar un fotograma original como Polaroid (con pie de foto, ángulo, entrada cayendo). Para collage de pantalla congelada/outro
SHOTSCámara: zoom en coordenadas / "full" / "fill" (llena sin letterbox) / "@track" zoom de seguimiento
MAGNIFYLupa: ampliar objeto lejano en círculo + línea de conexión + etiqueta
CALLOUTSBurbuja de diálogo que apunta a un objeto (sigue al track)
POPSTexto emergente estilo impact/danger/cool/info/funny/small/party/sweet/count (número de cuenta regresiva)
STICKERSStickers emoji (bob/pulse)
IMPACTSSensación de impacto hit/heavy/crit/damage/block/parry: sacudida+flash+zoom punch+aberración cromática (+ sonido automático)
SHAKE, FLASHSacudida/destello manual
GRADE, GRADESCorrección de color cinematic/warm/cool/vivid/mono/sepia/danger/dream/night (transición por sección)
SFX, SFX_VOLUMEBiblioteca de efectos de sonido: hit boom clang pop ding scratch sad_trombone heartbeat shutter slowmo crash whoosh riser party_horn twinkle confetti / stamp temple_bell ink gliss gliss_down / sonidos de fondo con duración "waves:8" "wind:6" "water:6" "birds:5"
SOURCE_AUDIOSonido original (las secciones en cámara lenta bajan el tono, las congeladas silencio, las de avance rápido reducen el volumen con fast_gain)
MUSICstyle pop/epic/chill/cute/zen, arc (zen: energía por escena), start (música desde este tiempo), drop, end (+end_fx scratch/fade/cut), volume
MASTER_GAIN_DBGanancia final de la mezcla (antes del limitador). Los videos de teléfonos móviles tienen volumen bajo, por lo que se necesita +3~5 dB
CUSTOM_LAYERS, CUSTOM_FRAME_FX, CUSTOM_SFXEfectos nuevos solicitados agregados como funciones dentro de timeline.py (ver más abajo)
OUTPUT_SIZE, FPS, QUALITYResolución de salida (ej. 720p (1280, 720)), fps, CRF
CANVAS, BACKDROPLienzo de diseño. Para shorts verticales: CANVAS = (1080, 1920) + OUTPUT_SIZE = (1080, 1920). El original horizontal se coloca en una banda central y el espacio en blanco se rellena con BACKDROP ("black", "blur", dict(kind="blur", tint=(r,g,b), amount=0.5)). Para llenar la pantalla, usar zoom SHOTS ≈ 3.16 (= 1920 / 607.5) y paneo en x
SPEED_RAMPPara unir secciones de velocidad sin espacios (montaje de shorts): las transiciones entre secciones no vuelven a 1x, solo pasan suavemente por este tiempo

Elementos de publicidad y promoción (scripts/promo.py, usable en todos los perfiles)

ElementoUso
CLEANUPBorrar texto, sellos, logotipos del original (t0, t1, (x0,y0,x1,y1), dict(plate=(ta, tb), ref=t)). plate = fotograma sin texto en la misma escena → restaura el fondo tal cual (si la escena tiene paneo/zoom, se corrige automáticamente con correlación de fase). mask="box" reemplaza toda la caja (fondo estático), sin plate se usa inpainting (NS + textura de papel), live=True para texto en movimiento (ej. etiqueta que se desliza, ink="light")
TYPETipografía publicitaria. "line" (copia que aparece palabra por palabra), "hero" (título grande que aparece juntando espacio entre letras + subtítulo + sello), "chapter" (sello que se imprime y luego aparecen el kicker, la línea decorativa y el título, con veil para un velo de niebla detrás). Las coordenadas son en el lienzo 1920x1080, color color, legibilidad halo
GLOWSResplandor de sol, luna, luz + destello de lente (streak, ghost) — sigue al track
INKTransición de mancha de tinta (t, dict(dur, at)): en t cubre la mayor parte de la pantalla y luego se retira desde el centro (sonido automático)
TYPE "slam"Para shorts: una palabra grande 'golpea' al ritmo — se dibuja sobre la tinta para que sea visible incluso cuando la pantalla está cubierta (over_ink). Sello seal
LETTERBOXLetterbox cinematográfico dict(ratio=2.39, range=(t0, t1)) — entrada y salida suaves. Las partículas también se ocultan debajo de las bandas

Cuando te pidan un efecto nuevo — Hook personalizado

No modifiques el motor; escribe funciones en timeline.py. ctx contiene t (tiempo de salida), ts (tiempo original), raw (fotograma original), frame (lienzo actual BGR), view, cv (lienzo de superposición), tl, gfx, fx, W, H, screen("@boss"), window(t0, t1) (intervalo de tiempo original → (alpha, progreso)).

def speed_lines(ctx):                           # CUSTOM_LAYERS: dibujar superposición (sin retorno o nuevo frame)
    w = ctx.window(57.2, 58.4)
    if w:
        x, y = ctx.screen("@boss")
        for k in range(12):
            a = k / 12 * 6.283
            ctx.fx.draw_line(ctx.cv, (x + 300 * math.cos(a), y + 300 * math.sin(a)),
                             (x + 700 * math.cos(a), y + 700 * math.sin(a)), (255, 255, 255), 3, w[0] * 0.6)
CUSTOM_LAYERS = [speed_lines]

def red_pulse(ctx):                             # CUSTOM_FRAME_FX: transformar frame → retornar nuevo frame
    return ctx.fx._tint(ctx.frame, (255, 0, 0), 0.15) if ctx.window(76, 78) else None
CUSTOM_FRAME_FX = [red_pulse]

def boss_roar(a):                               # CUSTOM_SFX: a = dict(buf, add, lib, tl, SR)
    a["add"](a["buf"], a["lib"]["boom"](), a["tl"].out(14.4), 0.8)
CUSTOM_SFX = [boss_roar]

Los efectos que se usen con frecuencia se trasladan posteriormente a fx.py para convertirlos en elementos oficiales.

Reglas de diseño (basadas en problemas reales)

Comunes

  • Los emojis se renderizan en color. Los símbolos como ▸ ✓ ✕ pueden mostrarse como □, por lo que se usan emojis (✅ ✖️ 👉 ⏩ ⏸) o • → ·.
  • Los subtítulos deben tener menos de ~40 caracteres por línea. Las palabras clave se resaltan con [corchetes]. Para subtítulos explicativos en pantalla congelada, escribe (tf, tf, "...") donde el tiempo de inicio y fin son iguales al tiempo de congelación, para que solo aparezcan durante la pausa.
  • No superpongas más de 3 ventanas emergentes, burbujas de diálogo o stickers al mismo tiempo. Las ventanas emergentes duran 0.8~1.2 segundos.

screen

  • Divide el tiempo entre tarjetas y resaltados para que no se superpongan (tarjeta → resaltado). Las tarjetas deben terminar antes del siguiente zoom de clic.
  • Si un resaltado sale del encuadre durante el zoom, se corta → relación de zoom 1.15~1.3.
  • Colocación de etiquetas: "right" (flecha), "above-right" (fila de tabla), "below" (elemento superior). El HUD entra en modo mini (100px a la izquierda) con zoom superior a 1.12x.

game

  • Las pantallas ultra-wide (21:9) se colocan en un lienzo 16:9 con letterbox. Las bandas superior e inferior contienen la insignia de velocidad y los subtítulos, sin obstruir la acción. Para llenar la pantalla, usa "fill" en SHOTS.
  • Los resaltados de la barra de HP usan "above|nodim" — si se oscurece la pantalla, no se ve la acción.
  • El zoom máximo es de 1.3~1.5x. Si la acción es rápida, un zoom excesivo hace que el objeto salga del encuadre. Si se necesita más ampliación, usa MAGNIFY.
  • Las congelaciones (FREEZE) duran 12 segundos, con 34 veces por video es suficiente. Durante la congelación, usa CALLOUTS para señalar "quién hace qué".
  • Las secciones de movimiento y carga se reducen con SPEED 23x. La cámara lenta (0.30.4x) solo se usa para impactos y golpes decisivos durante 0.5~1 segundo.
  • Los fotogramas clave del track se registran cada vez que el objeto se mueve significativamente. En los cambios de escena (cortes), escribe el mismo valor dos veces (justo antes y justo después) para evitar interpolaciones bruscas. Verifica con una hoja creada por python "$SKILL_DIR/scripts/tracks.py" timeline.py.
  • Usa los eventos de HP para identificar los momentos de impacto y ajusta IMPACTS con precisión de fotograma. Recibir daño = damage/crit, golpe propio = hit/heavy.
  • Mantén el sonido original del juego y baja el volumen de la música (0.3~0.45). En el momento de la muerte, usa MUSIC["end"] + end_fx="scratch" para cortar la música y agrega un efecto de sonido como sad_trombone para un toque de humor.

promo (publicidad, promoción, versión internacional)

  • Para borrar texto original: elige como plate un fotograma al menos 0.4 segundos antes de que aparezca el texto o después de que desaparezca. En fotogramas con fundido, el texto aún es visible tenuemente → verifica con un recorte de alto contraste (sin desenfoque de fondo ×4). Después de borrar, revisa con un recorte de resolución original --preview para ver si quedan rastros.
  • Para fondos que cambian constantemente (niebla, rocío), el plate no es adecuado (produce manchas grises) → usa inpainting sin plate y coloca tipografía de capítulo con veil en esa zona.
  • La detección de sellos rojos solo captura rojo intenso (excluye cielos anaranjados). Si el cielo es anaranjado, verifica que el cuadro completo no cambie de color.
  • Las copias deben ser cortas: apertura de 24 palabras × 2 líneas, títulos de capítulo de 25 palabras, tarjeta final con marca + una línea. No uses eslóganes oficiales de instituciones o marcas reales.
  • La tipografía se coloca dentro del letterbox (excepto 140px arriba y 140px abajo). El lugar donde estaba el texto original suele ser un 'cielo vacío', ideal para colocar capítulos.
  • Música: zen usa arc para definir la energía por escena. Ajusta la velocidad de la escena para que el tiempo de la transición de tinta caiga en el límite del compás (80 BPM = 3 segundos), para que la transición, el tambor y el sello coincidan con el ritmo (usa tl.load para ver el tiempo de salida → ajustar velocidad). El volumen por etapa debe tener una diferencia grande, como calm −20 / peak −12 dB, para que el clímax se sienta.
  • Las escenas clave (biombo narrativo, amanecer) van a 0.751x, los paisajes lentos a 1.52.4x. Usa la mancha de tinta solo para transiciones de grandes partes (estación, región); dentro de la misma parte, conserva la transición original.
  • Shorts verticales (30s) (recipes/promo_shorts.py): 96 BPM (un compás de 2.5s) por escena. Usa SEGMENTS = [(inicio original, fin, duración de salida)] para unirlos y calcula la velocidad inversamente con Remap para que las transiciones caigan exactamente en el compás. Las transiciones originales (crossfade) se comprimen a 0.2s y se ocultan bajo la mancha de tinta o el flash.
    • El primer segundo es el anzuelo: una línea de copia → compás 1 con el título de la marca + impacto musical. La apertura y el final usan diseño de bandas (original en el centro + tipografía arriba y abajo); el cuerpo principal usa recorte vertical completo + paneo hacia el sujeto (sol, cascada, luna en el centro; paisajes amplios de izquierda a derecha).
    • En las secciones de avance rápido, el tiempo original se acorta, por lo que los tiempos de la tipografía se escriben en tiempo de salida como (TRIM[0], segundo de salida). Los capítulos aparecen rápido con pace=0.55.
    • Las partículas se cortan con clip=True junto con el corte (para que los pétalos no pasen a la siguiente estación). Para evitar la interfaz de los shorts, la tipografía se coloca dentro de los 260px superiores y 420px inferiores.

vlog (videos familiares, de eventos)

  • Los videos de teléfonos móviles tienen mucho movimiento. Las secciones con movimiento tembloroso se aceleran 3~4x (el desenfoque de movimiento automático lo suaviza), y el sonido original se reduce automáticamente.
  • El clímax (apagar velas, brindis, gol) se pone en cámara lenta 0.4x + flash + confetti burst + party_horn. La música comienza en ese momento (MUSIC["start"]) — antes, se mantiene el sonido original (canción de cumpleaños, conversación).
  • Las escenas de tomar fotos se congelan (look="photo") en el fotograma estable justo después de presionar el obturador y se muestra un Polaroid. Verifica que el fotograma congelado sea nítido con la vista previa (los fotogramas con cámara en movimiento son borrosos).
  • No coloques stickers, ventanas emergentes ni corazones sobre las caras. Mide las coordenadas de las caras y colócalos a un lado o en espacios vacíos arriba. Para señalar expresiones (sacar la lengua, guiño), usa CALLOUTS (ring=False) desde un lado.
  • Si la cuenta regresiva es visible en pantalla (temporizador del teléfono), sincroniza las ventanas emergentes count 3·2·1 en ese momento y agrega el sonido de pop.
  • El outro consiste en un collage de 2~3 Polaroids sobre una pantalla congelada + una frase corta de felicitación (sube con top de OUTRO y stats=[]).
  • Para que la historia se entienda incluso sin subtítulos ni narrador: un título de introducción + una breve ventana emergente por escena es suficiente.

4. Vista previa iterativa

python "$SKILL_DIR/scripts/build.py" timeline.py --preview 3.5,7.4,26        # Tiempo original
python "$SKILL_DIR/scripts/build.py" timeline.py --preview-out 16.6,36.2     # Tiempo de salida (verificar congelación/cámara lenta)

Observa build/preview/sheet*.jpg y corrige superposiciones, recortes, occlusiones, errores de coordenadas, texto ilegible. Las etiquetas src ↔ out también muestran la conversión de tiempo. Las secciones congeladas no se pueden verificar con el tiempo original, así que usa --preview-out.

5. Audio

  • Música de fondo MUSIC["style"]: pop (pop electrónico 126BPM), epic (taiko, cuerdas staccato, metales, coro 96BPM), chill (lofi 82BPM), cute (marimba, pizzicato 132BPM), zen (gayageum, daegeum, janggu, buk, coro 80BPM, MUSIC["arc"] = [(tiempo original, "calm|flow|pulse|build|peak|hush|finale")]). Excepto zen, todos tienen estructura intro → A → B → build → drop → outro, y el clímax ocurre en el segundo drop.
  • Sonido original: activado por defecto en game/vlog/anim. Si hay narrador, se ducca automáticamente (SOURCE_AUDIO["duck"]).
  • Verificación de nivel: En los juegos, el sonido original es el protagonista. Mide el RMS de cada sección para que la música esté 3~5 dB por debajo del original, y los efectos de sonido solo se escuchen en el momento del impacto.
    import tl, music, build; t = tl.load("timeline.py"); m = music.build_music(t)[0] * t.music["volume"]; s = build.source_audio(t, m.shape[1])
    
  • Narrador (opcional) NARRATION = [(t, "frase")] (si no se especifica, lee los subtítulos). --voice edge (red neuronal de Microsoft, en línea — se informa que las frases se envían a Microsoft) / --voice sapi (Windows offline). Si en build/voice_report.json la tasa supera el +15% o hay overflow, acorta la frase (coreano ≈ 7 sílabas/segundo).

6. Renderizado final y verificación

python "$SKILL_DIR/scripts/build.py" timeline.py [--voice edge] [--workers 8]

Divide los fotogramas y los renderiza en paralelo con múltiples procesos, luego los une (1 minuto 1080p ≈ 2~3 minutos, 8 workers). Ejecutar en segundo plano.

Verificaciones antes de finalizar

  • La última línea [done] ... Ns (expected Ns), N MB debe mostrar que la duración coincide y no hay Traceback en el registro.
  • Extrae algunos fotogramas de la salida para verificar: ffmpeg -ss T -i out.mp4 -frames:v 1 f.png
  • Como no se puede escuchar la música ni los efectos de sonido directamente, verifica con RMS de la sección y pide al usuario que los escuche.

Estructura de archivos

ArchivoFunción
scripts/analyze.pyMetadatos, estimación de tipo, cambio de escena, picos de sonido, eventos de barra, gráficos, hojas
scripts/crops.pyRecortes de coordenadas originales con cuadrícula
scripts/tracks.pySeguimiento de objetos (interpolación de fotogramas clave, OpenCV), hoja de verificación
scripts/remap.pyRemapeo de tiempo (TRIM, SPEED, FREEZE)
scripts/build.pyVista previa / mezcla de audio (remapeo de sonido original, limitador) / renderizado en paralelo / SRT
scripts/tl.pyCargador de timeline.py, valores predeterminados del perfil, conversión de coordenadas y tiempo
scripts/render.pyCámara (seguimiento, sacudida), capas de grabación de pantalla, hooks personalizados
scripts/fx.pyEfectos universales: corrección de color, impacto, lupa, burbuja de diálogo, ventana emergente, sticker, badge, ...

... (truncado para la traducción)

El resto del documento continúa con una descripción detallada de todos los parámetros, ejemplos y mejores prácticas.

Skills relacionados