Faceless Shorts
Creas un video vertical terminado a partir de un tema: guion, voz, leyendas sincronizadas con las palabras, tomas animadas, sonido y música, renderizado a MP4. Todo es código: dibujo en canvas, captura con Chrome headless, ffmpeg, una voz local Kokoro, sincronización de palabras con Whisper local, sonido con numpy. Sin imágenes o videos de IA, sin claves de API, sin créditos adicionales.
SKILL = la carpeta donde se encuentra este archivo. Los proyectos viven en ~/faceless-shorts/<nombre-del-video>/.
Un estilo: Mascota Explicadora (mascot-explainer). TÚ como una mascota plana tipo caricatura (dibujada en código a partir de una foto, con rigging, sincronía de labios) presentando "N pasos rápidos": una tarjeta a la vez, fichas numéricas que chocan contra una insignia, una lista de verificación en vivo, leyendas palabra por palabra en el título, sacudida de cámara + un sonido en cada golpe. 30-45 s · 9:16. Ideal para tutoriales, consejos, "N pasos para…", explicaciones técnicas / financieras / de productividad donde el creador es la marca.
El estilo = styles/mascot-explainer/style-sheet.png (la apariencia en una imagen, dibujada por su propio código) + STYLE.md (las reglas + el manual del motor) + example/ (un proyecto completo que se renderiza tal cual). Lee STYLE.md completo antes de planificar.
0. Primer uso en una computadora
bash SKILL/scripts/setup.sh hasta que imprima Todo listo (verifica Node 22+, ffmpeg, Chrome; construye ~/.faceless-shorts/venv; descarga la voz Kokoro ~340 MB y Whisper small.en ~0.5 GB). Instala cualquier cosa faltante de la forma oficial y gratuita, y pregunta antes de cualquier cosa que requiera contraseña. Luego bash SKILL/scripts/selftest.sh debe imprimir AUTOEVALUACIÓN SUPERADA: abre la hoja de contactos, recorta sus nombres y míralos.
1. Ingreso (UN solo mensaje, valores predeterminados completados)
Pregunta solo lo que se desconoce, todo de una vez: tema (o "tú eliges 3 ideas"), un enlace a un video 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 voz en off: Voz IA (por defecto) · Grabación propia (graban después de ver el guion; words.py --audio) · Solo leyendas (sin voz aún; estimate.py), música (fondo incluido · ninguna · su propio archivo libre de regalías), línea de cierre / nombre de usuario, y una foto clara de frente de ellos (opcional) y una vestimenta, o el nombre de una mascota guardada en ~/faceless-shorts/_mascots/. "Adelante" = los valores predeterminados.
2. El plan (UNA pantalla, luego esperar)
Muestra: título · la narración completa, una línea por corte, con sus fragmentos de leyenda (1. Mira la | *dirección real del remitente) · 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 · datos y sus fuentes. Pregunta "¿Construirlo?" y espera.
Reglas del guion. Escríbelo como una persona realmente le habla a un amigo: oraciones completas y fluidas con palabras de conexión ("Bueno,", "donde", "pero", "entonces", "lo que significa"), no una lista de declaraciones cortas tipo leyenda. ~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"), para que la imagen cambie cada 1.5-3.5 s mientras la voz sigue fluyendo (voice.py pronuncia cada oración completa de una sola vez). Forma: un gancho con un número real y con fuente, una promesa de una línea, 3-6 pasos que comiencen con "Uno, …", una acción de cierre clara. Escribe los números como se dicen ("siete"). Léelo en voz alta en tu cabeza: si suena a leyendas, reescríbelo. Escritura original solamente: toma un formato que te guste, nunca el guion o las tomas de otro creador. Cada dato se verifica con una fuente confiable (enuméralas en script.json en "sources").
3. Construcción
bash SKILL/scripts/new_video.sh mascot-explainer <nombre-del-video>copia el ejemplo en~/faceless-shorts/<nombre-del-video>/.- Escribe
script.json(líneas + leyendas + pausas; consulta STYLE.md). Crea la mascota primero (mascot.json, STYLE.md §2), renderiza su hoja de poses y obtén la aprobación del usuario antes de escribir cualquier toma. - Sincronización:
SKILL/scripts/py SKILL/scripts/voice.py <proy>luegoSKILL/scripts/py SKILL/scripts/words.py <proy>(grabación propia:words.py <proy> --audio su.m4a; solo leyendas:estimate.py <proy>). - 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 la apariencia del estilo. - En el proyecto:
node tools/capture.mjs check(debe decir VERIFICACIÓN OK) →node tools/capture.mjs cues→SKILL/scripts/py tools/mix.py .→ QA (sección 4) →node tools/capture.mjs video renders/<nombre>.mp4. Para iterar sobre una toma:node tools/capture.mjs frames review/f "4.2,4.6"y mira.
4. QA: nunca muestres un fotograma que no hayas visto
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 pregúntate:
- ¿Tiene sentido? Una tarjeta a la vez; la pose de la mascota coincide con la línea; los accesorios se mueven con lo que los sostiene. 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 aterrizan en su palabra.
- ¿Hay alguna colisión? Brazos, sellos y estallidos nunca cruzan el título, la tarjeta, la insignia, la lista de verificación ni entre sí accidentalmente.
- Leyendas: 1-4 palabras, como máximo una palabra de acento violeta, escritas correctamente, nunca mostradas antes de que se diga la palabra.
- Hoja de estilo: solo la paleta, formas planas, sombras de tinta duras, rojo solo para peligro.
- Sonido: voz clara sobre la música; efectos suaves (sin ticks o pitidos ásperos). Corrige, vuelve a renderizar la hoja, vuelve a verificar. Informa al usuario lo que detectaste y corregiste.
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, una leyenda y 5-8 hashtags. Para el modo de grabación propia, también entrega el guion con la sincronización de cada línea para que lean con él. Ofrece una ronda de cambios precisos y vuelve a renderizar solo lo que cambió.
5b. Publicar en YouTube a través de Zapier (solo cuando el usuario lo solicite para subir)
Todas las llamadas son herramientas de Modo Código: 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 una 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 falla silenciosamente. Coloca el MP4 en un alojamiento temporal, en este orden (todos probados el 3 de noviembre de 2026; en Windows usacurl.exe):- a. litterbox (1 h a 72 h de vencimiento, 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 (aproximadamente 3 h de vencimiento, bueno para videos 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 vencimiento): misma llamada que (a) sin
-F "time=1h". Público para siempre, así que solo con la aprobación del usuario. - Omite estos (verificados como rotos el 3 de noviembre de 2026, no desperdicies 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 video. Nunca confíes en el JSON de un anfitrión sin verificarlo. - Informa al usuario que esto coloca su video en un anfitrión temporal público que vence por sí solo.
- a. litterbox (1 h a 72 h de vencimiento, 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. Educación = 27 (predeterminado para videos tutoriales), Comedia = 23, Cómo hacer y estilo = 26. - Subir.
execute_zapier_write_action({ selected_api: "YouTubeV4CLIAPI", action: "upload_video", tool_name: "youtube_upload_video", params: { video: "<URL temporal>", title, description (termina con #shorts), tags: [5-8 hashtags sin #], category_id: "27", 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 video vertical de 60 s o menos se convierte automáticamente en un 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 de la aplicación a menudo falla al cargar youtube.com con ERR_ABORTED; eso no es una subida fallida. - Miniaturas. Las subidas no listadas no aceptan una miniatura personalizada a través de esta acción; ofrece el fotograma de portada guardado si el usuario luego hace público el video.
Nunca
Generes imágenes o videos con IA; gastes dinero o créditos del usuario; subas a YouTube o a cualquier anfitrión sin que el usuario lo solicite 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 visto.