# Kit · vídeo estilo GTA 6 con IA

marbuilds.dev/resources/video-gta-ia · @itsmarbuilds

Convierte tus clips generados en un vídeo con HUD de juego (misión, objetivos, cuenta atrás,
estrellas, minimapa, +XP), subtítulos, música y cierre con tu marca. Todo sale de un solo fichero:
`montaje.json`.

## Qué hay aquí

| Fichero | Para qué |
|---|---|
| `montaje.py` | Lo hace todo: vídeo base, música, audio, HUD y vídeo final |
| `montaje.ejemplo.json` | El vídeo de la abuela entero, como plantilla para copiar |
| `hud.html` | El diseño del HUD (colores y tamaños en su `<style>`) |
| `render_hud.mjs` | Pinta el HUD fotograma a fotograma. Lo llama `montaje.py` |
| `musica.py` | Compone un beat original y los efectos (tuyos, sin derechos de terceros) |
| `prompts.md` | Todos los prompts, de la idea al montaje |

## Instalación (una vez, 10 minutos)

1. **ffmpeg, Python 3 y numpy**: en Mac, `brew install ffmpeg python numpy`.
   (Con el Python de Homebrew, `pip3 install numpy` da error de "externally-managed-environment": instálalo con brew.)
2. **Node 20 o superior** y Playwright, dentro de esta carpeta:
   ```
   npm init -y && npm i playwright && npx playwright install chromium
   ```
3. **El transcriptor** (para revisar los clips y sacar los tiempos de los subtítulos):
   ```
   brew install whisper-cpp
   curl -L -o ggml-small.en.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.en.bin
   ```
   Si los personajes hablan en español u otro idioma, baja `ggml-small.bin` en lugar de `ggml-small.en.bin`.
4. **La fuente Pricedown** (de Typodermic, sin coste para este uso). Descárgala tú desde DaFont, que es
   una fuente de descarga autorizada: https://www.dafont.com/pricedown.font. Descomprime y deja el fichero
   `Pricedown Bl.otf` dentro de `fuentes/`, **tal cual, sin renombrarlo**. Si falta, `montaje.py` se para y te lo dice.
   Su licencia de escritorio (v260817) permite usarla en vídeo comercial ("rendered audiovisual content",
   cláusula 2.2) y prohíbe repartir el fichero o meterlo en una web o plantilla para otros (4.1 y 4.3).
   Por eso no va dentro de este kit, y tú tampoco la subas a ningún repositorio.

Para generar las imágenes y los vídeos desde Claude Code (opcional pero recomendado):
```
claude mcp add --transport http higgsfield https://mcp.higgsfield.ai/mcp
claude mcp add nanobanana -e GOOGLE_AI_API_KEY=tu_clave -e NANOBANANA_MODEL=gemini-3.1-flash-image-preview -- npx -y @ycse/nanobanana-mcp
```
Higgsfield pide iniciar sesión la primera vez (en `/mcp`). **Después abre una sesión nueva de Claude Code**: sus herramientas no aparecen en la sesión en la que lo autorizaste. Y no quites `--transport http`: sin él se guarda como programa local y falla al arrancar. La clave de Google AI se saca en https://aistudio.google.com/apikey.

El HUD carga dos tipografías de Google Fonts (Barlow e Inter): **la primera vez necesitas conexión**.

## Uso

```
cp montaje.ejemplo.json montaje.json      # y edítalo con tus planos
python3 montaje.py revisar montaje.json   # 6 fotogramas con el HUD encima en build/<formato>/revision/
python3 montaje.py todo montaje.json      # el vídeo final (unos 5-8 min por minuto de vídeo)
```

Los clips van en `clips/` y el logo del cierre donde diga `cierre.logo`.

## montaje.json, campo a campo

**Tiempos.** Todo se escribe relativo a un plano: `["G", 1.5]` es el segundo 1,5 del plano G (sin contar
su congelación inicial; con números negativos entras en ella), `["G", "fin"]` es donde acaba G,
`["inicio"]` el segundo 0 y `["final"]` el último. Si cambias la duración de un plano, todo lo que va
después se recoloca solo.

