Película cinematográfica
Una película hecha de esta manera es un solo movimiento de cámara sobre un único mundo. Cada foto, tarjeta, recorte, mapa y número vive en un gran tablero, y la cámara viaja entre ellos a través de cuerdas, rutas y flechas a medida que avanza la historia. Cada impacto visual está sincronizado con la palabra que dice el narrador. Todo es código (Skia en Python), por lo que se renderiza igual cada vez, se adapta a cualquier tema, y una nueva voz reajusta la sincronización de toda la película por sí misma.
Construido a partir de un documental de 5:22 sobre Al Capone, luego se abrió a cualquier tema. Las reglas aquí se escribieron a partir de lo que se rompió mientras se hacía.
Herramientas
| Archivo | Qué hace |
|---|---|
scripts/check_setup.py | Verifica Python, skia-python, ffmpeg, fuentes y memoria; indica qué instalar |
scripts/get_fonts.py | Descarga fuentes con licencia abierta (Bebas Neue, Homemade Apple) para cualquier rol de texto que falte en esta máquina |
scripts/new_project.py | Inicia un proyecto desde assets/template/ (un explicador ejecutable), o el ejemplo documental con --example |
scripts/make_beats.py | Escribe beats.md, la tabla que apruebas; verifica cronología, longitud de línea, dígitos en texto hablado |
scripts/tts_say.py | Voz de prueba gratuita (macOS say, espeak-ng, o cualquier comando TTS) para sincronizar la película antes de la voz final |
scripts/split_takes.py | Corta tomas de sección completa en un clip por línea y marca cortes sospechosos |
scripts/build_narration.py | Une las líneas en audio/narration.m4a y audio/timing.json, sobre los cuales se construye la película |
scripts/fetch_commons.py | Busca en Wikimedia Commons, descarga con licencia y crédito, rechaza archivos no libres, escribe credits.md |
scripts/make_map.py | Proyecta límites de dominio público (cualquier país o región) para el mapa |
scripts/prep_assets.py | Clasifica cada imagen en un aspecto uniforme (blanco y negro, sepia o color natural); genera las texturas del tablero |
scripts/engine.py | El motor de la película: cámara, foco, elementos, mapas, aspectos, acabado de película |
scripts/render.py | Fotogramas fijos, tiras de contacto, la lista de indicaciones y el renderizado MP4 en paralelo |
scripts/build_sfx.py | Sintetiza cada efecto de sonido a partir de la lista de indicaciones (sin muestras, nada que licenciar) |
scripts/mix_soundtrack.py | Voz, efectos y música opcional, con ducking y normalización de sonoridad |
scripts/burn_captions.py | Incrusta uno de cuatro estilos de subtítulos en la película terminada y escribe un SRT |
Necesita Python 3.9+, pip install skia-python numpy pillow (scipy opcional) y ffmpeg. Ejecuta scripts/check_setup.py primero; en Linux o Windows, también ejecuta scripts/get_fonts.py por proyecto. Todos los comandos toman --project <carpeta>.
Elige la película
| Tipo | Aspecto | Imágenes | Elementos típicos |
|---|---|---|---|
| Historia, crimen real, investigación | wall, slate | Fotos de archivo y documentos, clasificados bw | Impresiones, recortes rasgados, sellos, cuerda roja, rutas de mapa |
| Lanzamiento de producto, historia de marca o fundador | studio, charcoal | Tus fotos de producto y fotos de equipo, clasificados natural | Tarjetas, números grandes, contadores, flechas |
| Ciencia, ingeniería, cómo funciona | blueprint, paper | Diagramas, fotos de archivo o AI | Tarjetas, contadores, marcas de bolígrafo, mapas |
| Tecnología, espacio, avances | night | Capturas de pantalla, renders, imágenes AI | Tipografía grande, contadores, rutas, tarjetas |
Mezcla libremente: los aspectos son un tablero y un acabado, y cada elemento funciona en cada aspecto. references/story.md tiene una forma narrativa para cada tipo.
Las reglas
- Un héroe por línea. Cada línea de narración tiene exactamente una cosa sobre la que está la cámara. El foco atenúa todo lo demás.
- Los impactos caen en la palabra hablada. Un sello golpea en "cargado", no al inicio de la línea. Sincroniza todo con
doc.W(línea, "palabra"). - Muestra una frase de una sola manera. Escríbela en pantalla o muéstrala en un documento real, nunca ambas. El texto del cuerpo en los documentos son líneas grises, nunca palabras de relleno.
- El tiempo solo avanza después de la apertura. Una apertura en frío puede saltar hacia adelante. Después de una línea puente ("Cuatro años antes..."), el tiempo de la historia solo avanza.
- Texto que se pueda leer en un teléfono en un segundo. Mayúsculas condensadas grandes. Una etiqueta escrita en pantalla debe tener aproximadamente el 3% o más de la altura del fotograma.
- Menos es más. Las cuerdas se desvanecen después de su golpe, y los elementos antiguos se atenúan. El retroceso final debe verse compuesto, no desordenado.
- Nada inventado que parezca real. Las fotos y documentos reales reciben créditos. Un documento dibujado en código se etiqueta como recreación y solo cita palabras que realmente fueron escritas. Las imágenes AI son aceptables para ilustración, pero nunca como evidencia de un evento real o una persona real.
Flujo de trabajo
Detente para la aprobación del usuario en las cuatro puertas (marcadas Puerta).
- Historia. Investiga, luego escribe
script.json: tomas (secciones) de líneas, cada una context,spoken(números como palabras),heroytyped. Mantén notas de datos junto a la historia. 60 a 90 segundos son aproximadamente 150 a 230 palabras. Los detalles están enreferences/story.md. - Tabla de ritmos. Ejecuta
scripts/make_beats.pyy corrige todas las advertencias de lint. Puerta: el usuario apruebabeats.md, incluidos los datos. - Imágenes. Enumera cada imagen en
photos.json: su id, tipo y de dónde proviene.- Imágenes de archivo:
fetch_commons.py search,categoryyget. - Archivos propios del usuario: colócalos en
<project>/assets/photos/. - Fotogramas AI: genéralos en un solo estilo (la habilidad
motion-assetslos planifica y cotiza). references/archive.mdcubre otros archivos y las reglas de derechos.
- Imágenes de archivo:
- Voz de prueba. Ejecuta
tts_say.py, luegosplit_takes.py, luegobuild_narration.py. Escucha cada línea quesplit_takes.pymarca. Ahora los tiempos son reales. - Activos. Ejecuta
make_map.pysi la historia viaja, luegoprep_assets.py. - Escena. Escribe
scene.py: distribuye el tablero en grupos por sección, agrega elementos en tiemposdoc.L/doc.W, luego claves de cámara y foco (film.shot). Leereferences/film.md. Ambos proyectos incluidos muestran los patrones:assets/template/scene.py(explicador, aspecto studio) yassets/wright-flyer/scene.py(documental, todos los tipos de elementos). - Prueba de aspecto. Ejecuta
render.py --probeen un fotograma por línea a 1280x720 y míralos todos, luego--stripen cada movimiento grande de cámara. Puerta: muestra al usuario fotogramas de la apertura y el aspecto. - Borrador. Renderiza los primeros 30 segundos a 1280x720 con la voz de prueba. Puerta: el usuario lo ve.
- Voz final. Grábala con cualquier TTS o una persona (
references/voice.md). Ejecuta split, build y probes de nuevo; nada en la escena cambia. - Sonido. Ejecuta
render.py --cues, luegobuild_sfx.py, luegomix_soundtrack.py, agregando música si se desea. Leereferences/sound.md. - Finalización. Haz el renderizado completo, luego
burn_captions.pyy el SRT. Leereferences/performance.mdantes de renderizar a 1440p o 4K. Entregacredits.mdjunto con la película.
Autoevaluación, cada vez
Mira los fotogramas antes de afirmar que algo funciona. Estos son los errores que aparecieron, todos en un renderizado real:
- Tinta oscura sobre un tablero oscuro: invisible. Usa tipografía clara en aspectos oscuros, o
bar_h=0.92para un bloque de etiqueta completo detrás de tipografía oscura. - La cámara se movió pero el foco se quedó atrás, dejando un fotograma oscuro. Usa
film.shot()a menos que deban separarse. - Escala del mapa demasiado pequeña: toda una costa más pequeña que una foto. Elige
Kpara que cada lugar con impresiones tenga su propia habitación (references/film.md). - Etiquetas del mapa superpuestas. Coloca la etiqueta en el lado opuesto a su vecino.
- Un grupo que cruza el borde del mapa. Mantén los grupos sobre el mapa o claramente fuera de él.
- Resaltes a unos pocos píxeles de sus palabras. Usa
PaperDoc.phrase_spans, ydoc.on(print, fx, fy)con fracciones leídas de una cuadrícula superpuesta de la imagen.
Proyectos incluidos
assets/template/: "From Cherry to Cup", un explicador de 25 segundos en el aspecto studio, hecho de tarjetas, flechas y un contador, sin imágenes.new_project.py my-filmlo copia. Dale una voz de prueba y se renderiza.assets/wright-flyer/: "Twelve Seconds", un documental de 90 segundos sobre el primer vuelo y el rival de $50,000 que se estrelló dos veces. Usa siete fotos de dominio público, el mapa de EE. UU., dos documentos tipografiados y todos los tipos de elementos.
python3 scripts/new_project.py wright --example
python3 scripts/fetch_commons.py get --project wright
python3 scripts/make_map.py --project wright && python3 scripts/prep_assets.py --project wright
python3 scripts/tts_say.py --project wright && python3 scripts/split_takes.py --project wright && python3 scripts/build_narration.py --project wright
python3 scripts/render.py --project wright --size 1280x720 --out out/draft.mp4 --audio audio/narration.m4a
Habilidades relacionadas
De Open 3D Skills: motion-assets planifica y cotiza imágenes AI cuando una película necesita ilustración, y frame-capture graba páginas web en lugar de películas dibujadas en código.