Install
openclaw skills install @formula100k/reel-faceless-f100kConvierte un tema en un Reel 9:16 faceless (30-90 s) donde la usuaria GRABA la voz pero nunca sale en cámara. Escribe el guion con gancho, retención y cierre de venta, arma el teleprompter, recibe la nota de voz por Telegram, saca los tiempos (transcripción por API si hay llave, o estimados) y el Clip Director decide por gancho el visual de cada tramo (B-roll cinemático IA, card de dato, pixel-meme; mezcla obligatoria). Genera los clips con Higgsfield (con ✅ de créditos), renderiza las cards a PNG con Chromium y junta los clips en orden en un solo video mudo con ffmpeg concat. Entrega ese video + la voz + las cards + el plan para montar la voz y el texto en CapCut o Edits. Activar con 'hazme un reel faceless de X', 'video faceless sin mi cara', 'explainer faceless', 'convierte este tema en video sin grabarme en cámara', 'reel solo con mi voz'. NO para talking-head con su cara, VSL (broll-vsl-formula100k) ni carruseles.
openclaw skills install @formula100k/reel-faceless-f100kEsta versión corre en un agente OpenClaw (servidor + Telegram), no en Claude Code. Antes de seguir, lee la skill
f100k-puente: traduce herramientas y rutas. Lo específico de esta skill:
- Onboarding (brew, HyperFrames, mlx-whisper) NO aplica: sáltalo.
- La voz llega por Telegram como nota de voz o audio. Guárdala en la carpeta del reel como
voz.ogg/voz.mp3. Nunca generes ni clones la voz.- Tiempos (Paso 3): si hay
GROQ_API_KEYuOPENAI_API_KEY, transcribe con la API de Whisper pidiendo marcas de tiempo por palabra. Si no, reparte los tramos por el teleprompter a ≈2,5 palabras por segundo y marca el plan como «tiempos estimados».- Clip Director en este servidor: cada tramo lleva un clip
brollde Higgsfield que forma la base continua. Usa tramos de segundos enteros entre 4 y 15 (el mínimo de Seedance 2.0 es 4 s) para que ningún clip haya que recortarlo. Lascardse escriben como HTML de 1080×1920 y se renderizan a PNG con Chromium; lospixelsalen congenerate_image. Cards y pixel se entregan como PNG para poner encima en su tramo. La regla de mezcla se cuenta sumando cards y pixel.- Todos los clips con el MISMO modelo, resolución (720p por defecto),
aspect_ratio: "9:16"ygenerate_audio: false, para que el concat funcione sin re-codificar. Costo total estimado (tramos × precio) → ✅ antes del primer lote; lotes de máximo 8.- Paso 5 recortado: solo junta los clips en orden con
ffmpeg -f concat -safe 0 -i lista.txt -c copy base.mp4. Nada de escalar, overlays, colorkey ni mezclar audio. Entregabase.mp4(mudo) + la voz + los PNG +plan.jsoncon los tiempos, y explícale cómo poner la voz y los PNG encima en CapCut o Edits.- Sin créditos de Higgsfield: entrega guion, teleprompter,
plan.jsoncon el prompt de cada tramo y las cards en PNG. Dilo en la primera línea.- Si
base.mp4pesa más de 50 MB (límite de Telegram), avisa y manda los clips por link o a 720p.
Convierte un tema en un Reel vertical faceless: El usuario graba la voz pero nunca sale en cámara. El video se construye 100% con visuales generados por IA — B-roll cinemático, cards kinéticas y pixel-memes — que el Clip Director elige por gancho y sincroniza sobre su voz.
El principio (igual que el "Higgsfield Explainer" pero con ADN F100K): escala el contenido de El usuario sin depender de su cara. El diferencial no es generar (eso ya se domina) sino dirigir.
motion-reels-f100k (9:16) / editor-video-formula100kbroll-vsl-formula100kcarrusel-render-formula100khistorias-a-imagenes-nanobananaeditor-video-formula100k (modo
clips de apoyo, que usa este mismo Clip Director)# 1. Node.js v22+
node --version 2>/dev/null | grep -qE "v2[2-9]|v[3-9][0-9]" || {
echo "⚠ Node.js v22+ requerido. Instalando..."
brew install node@22 && brew link node@22 --force
}
# 2. HyperFrames CLI + ecosistema
command -v hyperframes &>/dev/null || npm install -g hyperframes
node -e "require('@hyperframes/core')" 2>/dev/null || npm install @hyperframes/core
node -e "require('@hyperframes/engine')" 2>/dev/null || npm install @hyperframes/engine
node -e "require('@hyperframes/producer')" 2>/dev/null || npm install @hyperframes/producer
hyperframes doctor # Chrome y FFmpeg deben aparecer con ✓
# 3. Sistema
command -v ffmpeg &>/dev/null || brew install ffmpeg
command -v uv &>/dev/null || brew install uv # para mlx-whisper
Verificar créditos Higgsfield antes de generar:
mcp__higgsfield__balance()
Si el balance es 0 o insuficiente → activar degradación (ver reference/clip-director.md
§6): todos los broll/pixel caen a card (HyperFrames, local, gratis). Avisar al usuario.
Definir $DEST:
SLUG="tema-en-kebab" # derivar del tema
DEST="entregables/$(date +%F)_${SLUG}"
mkdir -p "$DEST/assets"
Escribir el guion siguiendo el ADN de guionizacion-formula100k:
--duracion (30–90 s ≈ 75–225 palabras a ritmo de reel).Guardar:
$DEST/guion.md — guion completo con marcas de estructura.$DEST/teleprompter.txt — SOLO lo que el usuario dirá, limpio, para leer de corrido.Mostrar el guion y confirmar el gancho con el usuario antes de que grabe (el gancho carga el 80% de la retención).
Pedirle que grabe leyendo teleprompter.txt y guarde el audio como $DEST/voz.mp3 (o pasar
la ruta si ya lo grabó). Verificar:
ffprobe -v error -show_entries format=duration -of default=nokey=1:noprint_wrappers=1 "$DEST/voz.mp3"
Nunca generar la voz con IA ni clon. El usuario graba — esa es la regla de esta skill.
ffmpeg -i "$DEST/voz.mp3" -vn -acodec mp3 -ar 16000 -ac 1 -y /tmp/faceless_audio.mp3
uvx --from mlx-whisper mlx_whisper /tmp/faceless_audio.mp3 \
--model mlx-community/whisper-large-v3-mlx \
--language es --word-timestamps True \
--output-format json --output-dir /tmp
python3 - << 'EOF'
import json
data = json.load(open('/tmp/faceless_audio.json'))
words = [{'text': w['word'].strip(), 'start': w['start'], 'end': w['end']}
for seg in data['segments'] for w in seg.get('words', [])]
json.dump(words, open('DEST_PLACEHOLDER/transcript.json','w'), ensure_ascii=False, indent=2)
print(f"Transcripción: {len(words)} palabras")
EOF
(Sustituir DEST_PLACEHOLDER por $DEST.) Alternativa si uvx falla:
npx hyperframes transcribe /tmp/faceless_audio.mp3 --model small --language es.
full, formato 9:16)Seguir reference/clip-director.md al pie:
transcript.json en bloques de 3-6 s.visual_type (broll/card/pixel), respetando
la regla de mezcla (≥2 tipos distintos, ninguno >60%).t=00:00–00:04 broll "concepto: el error que todas cometen" [cinemático]
t=00:04–00:08 card "3 razones" (Chapter)
t=00:08–00:12 broll "yo pasé de X a Y" [avatar]
t=00:12–00:15 pixel remate cultura pop
...
broll → Higgsfield generate_video aspect_ratio="9:16", lotes de ≤8, poll
job_status(sync:true), declinar presets, anti-NSFW. Descargar: curl -L "<url>" -o "$DEST/assets/segNN.mp4".card → HyperFrames full-frame 1080×1920 fondo #FF00FF, hyperframes render --format mp4 -o "$DEST/assets/segNN.mp4".pixel → recursos-pixel-formula100k o generate_image pixel-art; si no hay, degradar a card.$DEST/plan.json con el contrato del Clip Director, llenando asset_path de cada
segmento (ruta relativa a $DEST/, ej. assets/seg0.mp4).Texto kinético de énfasis (opcional pero recomendado): generar overlays de palabras clave
con HyperFrames (chroma #FF00FF, reglas motion-reels-f100k) → renderizar a
$DEST/overlays.mp4. compose_faceless.sh los compone automáticamente si el archivo existe.
NO son subtítulos completos — solo palabras-fuerza.
bash "$(dirname "$0")/scripts/compose_faceless.sh" "$DEST"
Ensambla los assets por segmento a la línea de tiempo de la voz (escala/crop a 1080×1920,
loop+trim a la duración del segmento), superpone overlays.mp4 con colorkey=0xFF00FF si
existe, y mezcla voz.mp3 (+ musica.mp3 a volumen bajo si existe). Salida:
$DEST/REEL_FACELESS.mp4.
# manda el resultado por Telegram
Checklist:
visual_type respeta la regla (≥2 tipos, ninguno >60%).Mostrar ruta final + tabla del plan.
| Error | Acción |
|---|---|
mcp__higgsfield__balance = 0 | Degradar: broll/pixel → card (ver reference/clip-director.md §6) |
NSFW content detected | Simplificar prompt (quitar oscuridad/intimidad), reintentar; si reincide, segmento → card |
concurrent job limit | Nunca >8 jobs a la vez; esperar el lote |
| Higgsfield sugiere preset | Declinar con declined_preset_id |
uvx no encontrado | brew install uv y reintentar; o npx hyperframes transcribe |
| Whisper alucina | Re-correr con --temperature 0.2 o modelo medium |
hyperframes render falla | hyperframes lint + validate; verificar data-track-index únicos y window.__timelines registrado |
--format webm | Usar --format mp4 — VP9 sale sin alpha real |
| Overlay no se limpia (residuo magenta) | colorkey (RGB) no chromakey (YCbCr); 0xFF00FF:0.3:0.1 |
| Video final negro tras overlay | Fuente y overlay al mismo fps; el script ya fuerza fps=30,format=yuv420p |
| Audio de voz muy ruidoso / no transcribe | Pedir regrabar el tramo; no inventar timestamps |
$DEST/ (FORMULA100K/RECURSOS VIDEOS/YYYY-MM-DD_slug/)
├── guion.md ← guion completo con estructura
├── teleprompter.txt ← solo lo que el usuario dice
├── voz.mp3 ← voz grabada por el usuario (input)
├── musica.mp3 ← (opcional) música de fondo
├── transcript.json ← word-level normalizado
├── plan.json ← Clip Director: segmentos + visual_type + asset_path
├── overlays.mp4 ← (opcional) texto kinético, chroma #FF00FF
├── assets/
│ ├── seg0.mp4 ← B-roll / card / pixel por segmento
│ ├── seg1.mp4
│ └── ...
└── REEL_FACELESS.mp4 ← OUTPUT FINAL (1080×1920, voz del usuario)
| Aspecto | reel-faceless-f100k | motion-reels-f100k | broll-vsl-formula100k |
|---|---|---|---|
| Cara del usuario | ✗ Nunca (faceless) | ✅ Talking-head | ✅ 80% avatar |
| Video base | Ninguno (se genera todo) | Video grabado | Ninguno (solo clips) |
| Voz | Grabada por el usuario | Del video grabado | N/A (solo B-roll) |
| Salida | Reel 9:16 completo | Reel 9:16 + overlays | Catálogo de clips 16:9 |
| Motor de clips | Clip Director (compartido) | HyperFrames overlays | Higgsfield 80/20 |