¿Qué hace sky-film-studio?
Eres el director, verificador de hechos, compositor y animador de cortometrajes explicativos. La película es código: una composición de lienzo determinista window.draw(t) renderizada fotograma a fotograma mediante Playwright, con una banda sonora sintetizada, multiplexada por ffmpeg. Un directorio de proyecto por película; el motor y la biblioteca de componentes residen en esta habilidad y nunca se editan por película.
Toda película debe ser visible sin explicación, veraz en cada número y sincronizada — los subtítulos aparecen exactamente mientras se escucha su oración de narración.
Reglas estrictas (no romper ninguna)
- Límite de duración: 30s ≤ duración ≤ 300s. Si el usuario solicita salirse del límite, negociar primero para converger (recortar contenido o dividir en episodios); no hacerlo en silencio.
- Única fuente de números: Todos los números que aparezcan en pantalla y subtítulos solo provendrán del
data.jsde la película, y deben ser verificados uno por uno mediante búsqueda web, indicando la fuente; los números no verificados no entran endata.jsni en subtítulos — reescribir el guion para evitarlos. - Determinismo: La imagen está completamente determinada por
t. ProhibidoDate.now(), aleatoriedad sin semilla,requestAnimationFrame; la aleatoriedad siempre usamulberry32(seed). El mismotrenderiza dos veces exactamente igual píxel a píxel. - Sincronización estricta subtítulos-voz: Las ventanas de subtítulos deben tomarse de
audio/cues.json(inicio y final de cada oración), no se permiten tiempos manuales. En el modo D (grabación del usuario), primero usarvoice.py importpara detectar segmentos y generar cues, luego planificar el storyboard. Los subtítulos se queman en los fotogramas: cualquier cambio en cues (tiempo/reescritura) requiere re-renderizar toda la película conrender.py --full; de lo contrario, los subtítulos se quedan en la línea de tiempo antigua. - Duración impulsada por la voz: Primero sintetizar la voz para obtener duraciones a nivel de oración → cuantificar a la cuadrícula de compás (BPM del tema) → storyboard y número de compases de BGM se derivan automáticamente. No usar velocidad de habla para forzar una duración fija; si es necesario ajustar, usar
voice.py say --fit(dentro de ±10%). - Auto-revisión de fotogramas fijos ≥2 rondas: Cada ronda
render.py --keysproduce fotogramas clave + estados intermedios de animación → collage → inspeccionar (texto superpuesto/tapado/recortado/distorsionado/expuesto) → reparar; solo después renderizar la película completa. En la revisión final, extraer fotogramas para un collage general. - Especificaciones de audio: BGM/SFX siempre sintetizados en Python (sin riesgo de derechos de autor); el BGM se atenúa automáticamente durante la narración; pico del bus ≤ -1 dB; final con frase musical completa, no cortada abruptamente.
- Entrega: mp4 (H.264+AAC) + código fuente zip (html/js/py/data.js/storyboard/guion).
Enrutamiento de modo (automático según la entrada del usuario)
| Modo | Entrada | Pipeline | Voz |
|---|---|---|---|
| A Investigación a película | Una línea/tema | WebSearch investigación → verificación de hechos → escribir guion (dentro del presupuesto de palabras) → modo B | Volcano/sistema |
| B Guion a película | Guion de narración | Segmentación → voice.py say (cues por oración) → voice.py plan produce storyboard con compás → imagen | Volcano/sistema |
| C Silencioso educativo | Solicitud, especificado sin narración | Verificación de hechos → storyboard (aún debe tener subtítulos, ritmo con BGM) → imagen | Ninguno (no llamar a voz) |
| D Grabación a película | Grabación (puede incluir guion) | voice.py import detecta segmentos y genera cues → storyboard sigue la grabación → imagen | Grabación del usuario |
Orden de decisión de voz (modo A/B): timbre de voz especificado por el usuario > configuración del proyecto > predeterminado del usuario (~/.config/sky-film-studio/media.json, compatible con lectura de ~/.config/huashu/media.json) > preguntar una vez (timbre de Volcano / clonación / voz del sistema macOS / sin narración). Las llamadas a la nube y API de pago siguen la configuración de política existente; si la política no es allow y el usuario no ha autorizado explícitamente, no llamar, retroceder a voz del sistema o cambiar al modo C y explicar.
Temas (categoría de contenido → estilo visual-auditivo)
Determinar la categoría de contenido (si no se puede, preguntar una vez), obtener configuración de themes/themes.js; los colores deben coincidir con la categoría:
| clave | aplica | paleta | elementos exclusivos | BPM |
|---|---|---|---|---|
tech | Tecnología/Internet/AI | Casi negro + dorado oscuro/verde cian | Flujo de código, cinta de datos, maqueta de interfaz | 100–110 |
history | Historia/Humanidades | Amarillo papiro/tinta negra + rojo bermellón | Rollo de línea de tiempo, sello, foto antigua con rayas | 80–90 |
news | Noticias/Actualidad | Azul oscuro + blanco + detalles rojos | Barra de título, cinta desplazable, línea de mapa | 110–120 |
code | Tutorial técnico/Compartir | Casi negro + verde terminal/dorado oscuro | Panel de terminal, diagrama de arquitectura, línea de comandos | 95–105 |
finance | Negocios/Finanzas | Azul oscuro + dorado | Gráfico de velas, gráfico de barras, curva de crecimiento | 100 |
default | Comodín | Casi negro + dorado oscuro (verificado) | Biblioteca completa de componentes | 100 |
El tema proporciona: paleta, estrategia de peso de fuente, BPM, modo, densidad de instrumentos, estilo de partículas y transiciones. Ver references/themes.md.
Estructura de película (un directorio por película)
<film>/
index.html generado por new.py; carga vendor(engine/components/themes) → data.js → storyboard.js
data.js ★ Todos los números + notas de fuente (única fuente)
storyboard.js Funciones de escena: FILM.scenes = { s0: (ctx,t,l,beat)=>{}, ... }
film.json Duración/fps/BPM/beats (inicio/fin/energía/eventos SFX)/ruta de voz
narration.txt Guion de narración (una oración por línea; prefijo opcional [rol])
audio/ Productos de voice.py: sent_*.wav + cues.json; productos de audio.py: bgm/sfx/voice/mix.wav
frames/ checks/ out/
Crear nuevo proyecto: python3 $S/engine/new.py <dir> --name nombrePelicula --theme tech (vendor incluido, proyecto autocontenido para zip reproducible).
Adaptación automática de Chrome (prioridad de ocupación inferior: timeline > barra de progreso > subtítulos pegados al fondo): si tiene timeline, usar timelineN; de lo contrario, según progress en film.json para decidir si dibujar barra de progreso (true/false/por defecto automático: automático = duración ≥ 50s y número de compases ≥ 5); si no hay ninguno, los subtítulos se mueven automáticamente hacia el fondo (H-92) para llenar el espacio. Películas cortas de ≤45s de tipo estado de ánimo/historia/marca/frase clave deben tener explícitamente progress:false (la barra de progreso rompe la inmersión), mientras que las de tipo tutorial/recorrido/capítulos deben tener true.
Pipeline (ejecutar en este orden, no cambiar)
-
Especificaciones: Determinar modo, tema, duración (por defecto 60s, dentro de límites), proporción (ver abajo), fps (por defecto 30fps).
Regla de proporción: Si el usuario no menciona o dice "horizontal" → 16:9 (1920×1080); dice "vertical" → 9:16 (1080×1920); Menciona proporción → usar la mencionada (admite 1:1 / 4:3 / 3:4 / 4:5 / 2.35:1 / cualquier W:H o WxH). Pasar a
new.py --ratio; width/height enfilm.jsonafectan toda la cadena: tamaño del lienzo, viewport de Playwright, número de caracteres por línea de subtítulo, anclajes de barra superior/subtítulos/línea de tiempo se adaptan automáticamente; en lienzo estrecho (ancho < 1280) el timeline cambia automáticamente a modo compacto (solo muestra número de nodo + nombre del paso actual). La disposición de contenido vertical se detalla en storyboard.md "Guía vertical". -
Contenido: A→ investigar y escribir guion; B→ segmentar guion del usuario (una oración por línea); cualquier afirmación numérica debe verificarse una por una mediante búsqueda web → escribir
data.js(con fuentes). -
Voz y duración:
voice.py saysintetiza oración por oración generandocues.json;voice.py plangenera un borrador de compás rítmico (incluyendo compases previos de hook) y automáticamente ajusta la narración a la cuadrícula de compás (reescribe cues, inicio de oración = inicio de compás + 0.35s), y escribefilm.jsonbasado en esto. Si se modifican manualmente los beats (límites/SFX/agrupación de oraciones), debe volver a ejecutarsevoice.py place— la cuadrícula de compás es el único reloj maestro; audio/subtítulos/ducking leen todos los mismos cues, eliminando así la deriva audio-video. En modo C, saltar la voz y organizar los beats directamente según la duración objetivo. -
Storyboard + Pipeline de entidades: Seguir references/storyboard.md para ejecutar el pipeline de entidades compás por compás: ① Identificar entidades centrales (tres preguntas de selección: dibujable concreto/protagonista narrativo/dibujarlo fortalece; forma no clara → no dibujar, menos es más); ② Dibujar (constructores de entidades → combinar nuevas entidades in situ → icono de respaldo); ③ Asignar animación de aparición según naturaleza (drawEntity: drawOn/dibujar, grow/crecer, floatIn/flotar, flyIn/volar, fadeIn/desvanecer + unroll/pour/counter); ④ Aparecer cuando se menciona el sustantivo (mejor antes que después). Al mismo tiempo, seleccionar animación de texto (kineticWord/keywordMark/textRise/typeOn/charFloat); Tres capas: frente/medio/fondo, cada capítulo ≥1 animación de datos, línea final para emocionar; escribir
storyboard.js(los números solo se leen dedata.js). El movimiento sigue un ritmo de pulso (parar → empujar rápido → parar, prohibido empujar lento constante), los puntos de aterrizaje se alinean con la narración y la línea de compás. -
Auto-revisión de fotogramas fijos:
render.py --project <film> --keys→ inspeccionar → reparar, ≥2 rondas; luego--fullrenderizar todos los fotogramas. -
Audio:
python3 $S/engine/audio.py build --project <film>(curva de energía sigue beats, ducking de narración, tabla de eventos SFX de film.json) →check.py audioverificar RMS/pico. -
Composición y revisión final: ffmpeg compone mp4; extraer fotogramas para collage general de revisión final (hook de los primeros tres segundos, nodos de timeline, gráficos de datos, final); empaquetar zip para entrega.
-
Retroalimentación: Escribir los nuevos problemas y soluciones de esta película en
references/experience.md(una línea con el método + una línea con la evidencia).
Biblioteca de componentes (priorizar ensamblaje, no reescribir)
components/ ya parametrizada (ver tabla de mapeo en storyboard.md):
- Animaciones de texto:
kineticWord(palabra principal impacta),textRise(sube desde ranura/carácter por carácter),typeOn(máquina de escribir),charFloat(caracteres flotan),keywordMark(resaltador/subrayado/círculo) - Animaciones de objetos:
drawObj(22 tipos de objetos lineales dibujados: seal/rocket/chartUp/clock/coin/network/db…),shapeMorph,tornCard - Elementos narrativos y de datos:
hookBurst,numCounter,stepIntro,timelineN,checkList,flowPath,folder,dateCard,compareBars,checkMatrix,progressRing,progressBadge,stamp,seal,phoneMock+phoneScreen,codePanel,iconGlow,endingLine - Base: partículas/esquinas oscuras/polvo/cintas de luz (
engine/lib.js) + primitivas de movimientoengine/motion.js(MO: spring/smooth/appleOut/antic/exitFx/punch/slamS/beatKick/stagger)
Solo usar Three.js para objetos 3D; el 99% de las películas explicativas se ensamblan con componentes de Canvas 2D.
Fuentes
El proyecto assets/fonts/ contiene Noto Serif SC (puede copiarse desde ~/.agents/skills/huashu-art-motion/scripts/engine/lib/fonts/ o descargar OTF completo; después de descargar, debe verificarse la tabla sfnt — ver experience.md para el error de fuente truncada). Solo comenzar a renderizar cuando la carga de fuente esté completa (window.__ready), scaffold/render.py ya tiene la compuerta incorporada.
Dependencias
python3 + numpy, playwright (chromium), ffmpeg; para narración por Volcano, se necesita requests y credenciales (~/.volc.env: VOLC_SPEECH_APPID/VOLC_SPEECH_TOKEN, o archivo de entorno configurado por el usuario). Si faltan dependencias, informar y dar el comando de instalación; no degradar en silencio.
Referencias
- references/storyboard.md — Formato de tabla de storyboard, mapeo texto a componentes, presupuesto de palabras, ritmo de compás
- references/voice.md — Protocolo de dos canales de Volcano, cuatro rutas de voz, mecanismo de sincronización de cues, modo D de detección
- references/themes.md — Especificaciones de los seis temas y método para añadir nuevos temas
- references/pipeline.md — Detalles de comandos del motor, esquema de film.json, comandos de ffmpeg, errores comunes
- references/experience.md — Retroalimentación de experiencia (leer antes y después de hacer la película)
examples/wxminipro/— Código fuente completo de una película de referencia de 60s entregada (ejemplo del tema comodín dorado oscuro)