trend-explainer-video: Producción de videos explicativos de rankings hablados
Con C:/Users/<tu usuario>/.workbuddy/skills/video-talkcraft (skill TalkCraft) como motor de renderizado, este skill proporciona el esqueleto del proyecto, scripts completos, diseño visual fijo y solución de problemas en producción para temas de rankings. La teoría de video/validaciones generales se encuentran en el cuerpo de TalkCraft, no se repiten aquí.
Pasos de la línea de producción (comandos y errores en references/pipeline.md)
- Capturar instantánea: Captura única de la página de ranking (curl con user-agent), guardar en
data/snapshot.md/.jsoncomo única fuente de verdad — ranking/estrellas/descripción/idioma solo deben provenir de esta captura, prohibido inventar. - Guion hablado
script.json: Estructura fija de 35 frases = 1 apertura + 10 proyectos × (frase de puesto + frase detallada/total de estrellas + frase de cómo usar + frase de total de estrellas) + 3 párrafos finales (cierre/frase contundente/CTA). Reglas estrictas: números todos en caracteres chinos; cada proyecto debe comenzar con 'Primer puesto.../Segundo puesto...'; cada proyecto añade una frase de 'cómo usar' (comenzando con verbo, explicando dónde usarlo/cómo usarlo/qué problema resuelve). La apertura debe comenzar directamente con: 'Hoy, en la lista semanal de tendencias de GitHub, les explico los diez primeros de una sola vez'. - Doblaje:
synth_voice.py(VOICE/RATE al inicio, edge-tts necesita HTTP_PROXY) →assemble_voice.py(full.wav + timestamps.json) →cp audio/full.wav remotion/public/narration.wav. - Reconstrucción de la línea de tiempo:
make_timing.py→gen_beats.py(incluye generación de anchors.json) →gen_cues.py. Las tres tablas de anclaje deben estar sincronizadas: REPO_ANCHORS de gen_beats, REPO_CFG de gen_cues, REPO_CFG de all.tsx, además de sceneFor en scenes/index.ts (los números de escena de chart/quote/cta se desplazan después de insertar frases). Cualquier cambio en los parámetros de doblaje = reconstrucción completa de la cadena, nunca solo reemplazar la pista de audio. - Implementación del proyecto: Copiar esqueleto desde
assets/remotion-template/; modificarsrc/data.ts(datos de instantánea), las cinco tablasREPO_CFG/USES/STEPS/ICONS/DETAILSensrc/scenes/all.tsx+ tablaRANK_LISTde escenas de ranking. El resto del código de escenas se reutiliza sin cambios. Ejecutarnpx tsc --noEmitpara verificar. - Renderizado:
node <video-talkcraft>/scripts/render_shots.mjs --all --concat out/assembled.mp4 --audio out/full-mix.wav --mux out/v?.mp4(full-mix se rerenderiza automáticamente según la huella del timing). - Validaciones automáticas (entregar solo si todo está verde): beat_lint → motion_check (estático+parpadeo) → sfx_check solo+mix → workbench_contract_lint. Umbrales y recetas para fallos en pipeline.md.
- Entrega: loudnorm dos veces (medición→normalización lineal) → delivery.mp4 → repetir sfx_check --mix → present_files.
- Portada:
gen_cover.pygenera portada vertical genérica de 1080×1920 (sin proyecto específico, reutilizable a largo plazo), produce cover_vertical.png/.jpg.
Diferenciación visual de esta línea de producción (versión fija v16, ver references/style-guide.md)
- Página independiente de puesto
RankPage: La escena donde se dice la palabra del puesto se renderiza en pantalla completa como una página independiente 'Puesto N' (letras grandes doradas de 240px + RANK #N + nombre del repositorio + número de estrellas + barra de progreso de 10 segmentos), no comparte pantalla con el contenido del proyecto. - Tres componentes visuales de contenido:
IllBgfondo de ilustración a pantalla completa (blur30 + oscurecimiento) +OgiCardtarjeta de ilustración dinámica (EFECTO PREVIEW + Ken Burns + puntos de luz + barrido de luz) +DemoPaneldemostración de terminal/rejilla, con 3 USES (emoji) +DetailBlockcarrusel de detalles. - Escena de tres pasos 'cómo usar' con ilustraciones
HowScene: Cada paso tiene una tarjeta de ilustraciónStepIcon(fondo degradado + emoji grande + insignia de paso), impulsada por las dos tablasSTEPS/ICONS. - Efectos ambientales de pantalla completa: Tres franjas de luz que barren con fases desfasadas, para curar los segmentos estáticos de motion_check (escenas de tarjetas pequeñas/textos, obligatorio añadirlas).
- Visual oscuro: Paleta de colores en style-guide.md; estrellas dorado #FFC94D, incremento semanal verde #63E6A4.
Errores frecuentes (ver references/pipeline.md)
- ImageGen puede sufrir limitación de tasa 429 → usar tarjetas de iconos emoji (StepIcon) para ilustraciones, portada generada programáticamente con PIL (gen_cover.py), costo cero, estable y relevante; se puede cambiar a imágenes AI cuando el servicio se recupere.
- Segmentos estáticos de motion_check (freezedetect noise=0.003): escenas de tarjetas pequeñas/texto estático/fondo borroso, la animación sin lenta no salva → Ambient tres franjas de luz con fase desfasada (≥3 franjas, 2 tienen período de vacío).
- Renderizado del lado del servidor
<Video>siempre falla → usarOffthreadVideo+muted. - FPS del素材 ≠ FPS del video final → motion_check detecta 'cuadros repetidos'; usar
minterpolate=mi_mode=blendpara interpolación de flujo óptico. - Windows: todos los enlaces simbólicos son rechazados → copiar directorio; ffmpeg 7+ no tiene
-vsync→ usar-fps_mode passthrough. - edge-tts necesita proxy:
HTTP_PROXY/HTTPS_PROXY=http://<tu proxy>. - Para modificar all.tsx usar reescritura atómica con python (el EBUSY de Windows puede hacer que la edición parezca exitosa pero no lo sea); bash heredoc que pasa python con backticks se truncará → usar Write para escribir .py y luego ejecutar.
Referencia rápida de entorno
- bash PATH debe completarse cada sesión:
PortableGit usr/bin+ffmpeg-bin; python usar venv:C:/Users/<tu usuario>/.workbuddy/binaries/python/envs/default/Scripts/python.exe; node ejecutar directamente con versión administrada; tsc ejecutarnode_modules/typescript/lib/tsc.js(bin/tsc está secuestrado por fnm shim).