Parlez avec un avatar 3D détaillé alimenté par l'IA. Utilisez le modèle de langage étendu (LLM), la synthèse vocale (TTS), le moteur de jeu Unity et la synchronisation labiale pour donner vie au personnage.
Dans la vidéo, nous demandons au personnage "Qui est Michael Jordan ?". L'avatar « répond » à la question après un court délai. En utilisant les messages précédents comme contexte, nous pouvons avoir des conversations entières. Remarquez la physique des cheveux et le clignement des yeux !
Vitrine des événements à distance déclenchés depuis le navigateur Web. Après avoir sélectionné chaque VFX, le système de particules respectif est joué. L'usage courant est un effet de particule de feu d'artifice lorsque quelqu'un fait un don de 5 $ sur Twitch, etc. Pendant les effets visuels de pluie, vous remarquerez peut-être même des éclaboussures et des rebonds lorsque des gouttelettes interagissent avec le personnage (haut des cheveux).
La fonctionnalité principale est un modèle 3D personnalisé qui « parle ». Il émet de la voix et utilise la bibliothèque de synchronisation labiale d'Oculus pour donner une impression (espérons-le convaincante). Voici un ensemble de fonctionnalités :
Le flux ne repose sur aucune implémentation particulière. N'hésitez pas à mélanger et assortir des LLM, des TTS ou tout autre modèle 3D approprié (nécessite des clés de forme spécifiques). Comme vous le remarquerez peut-être, cette architecture nous offre une flexibilité ultime. Comme vous pouvez l’imaginer, la phrase précédente est un euphémisme.
Il n'y a pas de reconnaissance vocale, l'invite est uniquement du texte. Il serait trivial d'ajouter cette fonctionnalité en utilisant Whisper Fast. Voir ci-dessous pour les instructions. TL;DR envoie GET ou POST au point de terminaison
/prompt
.
En utilisant TTS avec le streaming et DeepSpeed, j'obtiens généralement une réponse <4 s (de l'envoi de l'invite au premier son). C'est assez petit, cette conversation semble en temps réel. À ce stade, le goulot d’étranglement est le LLM. Sur un seul GPU, vous ne pouvez pas exécuter LLM et TTS en même temps (j'ai essayé, consultez la FAQ sur l'option de configuration tts.chunk_size
). Nous devons d’abord générer tous les jetons de texte et ensuite seulement générer du son. J'ai essayé de décharger TTS sur le processeur, mais cela pose également problème.
Le streaming signifie que nous divisons le texte généré en morceaux plus petits. Il y a un petit fondu enchaîné pour masquer les transitions de morceaux. Un petit premier morceau signifie un temps d'apparition rapide du premier son. DeepSpeed est une bibliothèque Microsoft pour accélérer l'inférence GPT. Le streaming et DeepSpeed sont facultatifs mais recommandés.
La première question après le démarrage du serveur est toujours la plus longue (~ 10 s) car le serveur doit charger les modèles d'IA. Lorsqu'il est utilisé dans l'éditeur Unity, vous aurez rarement une pause dans le ramasse-miettes (un peu perceptible avec l'audio). Mais je serais surpris si vous rencontriez réellement un problème de GC dans la version de production.
Je dois dire que je suis amusé. Je m'attendais à quelques problèmes lors de l'utilisation du même GPU pour le rendu Unity et l'IA. Je savais qu'une application Android/iOS était une solution de repli facile pour transférer le coût d'Unity sur un appareil distinct. Mais ce n'est pas nécessaire sur mon matériel. C'est un peu inattendu que cela fonctionne bien. Je ne vais pas me plaindre. J'ai également limité Unity à 30FPS (juste au cas où).
Si vous accédez au panneau de contrôle, vous verrez les délais pour chaque étape de réponse. Pour Unity, utilisez le profileur intégré.
Voir INSTALL_AND_USAGE.md. Il comprend également des instructions sur la façon d'utiliser/développer les fonctionnalités actuelles.
Les questions ci-dessous portent sur la philosophie générale de cette application. Pour une FAQ plus orientée vers l'utilisation, voir INSTALL_AND_USAGE.md.
Cette application montre que nous disposons déjà de la technologie nécessaire pour restituer un avatar 3D détaillé et exécuter quelques réseaux neutres sur un seul GPU grand public en temps réel. Il est personnalisable et ne nécessite pas de connexion Internet. Il peut également fonctionner dans une architecture client-serveur, pour faciliter par exemple le rendu sur les appareils mobiles.
J'aurais pu utiliser le modèle Sintel standard. J'ai créé mon propre personnage parce que, eh bien, je le peux. Qu'il s'agisse de faire glisser les sommets, de peindre les textures, d'animer la bouche et d'ajuster la physique des cheveux à un avatar 3D « parlant ». Un passe-temps plutôt agréable si je le dis moi-même.
J'ai également voulu tester la reprojection de texture à partir d'une image stable générée par diffusion. Par exemple, vous pouvez ajouter « chauve » à l'invite positive et « cheveux » à l'invite négative. Cela accélère beaucoup le flux de travail. Hélas, la reprojection aura des reflets spéculaires, etc. à supprimer manuellement.
J'ai utilisé Sintel comme maillage de base car il possède déjà des clés de forme de base. Surtout pour contrôler chaque partie de la bouche - ajoutez simplement des pilotes compatibles Blender 4.0. Cela a rendu trivial la création de clés de forme de visème. J'ai déjà utilisé le modèle de Sintel à plusieurs reprises dans le passé, c'était donc une évidence pour ce projet.
PS. Je déteste le trucage.
Vous avez probablement vu des personnages virtuels générés par diffusion stable et en temps réel « parler ». Il s'agit d'une image statique avec la zone de la bouche régénérée à chaque image en fonction du son. Vous remarquerez qu'il est instable. Si vous diffusez les dents à chaque image, elles se déplaceront constamment. J'ai beaucoup utilisé la diffusion stable. J'ai vu ma part de parties du corps mutilées (des mains !). C'est... visible avec les dents. Une implémentation populaire est SadTalker. Il dispose même de l’extension d’interface utilisateur Web Stable Diffusion.
Au lieu de cela, mon application utilise une vieille technologie ennuyeuse qui est présente dans les jeux vidéo depuis des années. Si vous disposez de centaines d'heures de dialogue (Baldur's Gate 3, Cyberpunk 2077, etc.), vous ne pouvez pas tout animer à la main. Des systèmes comme JALI sont utilisés dans tous les titres majeurs.
Si vous voulez des personnages animés en temps réel, pourquoi utiliser uniquement l’IA ? Pourquoi ne pas rechercher des solutions utilisées par le plus grand secteur du divertissement au monde ? À tout le moins, vous pourriez l'utiliser comme base pour img2img. Ces dernières années, nous avons également eu des VTubers, qui repoussent les limites chaque jour. Une grande partie de ces éléments sont basés sur des technologies développées par les fans de Hatsune Miku.
Neuro-sama est un streamer virtuel populaire. C'est un personnage piloté par l'IA qui joue à des jeux vidéo et discute avec son créateur, Vedal. Voici comment mon application se compare à cela :
Cette application inclut le code source/les actifs créés par d'autres personnes. Chacune de ces instances a un README.md dédié dans son sous-dossier qui explique la licence. Par exemple, je me suis engagé sur ce code source de dépôt pour la bibliothèque "Oculus Lipsync", qui possède sa propre licence (acceptez-la avant utilisation !). XTTS v2.0 est également uniquement destiné à un usage non commercial. Les paragraphes ci-dessous n'affectent que les choses créées par moi.
C'est la GPLv3. C'est l'une des licences copyleft. Les licences GPL/copyleft devraient être familières à la plupart des programmeurs de Blender ou du noyau Linux. C'est assez extrême, mais cela est dicté par la nature de l'application. Et surtout une des utilisations possibles.
Récemment, j'ai regardé "Le cauchemar à 3 500 $ d'Apple" d'Eddy Burback. Il s'agit d'une revue de l'Apple Vision Pro à 3 500 $ (!). L'une des applications présentées permet à l'utilisateur de sortir avec une "petite amie" IA. L'interface a une image stable générée par diffusion sur la gauche (je sens PastelDiffusedMix avec Seraphine LoRA ?). Chat textuel à droite. Est-ce l’état de l’art pour ce type de logiciel ? C'est paresseux.
Ofc. les applications de rencontres mobiles ont été remplies de controverses dès le départ. Tinder and Co. ne veut pas perdre de clients fidèles. Les escroqueries sont nombreuses avant même d’en arriver à l’apprentissage automatique. Il existe des millions de profils IA sur Tinder. Et avec les rencontres directes avec l’IA, c’est un tout autre problème.
Vous pouvez utiliser n’importe quel modèle de votre choix. La synchronisation labiale utilise des clés de forme qui correspondent aux visèmes d'ovrlipsync. Avec la démo technologique "Enemies", Unity a prouvé qu'il pouvait restituer des humains réalistes.
Personnellement, j'utiliserais le métahumain d'Unreal Engine. Il faudrait réécrire mon code Unity. Pour cet effort, vous bénéficiez d’une plate-forme de pointe et d’un actif haute fidélité gratuit. Vous pouvez également essayer d'importer du métahumain dans Unity.
Pour une raison quelconque, Unity ne dispose pas de pipeline intégré pour les personnages humains. Même lors de la création de la cinématique "Ennemis" liée ci-dessus, ils n'ont pas pris la peine de la rendre viable pour la communauté. Il s'agit d'un ensemble d'outils personnalisés adaptés à Autodesk Maya. Et je n'ai jamais entendu parler du format de fichier clip 4D. Félicitations au porteur du projet ! C'est une décision déconcertante. Par exemple, ils ont leur HairFX pour le rendu et la simulation des cheveux. Il est basé sur TressFX. J'ai porté TressFX sur OpenGL, WebGL et Vulkan. Je le comprends très bien. Et pourtant cette application utilise des cartes cheveux ! Original Sintel a des cheveux à base de cannelures, cela aurait dû être une simple opération d'exportation. Ces systèmes nécessitent une documentation appropriée.
En fin de compte, l’outil n’est qu’un outil. J'aimerais que Unity mette de l'ordre dans ses priorités. Je dirais que le rendu des personnes est très important sur le marché actuel.
Oui, mais assurez-vous de comprendre pourquoi vous souhaitez utiliser un moteur 3D pour une technique de rendu 2D. Pour Guilty Gear Xrd, les auteurs ont dû modifier les normales image par image. Même aujourd’hui, la 3D est mal vue par les fans d’anime. La seule exception (pour autant que je sache) est Land of the Lustrous. Et cela est facilité par son incroyable composition de plans.
En regardant l'animation occidentale en temps réel, nous avons par exemple Borderlands. Il reproduit le style de la bande dessinée en utilisant un éclairage plat, des couleurs sourdes et des lignes d'encre épaisses. Il existe des tonnes de tutoriels sur YouTube pour l'ombrage plat, mais vous n'obtiendrez pas un résultat proche sans être doué pour peindre des textures.
Même si cela peut sembler décourageant, je veux que vous réfléchissiez à votre objectif. Il y a une raison pour laquelle tout le monde utilise VTubeStudio et Live2D. La création de modèles pour la 2D et la 3D n'a pas de complexité comparable, ce n'est même pas la même forme d'art.
Ignorez tout ce que j'ai dit ci-dessus si vous travaillez pour Riot Games, Fortiche, Disney/Pixar DreamWorks ou Sony Pictures Animation.
La taille de l’installation d’Unity est plus petite. Il s'adresse aux amateurs. Vous pouvez simplement écrire un script C# et le déposer sur un objet pour ajouter un nouveau comportement. Bien que l’UX puisse être omniprésente, elle est fluide dans ses aspects fondamentaux.
Unity bat UE5 en termes de facilité d'utilisation et de temps d'itération. La principale raison de passer à l'UE5 serait une production métahumaine (!), virtuelle ou une mocap standard de l'industrie.
Cela dépend du modèle LLM. L' gemma:2b-instruct
par défaut est minuscule (3 milliards de paramètres). Il peut créer des phrases cohérentes, mais c'est jusqu'où il peut aller. Si vous pouvez utiliser un modèle 7B de pointe (même avec quantification), ou quelque chose de plus gros, foncez. Vous pouvez toujours l'échanger contre ChatGPT également. Ou utilisez une configuration multi-GPU. Ou exécutez Unity sur un téléphone mobile, TTS sur un Raspberry PI et disposez d'une VRAM complète pour LLM.
Je n'ai pas ajouté ceci. Cela nécessiterait l'ajout de cas particuliers au modèle 3D. Par exemple, il peut être difficile d'animer la bouche pendant la synchronisation labiale. Le rougissement avec des avatars 3D se fait généralement en mélangeant une texture spéciale dans un graphique shader.
Pourtant, la technologie de base est déjà là. Si vous souhaitez détecter des émotions dans un texte, vous pouvez utiliser LLM pour l'analyse des sentiments. J'ai également ajouté la technologie pour déclencher les événements à l'aide de WebSocket. ATM, ça déclenche un effet de particules. La moitié du code C# concerne le déclenchement des clés de forme. Le clignotement est une fonction appelée toutes les quelques secondes. Une fois que vous avez créé une interaction sur le modèle 3D, vous pouvez la démarrer à tout moment. C'est juste du temps à créer.
Oui, j'ai essayé (non ajouté à ce dépôt). Le plan initial était de transférer le style du cadre rendu vers une image stable générée par diffusion. D'après mes expériences rapides, outre les problèmes de performances, les solutions les plus simples n'ont pas la qualité ou la stabilité temporelle nécessaire.
Nous n'avons pas de budget de performance pour exécuter VGG16/19. Cela exclut les techniques « originales » comme « Un algorithme neuronal du style artistique » [Gatys2015] ou « Les pertes de perception pour le transfert de style en temps réel et la super-résolution » [Johnson2016]. Aucun d’eux n’a également regardé le scintillement. Ils ont été conçus uniquement pour les images statiques et non pour les vidéos. D'autres travaux se sont penchés sur ce problème : [Jamriska2019], [Texler2020].
Je sais que Unity a également essayé le transfert de style en temps réel en 2020 : « Transfert de style en temps réel dans Unity à l'aide de réseaux de neurones profonds ».
Ensuite, nous sommes sur le territoire des transformateurs (surprise !). L'année dernière, "Data AugmenTation with diffUsion Models (DATUM)" [CVPR-W 2023] a utilisé la diffusion (encore une fois, surprise !). Il existe une catégorie d'articles avec code appelée Traduction synthétique vers réel si vous souhaitez suivre l'état de l'art.
À ce stade, j'ai décidé que c'était une fonctionnalité détournée d'essayer d'intégrer cela dans l'application.
Il y avait un épisode de Two Minute Papers qui examinait des techniques similaires : « Le jeu vidéo d'Intel ressemble à la réalité ! ». Basé sur « Enhancing Photorealism Enhancement » d'Intel [Richter2021].
Oui, vérifiez .fbx dans unity-project/Assets/Sintel.
Tous mes projets ont des noms utilitaires. Cette fois, je voulais quelque chose de plus distinctif. L'iris est une fleur bleu-violet. L'iris fait partie de l'œil. Cela vous a semblé approprié ? D’autant plus que les yeux et les cheveux sont le problème des personnages CG.