¿Qué hace Faceless Shorts?
Crea un vídeo corto vertical terminado a partir de un tema: guion, voz, subtítulos sincronizados por palabra, escenas animadas, sonido y música, todo renderizado a MP4. Todo es código: dibujos en canvas, captura con Chrome sin cabeza, ffmpeg, una voz Kokoro local, Whisper local para el sincronizado y numpy para el sonido. Ni imágenes ni vídeos de IA, ni claves API, ni créditos.
SKILL = la carpeta donde se encuentra este archivo. Los proyectos viven en ~/faceless-shorts/<nombre-del-corto>/.
| estilo | qué hace | duración · formato |
|---|---|---|
Deep Dive 3D deep-dive | el buque insignia, al estilo Zack D. Films: personas esculpidas en 3D en escenarios iluminados por el sol, cuerpos con rayos X brillantes, viajes de cámara a través de vasos sanguíneos, profundidad de campo reducida. "¿Qué pasa si…?" sobre el cuerpo y la ciencia | 30-45 s · 9:16 |
Night File 3D night-file | misterios sin resolver / crímenes reales: lugares 3D oscuros con una sola luz, personas sin rostro (el sujeto brilla en rojo), fechas de máquina de escribir, inserciones de expedientes | 30-45 s · 9:16 |
Inside Out inside-out | Explicador plano 2D "¿Qué pasa si…?": un héroe simple, cortes con rayos X, subtítulos en negrita de 1 a 3 palabras, cortes contundentes | 25-40 s · 9:16 |
Stick Story stick-story | Pasos de supervivencia "¿Qué harías si…?": personas de palo con ojos expresivos, habitaciones planas de día/noche, tarjetas de pasos doradas | 30-45 s · 9:16 |
Paper Atlas paper-atlas | Historia en papel recortado: mapas de pergamino, rutas carmesí, cintas de fecha doradas, figuras de época | 30-45 s · 9:16 |
Tall Tale 3D tall-tale | Historias divertidas reales: personas de dibujos animados 2D planas (cabezas grandes y redondas, contornos de tinta) actuando en un mundo 3D soleado de pueblo pequeño, cámara siempre en movimiento, subtítulos de una palabra | 40-60 s · 9:16 |
Qué estilo: cuerpo / salud / ciencia "qué pasa si" → Deep Dive 3D (o Inside Out para un aspecto 2D más ligero y rápido) · escalofriante, inexplicable, crimen real, "esto pasó en 1971" → Night File 3D · supervivencia, trucos de vida, "esto es lo que haces" → Stick Story · un evento histórico, "cómo sucedió X" → Paper Atlas · una historia real divertida o inteligente, una estafa, un vacío legal, "este tipo hizo X" → Tall Tale 3D. Si no es obvio, pregunta una vez.
Cada estilo = styles/<estilo>/style-sheet.png (el aspecto en una imagen, dibujada por el propio código del estilo) + STYLE.md (las reglas + el manual del motor) +
example/ (un proyecto completo que se renderiza tal cual). Lee el STYLE.md del estilo completo antes de planificar.
0. Primer uso en un ordenador
bash SKILL/scripts/setup.sh hasta que imprima All set (comprueba Node 22+, ffmpeg, Chrome; construye ~/.faceless-shorts/venv;
descarga la voz Kokoro ~340 MB y Whisper small.en ~0.5 GB). Instala cualquier cosa que falte de forma gratuita y oficial, y pregunta
antes de cualquier cosa que requiera una contraseña. Luego bash SKILL/scripts/selftest.sh debe imprimir SELFTEST PASSED: abre la
hoja de contacto y sus nombres y míralos.
1. Toma de datos (UN mensaje, valores predeterminados rellenados)
Pregunta solo lo que se desconoce, todo a la vez: tema (o "tú eliges 3 ideas"), un enlace a un corto cuyo formato les guste (opcional),
duración (por defecto ~30 s), voz (SKILL/scripts/py SKILL/scripts/voice.py --list; por defecto am_michael), modo de locución:
Voz AI (por defecto) · grabación propia (el usuario graba después de ver el guion; words.py --audio) ·
solo subtítulos (sin voz aún; estimate.py), música (fondo incorporado · ninguna · archivo libre de derechos propio), línea final / nombre de usuario.
"Adelante" = los valores predeterminados.
2. El plan (UNA pantalla, luego esperar)
Mostrar: título · la narración completa, una línea por corte, con sus fragmentos de subtítulos (QUE PASA *SI | TRAGAS *CHICLE?) · la lista de tomas,
una línea cada una (qué vemos, qué se mueve, en qué palabra aterriza) · nuevos componentes que agregarás al kit, si los hay · hechos y
sus fuentes. Pregunta "¿Construirlo?" y espera.
Reglas del guion. Escríbelo como una persona real le habla a un amigo: oraciones completas y fluidas con palabras de conexión
("Bueno,", "donde", "pero", "así que", "lo que significa"), no una lista de declaraciones cortas tipo subtítulo. ~90-110 palabras para 35 s.
Una línea es un CORTE, no una oración: divide cada oración en 1-3 líneas en pausas naturales (comas, "y", "donde"), de modo que
la imagen cambie cada 1.5-3.5 s mientras la voz sigue fluyendo (voice.py dice cada oración completa de una sola vez).
Forma: pregunta de gancho, luego escalada, un mito o sorpresa, un giro ("pero si tú…"), una última línea contundente que se repite.
Escribe los números como se dicen ("siete"). Léelo en voz alta en tu mente: si suena a subtítulos, reescríbelo.
Solo escritura original: toma un formato que te guste, nunca el guion o las tomas de otro creador. Cada hecho se verifica con una
fuente confiable (enuméralas en script.json "sources"). Temas de salud: precisos, sin sangre, sin información errónea aterradora.
3. Construcción
bash SKILL/scripts/new_video.sh <estilo> <nombre-del-corto>copia el ejemplo en~/faceless-shorts/<nombre-del-corto>/.- Escribe
script.json(líneas + subtítulos + pausas; consulta STYLE.md). - Tiempo:
SKILL/scripts/py SKILL/scripts/voice.py <proyecto>luegoSKILL/scripts/py SKILL/scripts/words.py <proyecto>(grabación propia:words.py <proyecto> --audio suyo.m4a; solo subtítulos:estimate.py <proyecto>). - Reescribe
src/shots.js: una toma por línea (o dos para líneas largas), cada una colocada concut(i)y sus momentos clave en palabras conWd('palabra', línea). Reutiliza el kit (src/core/kit.js); agrega nuevos componentes allí, con el aspecto del estilo. - En el proyecto:
node tools/capture.mjs check(debe decir CHECK OK) →node tools/capture.mjs cues→SKILL/scripts/py tools/mix.py .→ QA (sección 4) →node tools/capture.mjs video renders/<nombre>.mp4. Iterar en una sola toma:node tools/capture.mjs frames review/f "4.2,4.6"y mira.
4. QA: nunca mostrar un fotograma que no hayas mirado
node tools/capture.mjs sheet review/all.jpg 0.5 10 (un fotograma cada 0.5 s, con marca de tiempo) y lee toda la hoja, luego los fotogramas
clave a tamaño completo. Para cada fotograma pregunta:
- ¿Tiene sentido? Un modo visual por toma: si el cuerpo es de rayos X, TODO es de rayos X (sin mangas de camisa en un cuerpo de rayos X). Los objetos se mueven con lo que los sostiene (el chicle permanece en la mano hasta que la mano llega a la boca). Nada aparece antes de su causa.
- ¿Coincide con la narración en ese momento? La imagen cambia justo antes de su línea; las revelaciones caen en su palabra.
- ¿Hay alguna colisión? Las cosas en movimiento nunca cruzan etiquetas, píldoras, la zona de subtítulos (y 1250-1550) ni entre sí accidentalmente.
- Subtítulos: 1-3 palabras, exactamente una palabra amarilla, bien escrita, en la palabra que se dice, legible en un teléfono.
- Hoja de estilo: solo la paleta, formas planas, vistas de rayos X en cian, peligro en rojo.
- Sonido: voz clara sobre la música; efectos suaves (sin tics ni pitidos fuertes). Arregla, vuelve a renderizar la hoja, vuelve a comprobar. Dile al usuario qué detectaste y arreglaste.
5. Entrega
Abre el MP4 para el usuario. También proporciona: una copia para compartir si > 35 MB (ffmpeg -i in.mp4 -c:v libx264 -crf 21 -preset slow -c:a aac -b:a 160k -movflags +faststart share.mp4), el mejor fotograma de portada (capture.mjs frames), un título, un subtítulo y 5-8 hashtags.
Para el modo de grabación propia, también entregar el guion con el tiempo de cada línea para que lo lea. Ofrecer una ronda de cambios precisos
y volver a renderizar solo lo que cambió.
5b. Publicar en YouTube mediante Zapier (solo cuando el usuario pida subir)
Todas las llamadas son herramientas de Code Mode: ejecútalas dentro de execute como tools.zapier.* (no las llames como herramientas normales). Validadas una vez en una subida real; los valores a continuación son exactos.
- Conectar. Si
list_zapier_skillstiene una habilidad guardada para subir, úsala. De lo contrario, asegúrate de que la aplicación de YouTube esté habilitada:discover_zapier_actions({ app: "YouTube" })→enable_zapier_action({ selected_api: "YouTubeV4CLIAPI", app_display_name: "YouTube", action: "upload_video" }). Si aún no existe conexión,manage_zapier_connections({ selected_api: "YouTubeV4CLIAPI" })devuelve una URL de conexión para el usuario. - Alojar el archivo. Los parámetros
video/thumbnailde la acción necesitan una URL que los servidores de Zapier puedan obtener; una ruta local es silenciosamente incorrecta. Coloca el MP4 en un host temporal, en este orden (todos probados el 3 de noviembre de 2026; en Windows usacurl.exe):- a. litterbox (caducidad de 1 h a 72 h, hasta 1 GB):
curl -F "reqtype=fileupload" -F "time=1h" -F "fileToUpload=@renders/<nombre>.mp4" https://litterbox.catbox.moe/resources/internals/api.php→ devuelve la URL directa como texto plano. - b. uguu.se (caducidad de aproximadamente 3 h, buena para cortos de menos de 35 MB):
curl -F "files[]=@renders/<nombre>.mp4" https://uguu.se/upload→ devuelve JSON; usafiles[0].url(el enlaced.uguu.se/...). - c. catbox (permanente, sin caducidad): misma llamada que (a) sin
-F "time=1h". Público para siempre, así que solo con el visto bueno del usuario. - Salta estos (verificados rotos el 3 de noviembre de 2026, no pierdas reintentos): 0x0.st (subidas deshabilitadas), tmpfiles.org (el enlace es una página de visor, no el archivo sin procesar), gofile.io (la descarga sin procesar necesita un token de cuenta), file.io (la API de curl redirige a su aplicación web), bashupload.com, temp.sh (muertos).
- Siempre verifica la URL antes de usarla:
curl -sSI <url>debe devolver 200/206 con un tipo de contenido de vídeo. Nunca confíes en el JSON de un host sin comprobarlo. - Informa al usuario que esto coloca su vídeo en un host temporal público que caduca por sí solo.
- a. litterbox (caducidad de 1 h a 72 h, hasta 1 GB):
- Confirmar primero. Esto escribe en el canal real del usuario, así que confirma antes de ejecutar: título, visibilidad (privado / no listado / público) y categoría.
Resuelve
category_idconinspect_zapier_actions({ tool_name: "youtube_upload_video", enum_property: "category_id" })si es necesario. Comedia = 23 (sugerencia predeterminada para Tall Tale y Deep Dive), Educación = 27, Mascotas y Animales = 15. - Subir.
execute_zapier_write_action({ selected_api: "YouTubeV4CLIAPI", action: "upload_video", tool_name: "youtube_upload_video", params: { video: "<URL temporal>", title, description (terminarlo con #shorts), tags: [5-8 hashtags sin #], category_id: "23", privacy_status, made_for_kids: false, embeddable: true, notify_subscribers: true, default_language: "en", license: "youtube" } }) - Informar. El resultado contiene
id; el enlace eshttps://www.youtube.com/watch?v=<id>. Un vídeo vertical de 60 s o menos se convierte automáticamente en Short (sin campo adicional). Abre el archivo local para el usuario (tools.browser.preview({ path: "renders/<nombre>.mp4" })) y proporciona la URL de YouTube en texto. El navegador integrado a menudo falla al cargar youtube.com con ERR_ABORTED; eso no es una subida fallida. - Miniaturas. Las subidas no listadas no toman una miniatura personalizada a través de esta acción; ofrece el fotograma de portada guardado si el usuario luego hace público el vídeo.
Agregar un nuevo estilo (cuando el usuario lo pida)
Crea styles/<nuevo-estilo>/ con style-sheet.png, STYLE.md (mismas secciones que Inside Out: reglas de apariencia, paleta, formato,
mapa del motor/kit, componentes, anatomía de la toma, tipos de indicaciones, trampas de QA) y un example/ completo. Copia de Inside Out los archivos
tools/, index.html, src/main.js, src/core/{lib,timing,captions}.js, luego construye el kit y las tomas del nuevo aspecto. Los
scripts compartidos (voice, words, estimate, new_video, selftest) funcionan sin cambios. Agrega una fila a la tabla anterior y ejecuta
selftest.sh hasta que todos los estilos pasen.
Estilos 3D (Deep Dive, Night File, Tall Tale)
Renderizan 3D real con three.js en Chrome sin cabeza. Con una tarjeta gráfica es rápido y de máxima calidad. Sin una
(portátil sin aceleración de GPU, sandbox en la nube) renderiza con SOFTWARE_GL=1 QS='&res=0.6&aa=0&shadow=1024' FPS=24 delante de node tools/capture.mjs ... (≈2 s por fotograma; informa al usuario del tiempo de renderizado de antemano, ejecútalo en
segundo plano y haz QA con sheet review/all.jpg 1 10 primero). Sus archivos STYLE.md enumeran la API 3D.
Nunca
Generes imágenes o vídeos con IA; gastes dinero o créditos del usuario; subas a YouTube o cualquier host sin que el usuario lo pida y confirme; copies el guion, las tomas o los fotogramas de otro creador; sobrescribas un proyecto del usuario sin preguntar; entregues un fotograma que no hayas mirado.