¿Qué hace video-craft?
Convierte cualquier tema en un video narrado. Primero selecciona el motor de renderizado según el tipo de contenido, luego sigue la línea de producción común.
Predecesor de anything2explainer (solo para videos explicativos con Remotion). Esta división extrae los activos independientes del motor en core/, aísla lo relacionado con el renderizado en backends/ y añade routing/ para la selección del motor.
Cuándo usarlo
- El usuario proporciona un tema para crear un video explicativo, de derivación, tutorial o promocional; o un artículo para convertirlo en video.
- No es adecuado para: replicar un video existente, narración con persona real o videos principalmente grabados.
Cuatro puntos de confirmación (debe esperar la respuesta del usuario)
- Duración, idioma y recomendación de motor (preguntar junto con la fase 1 de investigación): presentar al usuario el resultado de la decisión de
routing/router.mdjunto con la tabla de duración. Si el usuario rechaza la recomendación, usar la suya. - Guion final aprobado (fase 2, antes de la locución): texto completo + división en capítulos + recuento de palabras/duración estimada, preguntar "¿Este guion está bien?". Los nombres de capítulos y las secciones HUD deben aparecer en líneas separadas. Para videos multicapítulo, listar las dos frases de transición de cada capítulo juntas. Una vez aprobado, los números de fotograma cambian; no modificar las palabras.
- Locución (antes de ejecutar
tts_build.py): por defecto, usar edge-tts Yunxi (chino) o kokoroam_liam(inglés). Si el usuario tiene preferencias, puede proporcionar su propio archivo wav enscript/audio.wavy rellenar manualmente la línea de tiempo. - Muestra de los primeros 30 segundos (fase 5a, antes de asignar los demás grupos): preguntar "¿El estilo, el tamaño de fuente, la velocidad de locución y el ritmo son adecuados?". Modificar aquí tiene el costo de solo un grupo; cambiarlo después de renderizar todo el video tiene el costo de todos los grupos.
Flujo de trabajo (8 fases)
Fase 0 Crear proyecto → Ejecutar new_project.sh del backend correspondiente según el resultado del ruteo
Fase 1 Investigación → core/research-brief.md (1 agente en paralelo) 【Punto de confirmación 1】
Fase 2 Guion + línea de tiempo → core/narration-guidance.md + tts_build.py 【Puntos de confirmación 2 y 3】
Fase 3 Storyboard → Escribir en el formato del backend, core/render_storyboard.py
Fase 4 Elementos gráficos → Completar según el backend (remotion: ui.tsx / manim: figures.py)
Fase 5a Prototipo → Hacer el primer grupo, preview.sh para los primeros 30 segundos 【Punto de confirmación 4】
Fase 5b Construcción paralela → Cada grupo con 1 agente, usando agent-build-rules.md del backend
Fase 6 Renderizado → render.sh del backend → mp4 + fin_frames/
Fase 7 QC y correcciones → core/motion_check.py + frame_metrics.py + qc-rules del backend
Fase 8 Entrega → Entrega.md (registrar el backend utilizado y la razón de la decisión)
Ruteo: primero seleccionar el backend
Leer obligatoriamente routing/router.md. Versión resumida:
| Tipo de contenido | Backend | Estado |
|---|---|---|
| Derivación continua de fórmulas / demostraciones / transformaciones simbólicas | manim | ✅ V1 |
| Explicación conceptual (qué es X / cómo funciona / por qué) | remotion | ✅ V1 |
| Tutorial de terminal real (instalación / configuración / ejecución de comandos) | terminal | ⏸ V2 |
| Promocional de producto / video corto para redes sociales / walkthrough de PR | hyperframes | ⏸ V3 |
La decisión no se basa en el nombre del tema, sino en si el guion opera continuamente sobre símbolos: "¿Qué hace la transformada de Fourier?" → remotion (explicación intuitiva); "Derivar la transformada de Fourier a partir de la serie de Fourier" → manim (derivación continua).
Cuando se selecciona un backend no implementado, se debe informar al usuario y explicar el plan de degradación, sin cambiar de backend en silencio.
Dependencias previas (lectura obligatoria en máquinas nuevas)
Todos los backends
# Los scripts Python de core/ necesitan estos paquetes. Usar Python 3.13 para crear el venv (3.14 carece de wheel, riesgo)
uv venv --python 3.13 ~/.venvs/video-craft
uv pip install --python ~/.venvs/video-craft/bin/python numpy pillow scipy edge-tts
⚠ Sin este venv,
tts_build.py/motion_check.py/frame_metrics.pyno funcionarán. Este es un error que ya ocurrió con anything2explainer: la dependencia no documentada del venv bloqueó todo el flujo en máquinas nuevas.
Backend remotion
brew install ffmpeg # Para extraer fotogramas
# Node 22+; el proyecto ejecuta npm install automáticamente con new_project.sh
Backend manim
brew install pkg-config cairo pango # Necesario para compilar pycairo; sin esto, manim no se instala
brew install --cask basictex # Necesario para el formato real de ecuaciones MathTex; sin esto, se usan aproximaciones ASCII
Sin basictex también funciona (automáticamente
MANIM_TEX=text), pero las ecuaciones se mostrarán comoa/b(aproximación ASCII). Los videos de derivación deben instalar basictex — la calidad del formato de ecuaciones es esencial para estos videos.
Estructura de directorios
video-craft/
├── SKILL.md ← Este archivo
├── routing/
│ └── router.md Árbol de decisión del backend + mecanismo de anulación + casos límite
├── core/ Independiente del motor, común a todos los backends
│ ├── research-brief.md Flujo de investigación y reglas de verificación de hechos
│ ├── narration-guidance.md 13 principios de redacción para locución
│ ├── narration-storyboard.md Formato de guion/storyboard y sistema de tokens
│ ├── tts_build.py Locución + timeline.json
│ ├── render_storyboard.py Sustitución de tokens de storyboard
│ ├── motion_check.py QC de ritmo (lectura de fotogramas, transversal a backends)
│ ├── frame_metrics.py QC de composición (lectura de fotogramas, transversal a backends)
│ ├── sheet.py Cuadrícula de miniaturas (lectura de fotogramas)
│ └── lessons.md Errores y causas raíz
└── backends/
├── remotion/ Videos explicativos conceptuales (anything2explainer original)
│ ├── template/ Proyecto React
│ ├── scripts/ render/preview/still/test_render/new_project/selfcheck
│ ├── reference/ style-guide/motion-vocabulary/composition-and-light/
│ │ agent-build-rules/agent-qc-rules/prompts/math-physics
│ └── examples/rag/ Muestras (referencia de calidad)
├── manim/ Videos de derivación
│ ├── template/ Proyecto Python (common/ + scenes/)
│ ├── scripts/
│ ├── reference/
│ └── README.md Conclusiones del entorno real (cairo/latex/pycairo)
├── hyperframes/ Reservado para V3
│ └── README.md
└── terminal/ Reservado para V2 (usuario confirmó que es obligatorio)
└── README.md
Referencia rápida de archivos clave
| Objetivo | Archivo |
|---|---|
| Decidir qué backend usar | routing/router.md |
| Asignar agente de investigación | core/research-brief.md |
| Escribir el guion | Primero leer core/narration-guidance.md, formato en core/narration-storyboard.md |
| Generar locución + línea de tiempo | core/tts_build.py |
| Generar tabla de storyboard | core/render_storyboard.py |
| QC de ritmo | core/motion_check.py |
| QC de composición | core/frame_metrics.py |
| Vista general del video completo | core/sheet.py |
| Crear proyecto | backends/<backend>/scripts/new_project.sh |
| Asignar agente de construcción | backends/<backend>/reference/agent-build-rules.md |
| Asignar agente de QC | backends/<backend>/reference/agent-qc-rules.md |
Formatos de storyboard específicos del backend
| Backend | Unidad de storyboard | Formato |
|---|---|---|
| remotion | Una toma (una frase de locución con una imagen) | Token {S12.from-8} en backends/remotion/reference/narration-storyboard.md |
| manim | Un paso de derivación | Formato DP en backends/manim/reference/storyboard.md |
Umbrales de QC ajustables por backend
Los umbrales predeterminados de core/motion_check.py están diseñados para videos conceptuales con Remotion; otros backends deben ajustarse:
# remotion (predeterminado)
python3 core/motion_check.py --frames fin_frames
# manim (derivación): aumentar el límite de quietud a 5s (dejar tiempo para ver después de una operación), desactivar el criterio de hold (sin concepto de "salida de escena")
python3 core/motion_check.py --frames fin_frames --shots DP01:1-170 --still-max 5.0 --no-hold
# terminal (V2): mayor quietud al esperar salida de comandos, estimado 8-10s
Principios estrictos (comunes a todos los backends)
- Originalidad: Todos los elementos visuales deben ser generados mediante código o grabaciones reales; no se permite usar fotogramas o fragmentos de videos existentes.
- Hechos con fuente: Cada número, término, año o nombre de persona en pantalla debe tener una URL de origen documentada en el informe de investigación.
- Contexto unificado: El guion y las imágenes deben usar un único ejemplo transversal.
- No modificar el guion aprobado: Los números de fotograma quedarán codificados; cambiar una palabra requerirá realinear todo el video.
- Informar sobre el backend: Tanto la decisión de ruteo como el plan de degradación deben ser conocidos por el usuario; no se tomarán decisiones en silencio.
Muestras y referencia de calidad
- Backend remotion:
backends/remotion/examples/rag/(4′35″, 44 frases, 44 tomas) — Antes de comenzar, verexamples/rag/frames/overview_*.jpgpara establecer la referencia. - Backend manim: V1 sin muestras, solo se verificó el ciclo mínimo. Las muestras completas de referencia estarán en V2.
- Contraejemplo:
backends/remotion/examples/contrast/
Proyectos migrados desde anything2explainer
Los proyectos en ~/Projects/ai-video/ como linear-function / transformer / a2e-fourier / py-course fueron creados con el skill original y aún usan la estructura antigua (template/scripts/). Siguen siendo utilizables — el skill original se mantiene como obsoleto, no lo elimine.
Los proyectos nuevos deben usar la estructura nueva de este skill.