Communitygithub.com

sky-film-studio

Cine explicativo por especificación como código: una línea, un guion o una grabación se convierte en un video cinematográfico de conocimiento de 30s a 5 min con datos verificados, BGM sintetizado y narración opcional con subtítulos sincronizados. 一句话/文稿/录音生成知识解说短片。

¿Qué es sky-film-studio?

Sky Film Studio es una habilidad de agente de IA para crear cortometrajes explicativos de forma determinista y verificable. Convierte una línea de texto, un guion o una grabación en un video de conocimiento de 30 segundos a 5 minutos, con datos verificados, banda sonora sintetizada y narración opcional (Volcano TTS o grabación del usuario) con subtítulos sincronizados fotograma a fotograma. Está diseñado para plataformas como Claude Code, Cursor o Codex, y se basa en un pipeline de 8 pasos: investigación, verificación de hechos, síntesis de voz, storyboard, renderizado (con Canvas 2D o Three.js), composición de audio y empaquetado final. La regla más importante es que cada número debe provenir de un archivo `data.js` y ser verificado mediante búsqueda web; no se permiten números no verificados. El sistema soporta seis temas visuales (tech, history, news, code, finance y default) que determinan la paleta de colores, el BPM y los estilos de animación. La sincronía narración-subtítulos es absoluta: los subtítulos se queman en los fotogramas y cualquier cambio requiere re-renderizar la película completa.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/skyzizhu/sky-film-studio/tree/main

Preguntar en tu IA favorita

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

Documentación

¿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)

  1. 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.
  2. Única fuente de números: Todos los números que aparezcan en pantalla y subtítulos solo provendrán del data.js de la película, y deben ser verificados uno por uno mediante búsqueda web, indicando la fuente; los números no verificados no entran en data.js ni en subtítulos — reescribir el guion para evitarlos.
  3. Determinismo: La imagen está completamente determinada por t. Prohibido Date.now(), aleatoriedad sin semilla, requestAnimationFrame; la aleatoriedad siempre usa mulberry32(seed). El mismo t renderiza dos veces exactamente igual píxel a píxel.
  4. 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 usar voice.py import para 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 con render.py --full; de lo contrario, los subtítulos se quedan en la línea de tiempo antigua.
  5. 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%).
  6. Auto-revisión de fotogramas fijos ≥2 rondas: Cada ronda render.py --keys produce 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.
  7. 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.
  8. 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)

ModoEntradaPipelineVoz
A Investigación a películaUna línea/temaWebSearch investigación → verificación de hechos → escribir guion (dentro del presupuesto de palabras) → modo BVolcano/sistema
B Guion a películaGuion de narraciónSegmentación → voice.py say (cues por oración) → voice.py plan produce storyboard con compás → imagenVolcano/sistema
C Silencioso educativoSolicitud, especificado sin narraciónVerificación de hechos → storyboard (aún debe tener subtítulos, ritmo con BGM) → imagenNinguno (no llamar a voz)
D Grabación a películaGrabación (puede incluir guion)voice.py import detecta segmentos y genera cues → storyboard sigue la grabación → imagenGrabació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:

claveaplicapaletaelementos exclusivosBPM
techTecnología/Internet/AICasi negro + dorado oscuro/verde cianFlujo de código, cinta de datos, maqueta de interfaz100–110
historyHistoria/HumanidadesAmarillo papiro/tinta negra + rojo bermellónRollo de línea de tiempo, sello, foto antigua con rayas80–90
newsNoticias/ActualidadAzul oscuro + blanco + detalles rojosBarra de título, cinta desplazable, línea de mapa110–120
codeTutorial técnico/CompartirCasi negro + verde terminal/dorado oscuroPanel de terminal, diagrama de arquitectura, línea de comandos95–105
financeNegocios/FinanzasAzul oscuro + doradoGráfico de velas, gráfico de barras, curva de crecimiento100
defaultComodínCasi negro + dorado oscuro (verificado)Biblioteca completa de componentes100

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)

  1. 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 en film.json afectan 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".

  2. 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).

  3. Voz y duración: voice.py say sintetiza oración por oración generando cues.json; voice.py plan genera 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 escribe film.json basado en esto. Si se modifican manualmente los beats (límites/SFX/agrupación de oraciones), debe volver a ejecutarse voice.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.

  4. 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 de data.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.

  5. Auto-revisión de fotogramas fijos: render.py --project <film> --keys → inspeccionar → reparar, ≥2 rondas; luego --full renderizar todos los fotogramas.

  6. 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 audio verificar RMS/pico.

  7. 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.

  8. 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 movimiento engine/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)

Skills relacionados