Habla con un avatar 3D detallado impulsado por IA. Utilice el modelo de lenguaje grande (LLM), texto a voz (TTS), el motor de juego Unity y sincronización de labios para darle vida al personaje.
En el vídeo le preguntamos al personaje "¿Quién es Michael Jordan?". El avatar "responde" a la pregunta después de un breve retraso. Usando los mensajes anteriores como contexto podemos tener conversaciones enteras. ¡Observa la física del cabello y el parpadeo!
Muestra de eventos remotos activados desde el navegador web. Después de seleccionar cada VFX, se reproduce el sistema de partículas respectivo. El uso popular es un efecto de partículas de fuegos artificiales cuando alguien dona $5 en Twitch, etc. Durante los efectos visuales de la lluvia, incluso puedes notar salpicaduras y rebotes cuando la gota interactúa con el personaje (parte superior del cabello).
La funcionalidad principal es un modelo 3D personalizado que "habla". Emite voz y utiliza la biblioteca de sincronización de labios de Oculus para dar una impresión (con suerte, convincente). Aquí hay un conjunto de características:
El flujo no depende de ninguna implementación en particular. Siéntase libre de mezclar y combinar LLM, TTS o cualquier modelo 3D adecuado (requiere claves de forma específicas). Como habrás notado, esta arquitectura nos brinda la máxima flexibilidad. Como se puede imaginar, la frase anterior se queda corta.
No hay reconocimiento de voz, el mensaje es sólo de texto. Sería trivial agregar esta función usando Whisper Fast. Consulte las instrucciones a continuación. TL;DR envía GET o POST al punto final
/prompt
.
Al usar TTS con transmisión y DeepSpeed, generalmente obtengo una respuesta de <4 s (desde el envío del mensaje hasta el primer sonido). Es lo suficientemente pequeño como para que la conversación se sienta en tiempo real. En este punto, el cuello de botella es el LLM. En una sola GPU no puedes ejecutar LLM y TTS al mismo tiempo (lo he intentado, consulta las preguntas frecuentes sobre la opción de configuración tts.chunk_size
). Primero tenemos que generar todos los tokens de texto y solo luego generar sonido. Intenté descargar TTS a la CPU, pero esto también tiene problemas.
Streaming significa que dividimos el texto generado en fragmentos más pequeños. Hay un pequeño fundido cruzado para enmascarar las transiciones de fragmentos. Un primer fragmento pequeño significa un tiempo de emisión del primer sonido rápido. DeepSpeed es una biblioteca de Microsoft para acelerar la inferencia de GPT. Tanto el streaming como DeepSpeed son opcionales pero recomendados.
La primera pregunta después de que se inicia el servidor siempre toma más tiempo (~10 segundos) ya que el servidor tiene que cargar los modelos de IA. Cuando se usa en el editor de Unity, rara vez tendrá una pausa en la recolección de basura (algo notable con el audio). Pero me sorprendería que realmente tuviera un problema de GC en la versión de producción.
Debo decir que me hace gracia. Esperaba algunos problemas al usar la misma GPU tanto para el renderizado de Unity como para la IA. Sabía que una aplicación de Android/iOS era una alternativa fácil para descargar el costo de Unity a un dispositivo separado. Pero no es necesario en mi hardware. Es algo inesperado que funcione sin problemas. No me voy a quejar. También limité Unity a 30 FPS (por si acaso).
Si vas al panel de control verás los tiempos para cada etapa de respuesta. Para Unity, utilice el generador de perfiles integrado.
Consulte INSTALL_AND_USAGE.md. También incluye instrucciones sobre cómo usar/ampliar las funciones actuales.
Las siguientes preguntas tratan sobre la filosofía general de esta aplicación. Para obtener preguntas frecuentes más orientadas al uso, consulte INSTALL_AND_USAGE.md.
Esta aplicación muestra que ya tenemos la tecnología para renderizar un avatar 3D detallado y ejecutar algunas redes neutrales en una única GPU de consumo en tiempo real. Es personalizable y no necesita conexión a Internet. También puede funcionar en una arquitectura cliente-servidor, para facilitar, por ejemplo, la renderización en dispositivos móviles.
Podría haber usado el modelo estándar de Sintel. He creado mi propio personaje porque, bueno, puedo. Desde arrastrar los vértices, pintar las texturas, animar la boca y ajustar la física del cabello a un avatar 3D "parlante". Un pasatiempo bastante agradable si lo digo yo mismo.
También quería probar la reproyección de texturas a partir de una imagen estable generada por difusión. Por ejemplo, puede agregar "calvo" al mensaje positivo y "pelo" al negativo. Acelera mucho el flujo de trabajo. Desgraciadamente, la reproyección tendrá reflejos especulares, etc., que deberán eliminarse manualmente.
He usado Sintel como malla base porque ya tiene claves de forma básicas. Especialmente para controlar cada parte de la boca: simplemente agregue controladores compatibles con Blender 4.0. Esto hizo que fuera trivial crear claves con forma de visema. Ya he usado el modelo de Sintel muchas veces en el pasado, por lo que fue una obviedad para este proyecto.
PD. Odio la manipulación.
Probablemente hayas visto personajes virtuales generados por difusión estable y en tiempo real "parlantes". Es una imagen estática con la zona de la boca regenerada en cada fotograma en función del sonido. Notarás que es inestable. Si difundes los dientes en cada fotograma, se moverán constantemente. He usado mucho la difusión estable. He visto mi parte de partes del cuerpo destrozadas (¡manos!). Se... nota con los dientes. Una implementación popular es SadTalker. Incluso tiene la extensión de interfaz de usuario web Stable Diffusion.
En cambio, mi aplicación utiliza tecnología antigua y aburrida que ha estado presente en los videojuegos durante años. Si tienes cientos de horas de diálogo (Baldur's Gate 3, Cyberpunk 2077, etc.), no puedes animar todo a mano. Sistemas como JALI se utilizan en todos los títulos importantes.
Si quieres personajes animados en tiempo real, ¿por qué utilizar únicamente IA? ¿Por qué no buscar soluciones utilizadas por el sector del entretenimiento más grande del mundo? Como mínimo podrías usarlo como base para img2img. En los últimos años también tuvimos VTubers, que van más allá cada día. Muchas de estas cosas se basan en tecnología desarrollada por fanáticos de Hatsune Miku.
Neuro-sama es un transmisor virtual popular. Es un personaje impulsado por IA que juega videojuegos y habla con su creador, Vedal. Así es como mi aplicación se compara con ella:
Esta aplicación incluye código fuente/activos creados por otras personas. Cada una de estas instancias tiene un README.md dedicado en su subcarpeta que explica la licencia. Por ejemplo, me he comprometido con el código fuente de este repositorio para la biblioteca "Oculus Lipsync", que tiene su propia licencia (¡acéptela antes de usarla!). XTTS v2.0 también es sólo para uso no comercial. Los párrafos siguientes sólo afectan a las cosas creadas por mí.
Es GPLv3. Es una de licencias copyleft. Las licencias GPL/copyleft deberían ser familiares para la mayoría de los programadores de Blender o del kernel de Linux. Es bastante extremo, pero viene dictado por la naturaleza de la aplicación. Y, particularmente, uno de los posibles usos.
Recientemente vi "La pesadilla de los 3.500 dólares de Apple" de Eddy Burback. Es una revisión del Apple Vision Pro de $ 3500 (!). Una de las aplicaciones presentadas permite al usuario salir con una "novia" de IA. La interfaz tiene una imagen estable generada por difusión a la izquierda (¿huelo PastelDiffusedMix con Seraphine LoRA?). Chat de texto a la derecha. ¿Es ese el estado del arte para este tipo de software? Es perezoso.
Ofc. Las aplicaciones de citas móviles estuvieron llenas de controversias desde el principio. Tinder and Co. no quieren perder clientes habituales. Las estafas abundan incluso antes de llegar al aprendizaje automático. Hay millones de perfiles de IA en Tinder. Y con las citas con IA pura es un tema completamente diferente.
Puedes usar cualquier modelo que quieras. La sincronización labial utiliza claves de forma que corresponden a los visemas de ovrlipsync. Con la demostración tecnológica "Enemies", Unity ha demostrado que puede representar humanos realistas.
Personalmente, usaría el metahumano de Unreal Engine. Tendrías que reescribir mi código de Unity. Para este esfuerzo, obtienes un equipo de última generación y un activo de alta fidelidad gratuito. También puedes intentar importar metahumano a Unity.
Por alguna razón, Unity no tiene un canal integrado para personajes humanos. Incluso cuando crearon la cinemática de "Enemigos" vinculada anteriormente, no se molestaron en hacerla viable para la comunidad. Es un conjunto personalizado de herramientas adaptado a Autodesk Maya. Y nunca había oído hablar del formato de archivo de clip 4D. ¡Felicitaciones al líder del proyecto! Es una decisión desconcertante. Por ejemplo, tienen su HairFX para renderizado y simulación de cabello. Está basado en TressFX. He portado TressFX a OpenGL, WebGL y Vulkan. Lo entiendo bastante bien. ¡Y aún así esta aplicación usa tarjetas para el cabello! Original Sintel tiene cabello basado en splines, esto debería haber sido una simple operación de exportación. Estos sistemas necesitan la documentación adecuada.
Al fin y al cabo, la herramienta es sólo una herramienta. Ojalá Unity tuviera sus prioridades en orden. Yo diría que representar a las personas es bastante importante en el mercado actual.
Sí, pero asegúrese de comprender por qué desea utilizar un motor 3D para una técnica de renderizado 2D. Para Guilty Gear Xrd, los autores tuvieron que modificar las normales cuadro por cuadro. Incluso hoy en día, los fanáticos del anime desaprueban el 3D. La única excepción (hasta donde yo sé) es Land of the Lustrous. Y a esto ayuda su asombrosa composición de planos.
Si nos fijamos en la animación occidental en tiempo real tenemos, por ejemplo, Borderlands. Replica el estilo del cómic utilizando iluminación plana, colores apagados y líneas de tinta gruesas. Hay toneladas de tutoriales en YouTube para sombreado plano, pero no obtendrás un resultado cercano sin ser bueno pintando texturas.
Si bien esto puede parecer desalentador, quiero que consideres tu objetivo. Hay una razón por la que todos los demás usan VTubeStudio y Live2D. La creación de modelos para 2D y 3D no tiene comparación en complejidad, ni siquiera es la misma forma de arte.
Ignora todo lo que dije anteriormente si trabajas para Riot Games, Fortiche, Disney/Pixar DreamWorks o Sony Pictures Animation.
El tamaño de instalación de Unity es más pequeño. Está dirigido a aficionados. Puede simplemente escribir un script en C# y soltarlo en un objeto para agregar un nuevo comportamiento. Si bien la UX puede estar en todas partes, no tiene fricciones en los aspectos centrales.
Unity supera a UE5 en facilidad de uso y tiempo de iteración. La razón principal para cambiar a UE5 sería un metahumano (!), una producción virtual o un mocap estándar de la industria.
Depende del modelo LLM. La gemma:2b-instruct
predeterminada es pequeña (3 mil millones de parámetros). Puede crear oraciones coherentes, pero hasta ahí puede llegar. Si puedes utilizar un modelo 7B de última generación (incluso con cuantización), o algo más grande, hazlo. Siempre puedes cambiarlo por ChatGPT también. O utilice una configuración de múltiples GPU. O ejecute Unity en un teléfono móvil, TTS en una Raspberry PI y tenga VRAM completa para LLM.
No he añadido esto. Sería necesario agregar casos especiales al modelo 3D. Por ejemplo, puede resultar difícil animar la boca durante la sincronización de labios. El rubor con avatares 3D generalmente se logra combinando una textura especial en un gráfico de sombreado.
Sin embargo, la tecnología básica ya existe. Si desea detectar emociones en el texto, puede utilizar LLM para el análisis de sentimientos. También agregué la tecnología para activar los eventos usando WebSocket. ATM está iniciando un efecto de partículas. La mitad del código C# se ocupa de activar claves de forma. El parpadeo es una función que se llama cada pocos segundos. Una vez que crea una interacción en el modelo 3D, puede iniciarla en cualquier momento. Simplemente lleva mucho tiempo crearlo.
Sí, lo intenté (no agregado a este repositorio). El plan original era transferir el estilo del fotograma renderizado a una imagen estable generada por difusión. Según mis rápidos experimentos, además de los problemas de rendimiento, las soluciones más simples no tienen la calidad ni la estabilidad temporal necesarias.
No tenemos un presupuesto de rendimiento para ejecutar VGG16/19. Esto excluye las técnicas 'originales' como "Un algoritmo neuronal de estilo artístico" [Gatys2015] o "Pérdidas de percepción para transferencia de estilo en tiempo real y superresolución" [Johnson2016]. Ninguno de ellos miró también el parpadeo. Fueron diseñados sólo para imágenes estáticas y no para vídeos. Hubo otros trabajos que analizaron ese problema: [Jamriska2019], [Texler2020].
Sé que Unity también intentó la transferencia de estilos en tiempo real en 2020: "Transferencia de estilos en tiempo real en Unity utilizando redes neuronales profundas".
Después, estamos en territorio de transformadores (¡sorpresa!). El año pasado, "Aumento de datos con modelos de difusión (DATUM)" [CVPR-W 2023] utilizó la difusión (de nuevo, ¡sorpresa!). Hay una categoría de artículos con código llamada Traducción sintética a real si desea realizar un seguimiento de los últimos avances.
En este punto, he decidido que era una característica complicada intentar encajar esto en la aplicación.
Hubo un episodio de Two Minute Papers que analizó técnicas similares: "¡El videojuego de Intel parece realidad!". Basado en "Mejora del fotorrealismo" de Intel [Richter2021].
Sí, verifique .fbx dentro de unity-project/Assets/Sintel.
Todos mis proyectos tienen nombres utilitarios. Esta vez quería algo más distinto. Iris es una flor de color azul violeta. El iris es parte del ojo. ¿Parecía apropiado? Sobre todo porque los ojos y el cabello son los problemas en los personajes generados por computadora.