Emoji Party (vídeo de letras animadas en mundo emoji sincronizado con el ritmo, Blender Grease Pencil)
El usuario proporciona una canción de cualquier género (archivo de audio) y su letra, o ninguna letra para una instrumental. Tú entregas un vídeo completo en 1080p: una cara emoji reconocible por sección, cada una en su propio mundo y esquema de color, haciendo algo relatable, bailando al ritmo, con las letras apareciendo en pantalla y temblando con el bajo. Probado en "Mr Me" (150 BPM, 4:12, 15 escenas, ~840 objetos, renderizado en aproximadamente 10 minutos).
0. Reglas creativas (aprendidas del usuario)
- Los protagonistas son caras emoji que transmiten una emoción, una diferente por escena (ansioso, sonrisa, vendado, resoplando, llorando de risa, shh, alucinado, nerd, enojado, sexy, ojos de estrella, boca con cremallera, boca de dinero, halo, fiesta). Los objetos (vela, brújula, diamante) son solo accesorios, nunca protagonistas.
- Estilo en cada protagonista: cada protagonista lleva algo puesto. Para rap, una cadena con dije, grills, tatuajes faciales, aretes y un sombrero (gorra, durag, bucket, beanie, corona); para otros géneros, ver sección 0b.
- Acción relatable por escena: conducir, andar en bicicleta, hacer un examen, grabar con teléfonos, pescar, ser DJ, levantar pesas, selfie, tirar dinero.
- Una paleta por escena, elegida según el estado de ánimo de la letra. El estilo de la letra se mantiene constante entre escenas para que el vídeo se lea como una pieza única.
- Un protagonista recurrente (emoji de gafas de sol) es dueño del coro y regresa en el coro final con todo el elenco detrás.
- Dibuja personajes emoji originales. No copies el conjunto de emojis de un proveedor.
- Muestra una sola escena de prueba (o 3 opciones de paleta) primero y obtén un sí antes de construir todo. Envía vistas previas estáticas con SendUserFile.
0b. Adaptar a la música (cualquier género)
Lee la pista antes de elegir cualquier cosa. El género es una entrada, no una suposición.
- Búsqueda de tempo: busca entre 60-180 BPM, luego resuelve medio/doble tiempo según dónde caiga la caja o el clap (tiempos 2 y 4). Trap y hip-hop suelen leerse como 140-150 pero se sienten a medio tiempo; drum and bass lee 170+ pero se puede animar a mitad de velocidad. Almacena tanto
FPB(tiempo sentido) como el tiempo de la cuadrícula. - Compás: por defecto 4 tiempos por compás; haz que beats-per-bar sea un parámetro (3 para vals, 6 para 6/8) y úsalo en
FR(bar)y las expresiones de duración del compás. - Deriva de tempo (bandas en vivo, grabaciones antiguas): si la puntuación del comb es débil o deriva, usa una lista de beats seguidos y asigna una propiedad
beat_phasepor beat en lugar de las expresiones de período fijo. - Fotogramas por segundo: elige los fps que den fotogramas enteros por beat sentido; de lo contrario, 25 y acepta beats fraccionarios.
- Movimiento por sensación:
- Four-on-the-floor (house, techno, disco, amapiano): rebote uniforme en cada beat, balanceo constante.
- Half-time (trap, hip-hop, drill, dubstep): gran golpe en beat 1, recostarse en 3, pequeños detalles de hi-hat.
- Off-beat (reggae, dancehall, afrobeats, ska): rebote en OFFP, caderas se balancean en un período de 2 beats.
- Rápido (drum and bass, punk, hardcore): cuerpo a media velocidad, manos y accesorios a velocidad completa.
- Lento (balada, R&B, soul, lo-fi): solo balanceo, períodos largos, poca compresión, desvanecimientos lentos de letras en lugar de pops.
- Swing/triplete (jazz, blues, shuffle): retrasar el off-beat a dos tercios del beat.
- Tasa de corte según energía: 8-16 compases por escena cuando está calmado, 4 compases en coros, 1-2 compases en drops y picos.
- Apariencia según género y letras: elige paletas, mundos, sombreros y accesorios que pertenezcan a la música (cadenas y grills para rap, auriculares y visores para música dance, sombrero vaquero para country, flores para folk, tachuelas para rock). Mantén siempre la cara emoji como protagonista y mantén la regla de estilo: cada protagonista lleva algo.
- Estilo de letra: pops duros y sacudidas para pistas con mucho bajo; deslizamiento suave y desvanecimiento para pistas suaves; tipo más grande para estribillos y hooks. El idioma sigue la letra tal como se da (nunca "corrijas" dialecto o pidgin).
- Instrumentales: sin capa de letra; usa el título, nombres de secciones o palabras cortas de estado de ánimo en los drops, y deja que los accesorios cuenten la historia.
- Confirma la lectura con el usuario en una línea (BPM, sensación, mapa de secciones) antes de construir.
1. Analizar la canción (espacio de trabajo)
pip install --break-system-packages -q librosa, luego una búsqueda comb en el flujo de baja banda (<130 Hz) sobre un rango de BPM da el BPM exacto y el primer offset de beat; imprime kick por compás (K) y volumen (R) para ver intro, groove, drops y silencios. No confíes en el BPM escrito en el prompt (el prompt de Suno dijo 140; la pista era 150).- Usa 25 fps cuando dé fotogramas enteros por beat (120, 125, 150 BPM lo hacen).
- Tiempos de letra: los modelos de voz no se pueden descargar en el espacio de trabajo, y las subidas a Descript storage están bloqueadas desde el shell. Llama a
Descript file_upload_ui, pide al usuario que deje caer el audio,wait_for_job, luegoexport_transcriptcomo srt. Espera tiempos a nivel de línea para partes claras de rap/habladas y tiempos a nivel de bloque (o faltantes) para partes densas o cantadas; empareja manualmente la letra real del usuario con esas marcas de tiempo y estima el resto de manera uniforme entre compases. Informa al usuario qué secciones son estimadas. - Escribe una tabla de escenas: sección, compás de inicio, emoji, mundo, acción, paleta. Los límites de escena se sitúan en los compases (medios compases están bien). Añade escenas instrumentales (tarjeta de título, drop) donde la voz está en silencio.
2. Configuración de Blender
- Verifica la conexión con
blender__get_scene_info. Pregunta antes de borrar un archivo guardado. Guarda temprano (pide una carpeta; el Python de Blender puede leer las carpetas del usuario directamente, así que apunta la pista de sonido al audio en su lugar en lugar de copiarlo). - 2D plano: cámara ortográfica en y=-20 mirando hacia +Y,
ortho_scale16 (la vista es de 16 x 9 unidades). Todo se dibuja en el plano XZ; la profundidad es el Y del objeto (Y más grande es más atrás). - Cada escena vive en X = índice * 40 en su propia colección
S01_...; la cámara salta entre ellas con claves LINEAR en la ubicación X (más una pequeña deriva dentro de cada escena) y un marcador de línea de tiempo por corte. - Color:
view_transform='Standard', look None. Almacena código reutilizable enbpy.data.textsy ejecutaexecal principio de cada llamada.
3. Reglas de Grease Pencil que cuestan tiempo encontrar (Blender 5.x)
- Los datos son
bpy.data.grease_pencils;layer.frames.new(1).drawing;drawing.add_strokes([n]); configurapoint.position=(x,0,z)ypoint.radius; llama adrawing.tag_positions_changed(). - Los rellenos no se renderizan a menos que cada trazo relleno tenga un
fill_idno nulo. Establecestroke.fill_id = entero únicopara rellenos y 0 para líneas, ystroke.hide_stroke = Trueen trazos solo de relleno. Dale a todos los bucles de un glifo de texto el mismo fill_id para que los agujeros de letras se recorten. - Materiales:
bpy.data.materials.create_gpencil_data(m);show_fill/show_stroke; gradiente radial mediantefill_style='GRADIENT'. Los colores de material son lineales: convierte hex con(v/255)**2.2o todo se ve deslavado. layer.use_lights = Falseen cada capa.- Los objetos de texto de fuente/curva están ocultos detrás de Grease Pencil en los renders. Convierte texto a GP: haz una curva FONT temporal,
evaluated_get(dg).to_curve(dg), muestrea splines bezier conmathutils.geometry.interpolate_bezier, dibuja los bucles como trazos GP (primero trazos de contorno, luego rellenos). Haz el trabajo temporal en una escena separada de scratch para que el depsgraph de la escena grande no se re-evalúe por palabra (486 palabras tomaron 3 s de esta manera). - Los rellenos translúcidos sobre otros rellenos translúcidos se ven embarrados; prefiere colores oscuros opacos para rayos y brillos.
- Drivers: la ejecución automática de Python suele estar desactivada, por lo que cada driver debe ser una expresión simple (
sin abs exp fmod min max pi frame); aseguradriver.is_simple_expression.
4. Expresiones de beat (F0 = fotograma del primer beat, FPB = fotogramas por beat)
PULSE = exp(-fmod(frame-F0+BIG, FPB)/(FPB*0.25)) # 1 en cada beat, decae
OFFP = igual, desplazado medio beat # off-beat
HALF = exp(-fmod(frame-F0+BIG, 2*FPB)/(FPB*0.45)) # cada 2 beats
OFFB = HALF desplazado un beat
SWAY(per,ph) = sin(pi*(frame-F0)/(FPB*per)+ph)
FR(bar) = F0 + round(4*FPB*bar)
dance(obj): location Z += bouncePULSE, scale X (1+squashPULSE), scale Z (1-squashPULSE), rotation Y += swaySWAY. Alterna PULSE y OFFP entre vecinos. Las manos se encogen en HALF/OFFB. Cámara ortho_scale = 16*(1 - zoom*PULSE) con una propiedad personalizada zoom con clave (más grande en drops y coros).
5. Biblioteca de ayuda para construir una vez
- Formas:
ell,rect,rrect,star,drop;F(relleno),S(línea),P(relleno + contorno de tinta). emo(C,name,x,z,r,mood): sombra, disco amarillo degradado, brillo, luego características por estado de ánimo. Almacenao["r"]=rpara que los accesorios escalen.- Estilo:
chain(o,pendant,ice),grills(o),tattoo(o,kind,side)(lágrima, cruz, estrella, líneas, texto),earring(o,side),hat(o,kind,col,col2,tilt)como objeto hijo,headphones(o),hand(...)con anillos y reloj opcional. - Mundo:
sky(C,X,top,mid,bot)como 16 bandas de color,ground,cityhorizonte con ventanas iluminadas,wheelcon un driver de rotación,phone. preview(shots)renderiza imágenes estáticas al 33% en /tmp ymontage(paths)las embaldosa con numpy en una imagen; mírala conblender__look(image=path). Verifica cada escena de esta manera antes de renderizar.
6. Capa de letras
- Datos: lista de
(kind, t0, t1, text)con kindsLlínea,Aad-lib,Hpalabra de hook,Bgrito grande. Almacénala como JSON en un bloque de texto. L: divide en palabras, envuelve a 14.4 unidades de ancho con tamaño 0.78 y un espacio de 0.44, parte superior del marco. Cada palabra es su propio objeto GP que aparece enstart + i*step(step de la duración de la línea, 2 a 8 fotogramas) y se oculta al inicio de la siguiente línea o en el corte de escena.- Drivers por palabra:
scale = vis * pop * (1+0.10*PULSE)dondevises una rampa de entrada/salida de 2 fotogramas ypopes un sobreimpulso de 6 fotogramas;location X/Z += shake*sin(frame*k+ph)*PULSEpara la vibración del bajo. A: rosa, inclinado, alternando izquierda y derecha.H: amarillo, abajo, cae desde arriba.B: dorado, tamaño 1.5, arriba.- Coloca los objetos de letras de cada escena en colecciones
LYR_Sxxpara que los fragmentos de render puedan ocultar el resto.
7. Renderizado (ruta rápida)
- Un render de escena completa es ~1.3 s/fotograma porque cada objeto GP se evalúa. Renderiza un fragmento por escena en paralelo en su lugar: un Blender en segundo plano por escena que establece
hide_renderen cada colección exceptoSxx_,LYR_SxxyCAMERA, elimina la pista de sonido y escribe H264 sin audio. Ejecuta 5 a la vez desde un proceso de ejecutor separado (start_new_session=True) que registra enrender_log.txt. - Luego ensambla en una escena vacía de fábrica con tiras de película en el fotograma de inicio de cada escena más la pista de sonido, H264 + AAC. Establece la transformación de vista de esa escena a Standard o el vídeo final sale oscuro y desaturado (el valor predeterminado de fábrica es AgX).
- No elimines fragmentos hasta que el archivo final esté verificado.
- Verifica: carga el mp4 como un movieclip (recuento de fotogramas, fps, tamaño) y como sonido (tasa, canales); extrae ~16 fotogramas a través de una escena de secuenciador temporal con transformación de vista Standard en una hoja de contactos y míralo. El rastreo de
bgladd-on en los registros de fondo es inofensivo. - No hagas polling en un bucle apretado; duerme ~5 minutos entre verificaciones e informa al usuario del tiempo esperado.
8. Entrega
- Indica dónde están el mp4 y el .blend (palabras claras más un enlace computer://) y envía la hoja de contactos.
- Indica qué no se verificó (viste imágenes estáticas, no reproducción) y qué secciones de letras son estimadas.
- Ofrece correcciones por escena o por línea de letra; los marcadores de línea de tiempo son los cortes y el JSON de letras contiene los tiempos.