**Arriba del todo**
- `formato`: `"wide"` (1920x1080, todo dentro del cuadro) o `"vertical"` (1080x1920, el vídeo en una franja y el HUD en las bandas).
- `fps`: 30. `clips`: carpeta de los clips. `salida`: nombre del vídeo final.

**`planos`** (en orden de aparición)
- `id`: una letra o palabra corta, única.
- `tipo`: `"plano"` (clip generado), `"movil"` (grabación de pantalla vertical, sin audio) o `"cierre"` (tarjeta final, opcional).
- `fuente`, `desde`, `hasta`: qué trozo del fichero, en segundos.
- `velocidad`: 3 = el triple de rápido (para teclear en el móvil). El audio del plano se acelera igual.
- `congelar_inicio` / `congelar_final`: segundos con la imagen quieta (para stingers).
- `silenciar`: `true` quita el audio del clip (úsalo en planos sin diálogo: la IA mete música).
- `recorte_movil`: `[ancho, alto, x, y]` para recortar la grabación de pantalla (quita la barra de estado o lo que no quieras enseñar).

**`hud`**
- `serie`: texto pequeño arriba (admite `<b>`). `nivel`: por ejemplo `"LVL 99"`. `moneda`: `"$"`.
- `mision`: `etiqueta`, `titulo` y `en` (cuándo está visible la caja).
- `juego`: tramos en los que se ven estrellas, dinero y XP.
- `objetivos`: `texto`, `falta` (cuándo se pone en rojo) y `hecho` (cuándo se tacha).
- `reloj`: `etiqueta` y `claves` = `[[momento, segundos que marca], ...]`. Entre claves baja solo; por debajo de 60 parpadea.
- `estrellas`, `dinero`, `xp`: `[[momento, valor], ...]`.
- `minimapa`: `en`, `etiqueta` (el barrio) y `desplazamiento` (cuánto avanza la ruta rosa).
- `botones`: `en`, `tecla` (R2, △, ✕...) y `texto`.
- `npc`: `en`, `nombre`, `nivel`, `x`, `y`. **x e y se miden sobre un vídeo de 1080x608**: pon la etiqueta sobre la cabeza del personaje y fuera de la esquina superior izquierda, que es de la caja de misión.
- `rotulos`: `en`, `grande` (ej. "+50 XP"), `texto` (ej. "NEAR MISS"), `y` (altura sobre el vídeo de 1080x608), y opcionalmente `tam_grande` y `tam_texto` en píxeles (64 y 28 por defecto). Con `sobre_movil: true` se colocan sobre la grabación del móvil (y medida en un lienzo de 1080x1920).
- `stingers`: rótulos grandes a pantalla completa. `html` con las clases `k` (antetítulo rosa), `big` (Pricedown amarillo), `sub`, `stars5` y `money`. En vertical, `subir` (60 por defecto) lo coloca más arriba o más abajo.
- `subtitulos`: `en`, `quien`, `texto` y `color` del nombre (amarillo por defecto).
- `cierre`: `logo`, `marca`, `lema` y `brillo` (color del halo, ej. `"rgba(14,230,204,.18)"`).

**`audio`**
- `musica`: `"sintetizar"` o la ruta de tu canción (con licencia). Con canción propia, los efectos se generan igual.
- `fin_gancho`: hasta dónde suena el beat entero al principio. `arranca_beat`: a partir de dónde vuelve después de la intro.
- `hueco_final`: donde se calla la batería y suena la fanfarria de misión cumplida. `outro`: donde acaba ese hueco.
- `volumen_musica`: `[[momento, ganancia], ...]`. **0,3 bajo diálogo**: más alto tapa la voz.
- `efectos`: `true` añade whoosh en cada corte, ding en cada rótulo y objetivo, estrellas y fanfarria.

## Si algo falla

- **"Falta la fuente"**: el paso 4 de la instalación. El fichero tiene que estar dentro de `fuentes/`.
- **"externally-managed-environment" al instalar numpy**: usa `brew install numpy`.
- **`Cannot find package 'playwright'`**: el paso 2, dentro de esta carpeta.
- **El audio va adelantado o retrasado respecto a la imagen**: no pasa si usas `montaje.py`. Todos los planos se cortan en fotogramas enteros; si montas a mano, haz lo mismo.
- **Un rótulo tapa una cara**: cambia su `y` o su tramo `en` y repite `revisar` (tarda segundos).
