Communitygithub.com

nestedbit/faceless-shorts

Crea videos cortos estilo mascota explicadora / YouTube Shorts / TikToks completamente con código en tu computadora: el creador como una mascota plana tipo caricatura dibujada en código a partir de una foto (con rigging y sincronía de labios) que presenta pasos numerados en tarjetas, con fichas numéricas que chocan contra una insignia, una lista de verificación en vivo, leyendas palabra por palabra y sonido en cada golpe. Voz local gratuita con IA y sincronización de palabras, sin costo adicional más allá del plan Claude.

¿Qué es faceless-shorts?

Faceless Shorts es una habilidad para Claude Code que permite crear videos verticales cortos completamente con código en tu computadora, sin necesidad de APIs externas, créditos o servicios en la nube. Todo se genera localmente: el guion, la voz (con Kokoro, un modelo de TTS gratuito), la sincronización de palabras (con Whisper), las animaciones dibujadas en canvas, la captura de pantalla con Chrome headless, la edición con ffmpeg y los efectos de sonido con numpy. El resultado es un video MP4 listo para publicar en YouTube Shorts, TikTok o Instagram Reels. El estilo principal es "mascota explicadora" (mascot-explainer), donde el creador aparece como una caricatura plana dibujada en código a partir de una foto suya, con rigging y sincronía de labios. El video presenta pasos numerados ("N pasos para...") con tarjetas, fichas numéricas que chocan contra una insignia, una lista de verificación en vivo, leyendas palabra por palabra y efectos de sonido. Cada video dura entre 30 y 45 segundos, en formato 9:16. La habilidad también admite la grabación de voz propia o solo leyendas. Actualmente está diseñada para sistemas macOS, pero puede adaptarse a Linux o Windows con ajustes. La habilidad incluye un flujo completo: desde la ingesta de un tema (o sugerencia de 3 ideas), la creación de un guion original con verificación de fuentes, la definición de la mascota, el renderizado de tomas, la sincronización de voz, la adición de música y efectos, hasta la revisión de calidad (QA) con una hoja de contactos que muestra fotogramas cada 0.5 segundos. Además, permite la publicación directa en YouTube a través de Zapier (solo cuando el usuario lo solicita explícitamente). El agente debe seguir instrucciones precisas para evitar generar imágenes o videos con IA externa, y nunca debe gastar dinero del usuario ni subir contenido sin confirmación.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/nestedbit/faceless-shorts/tree/HEAD

Preguntar en tu IA favorita

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

Documentación

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

  1. bash SKILL/scripts/new_video.sh mascot-explainer <nombre-del-video> copia el ejemplo en ~/faceless-shorts/<nombre-del-video>/.
  2. 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.
  3. Sincronización: SKILL/scripts/py SKILL/scripts/voice.py <proy> luego SKILL/scripts/py SKILL/scripts/words.py <proy> (grabación propia: words.py <proy> --audio su.m4a; solo leyendas: estimate.py <proy>).
  4. Reescribe src/shots.js: una toma por línea (o dos para líneas largas), cada una colocada con cut(i) y sus momentos clave en palabras con Wd('palabra', línea). Reutiliza el kit (src/core/kit.js); agrega nuevos componentes allí, con la apariencia del estilo.
  5. 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.

  1. Conectar. Si list_zapier_skills tiene 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.
  2. Alojar el archivo. Los parámetros video / thumbnail de 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 usa curl.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; usa files[0].url (el enlace d.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.
  3. 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_id con inspect_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.
  4. 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" } })
  5. Informar. El resultado contiene id; el enlace es https://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.
  6. 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.

Skills relacionados