Fale com o avatar 3D detalhado com tecnologia de IA. Use modelo de linguagem grande (LLM), conversão de texto em fala (TTS), mecanismo de jogo Unity e sincronização labial para dar vida ao personagem.
No vídeo perguntamos ao personagem “Quem é Michael Jordan?”. O avatar 'responde' à pergunta após um pequeno atraso. Usando as mensagens anteriores como contexto, podemos ter conversas inteiras. Observe a física do cabelo e o piscar!
Vitrine de eventos remotos acionados pelo navegador da web. Após selecionar cada VFX, o respectivo sistema de partículas é reproduzido. O uso popular é um efeito de partícula de fogos de artifício quando alguém doa US$ 5 no Twitch, etc. Durante o efeito visual da chuva, você pode até notar respingos e saltos quando a gota interage com o personagem (parte superior do cabelo).
A funcionalidade principal é um modelo 3D personalizado que “fala”. Ele emite voz e usa a biblioteca de sincronização labial da Oculus para dar uma impressão (esperançosamente convincente). Aqui está um conjunto de recursos:
O fluxo não depende de nenhuma implementação específica. Sinta-se à vontade para misturar e combinar LLMs, TTSs ou qualquer modelo 3D adequado (requer chaves de forma específicas). Como você pode notar, essa arquitetura nos oferece flexibilidade máxima. Como você pode imaginar, a frase anterior é um eufemismo.
Não há reconhecimento de fala, o prompt é somente texto. Seria trivial adicionar esse recurso usando Whisper Fast. Veja abaixo as instruções. TL;DR envia GET ou POST para o endpoint
/prompt
.
Usando TTS com streaming e DeepSpeed, geralmente recebo uma resposta <4s (desde o envio do prompt até o primeiro som). É pequeno o suficiente para que a conversa pareça em tempo real. Neste ponto, o gargalo é o LLM. Em uma única GPU você não pode executar LLM e TTS ao mesmo tempo (eu tentei, verifique o FAQ sobre a opção de configuração tts.chunk_size
). Temos que primeiro gerar todos os tokens de texto e só depois gerar o som. Tentei descarregar o TTS para a CPU, mas isso também apresenta dificuldades.
Streaming significa que dividimos o texto gerado em pedaços menores. Há um pequeno crossfade para mascarar transições de pedaços. Um primeiro pedaço pequeno significa um tempo rápido para o primeiro som. DeepSpeed é uma biblioteca da Microsoft para acelerar a inferência GPT. Tanto o streaming quanto o DeepSpeed são opcionais, mas recomendados.
A primeira pergunta após o início do servidor sempre leva mais tempo (cerca de 10s), pois o servidor precisa carregar os modelos de IA. Quando usado no editor Unity, você raramente terá uma pausa na coleta de lixo (meio perceptível com áudio). Mas eu ficaria surpreso se você realmente tivesse um problema de GC na construção de produção.
Devo dizer que me diverti. Eu esperava alguns problemas ao usar a mesma GPU para renderização do Unity e IA. Eu sabia que um aplicativo Android/iOS era uma alternativa fácil para transferir o custo do Unity para um dispositivo separado. Mas não é necessário no meu hardware. É meio inesperado que funcione bem. Não vou reclamar. Também limitei o Unity a 30FPS (por precaução).
Se você for ao painel de controle, verá os tempos de cada estágio de resposta. Para Unity, use o criador de perfil integrado.
Consulte INSTALL_AND_USAGE.md. Também inclui instruções sobre como usar/expandir os recursos atuais.
As perguntas abaixo são sobre a filosofia geral deste aplicativo. Para obter perguntas frequentes mais orientadas ao uso, consulte INSTALL_AND_USAGE.md.
Este aplicativo mostra que já temos a tecnologia para renderizar um avatar 3D detalhado e executar algumas redes neutras em uma única GPU de consumo em tempo real. É personalizável e não precisa de conexão com a internet. Também pode funcionar em uma arquitetura cliente-servidor, para facilitar, por exemplo, a renderização em dispositivos móveis.
Eu poderia ter usado o modelo Sintel padrão. Eu criei meu próprio personagem porque, bem, eu posso. Desde arrastar os vértices, pintar as texturas, animar a boca e ajustar a física do cabelo até um avatar 3D “falante”. Um passatempo bastante agradável, se assim posso dizer.
Eu também queria testar a reprojeção de textura a partir de uma imagem gerada por difusão estável. Por exemplo, você pode adicionar 'careca' ao prompt positivo e 'cabelo' ao negativo. Isso acelera muito o fluxo de trabalho. Infelizmente, a reprojeção terá realces especulares, etc. para remover manualmente.
Usei Sintel como malha base, pois já possui chaves de forma básicas. Principalmente para controlar cada parte da boca - basta adicionar drivers compatíveis com o Blender 4.0. Isso tornou trivial a criação de chaves de formato de visema. Já usei o modelo da Sintel muitas vezes no passado, então foi um acéfalo para este projeto.
PS. Eu odeio manipulação.
Você provavelmente já viu personagens virtuais gerados por difusão estável e 'falantes' em tempo real. É uma imagem estática com a área da boca regenerada em cada quadro com base no som. Você notará que é instável. Se você espalhar os dentes em cada quadro, eles mudarão constantemente. Eu usei muito a difusão estável. Já vi muitas partes do corpo mutiladas (mãos!). É... perceptível com os dentes. Uma implementação popular é o SadTalker. Ele ainda possui a extensão Stable Diffusion web UI.
Em vez disso, meu aplicativo usa tecnologia antiga e chata que está presente nos videogames há anos. Se você tiver centenas de horas de diálogo (Baldur’s Gate 3, Cyberpunk 2077, etc.), não poderá animar tudo manualmente. Sistemas como o JALI são usados em todos os títulos importantes.
Se você quer personagens animados em tempo real, por que usar apenas IA? Por que não buscar soluções utilizadas pelo maior setor de entretenimento do mundo? No mínimo você poderia usá-lo como base para o img2img. Nos últimos anos também tivemos VTubers, que vão além dos limites a cada dia. Muitas dessas coisas são baseadas em tecnologia desenvolvida por fãs de Hatsune Miku.
Neuro-sama é um streamer virtual popular. É um personagem baseado em IA que joga videogame e conversa com seu criador, Vedal. Aqui está como meu aplicativo se compara a ele:
Este aplicativo inclui código-fonte/ativos criados por outras pessoas. Cada uma dessas instâncias possui um README.md dedicado em sua subpasta que explica o licenciamento. Por exemplo, eu me comprometi com este código-fonte do repositório para a biblioteca "Oculus Lipsync", que tem sua própria licença (aceite-a antes de usar!). O XTTS v2.0 também é apenas para uso não comercial. Os parágrafos abaixo afetam apenas coisas criadas por mim.
É GPLv3. É uma das licenças copyleft. As licenças GPL/copyleft devem ser familiares para a maioria dos programadores do Blender ou do kernel Linux. É bastante extremo, mas é ditado pela natureza do aplicativo. E, particularmente, um dos usos possíveis.
Recentemente assisti "Apple's $ 3500 Nightmare", de Eddy Burback. É uma análise do Apple Vision Pro de US$ 3.500 (!). Um dos aplicativos apresentados permite ao usuário namorar uma “namorada” de IA. A interface tem uma imagem estável gerada por difusão à esquerda (sinto cheiro de PastelDiffusedMix com Seraphine LoRA?). Bate-papo de texto à direita. Esse é o estado da arte para esse tipo de software? É preguiçoso.
Ofc. os aplicativos de namoro móveis foram repletos de controvérsias desde o início. Tinder and Co. não querem perder clientes recorrentes. Muitos golpes antes mesmo de chegarmos ao aprendizado de máquina. Existem milhões de perfis de IA no Tinder. E com o namoro direto com IA é uma questão totalmente diferente.
Você pode usar qualquer modelo que desejar. A sincronização labial usa chaves de forma que correspondem aos visemas do ovrlipsync. Com a demonstração tecnológica “Inimigos”, o Unity provou que pode renderizar humanos realistas.
Pessoalmente, eu usaria o metahumano do Unreal Engine. Você teria que reescrever meu código Unity. Para esse esforço, você obtém um equipamento de última geração e um ativo gratuito de alta fidelidade. Você também pode tentar importar metahumano para o Unity.
Por alguma razão, o Unity não possui um pipeline integrado para personagens humanos. Mesmo ao criar o filme "Inimigos" vinculado acima, eles não se preocuparam em torná-lo viável para a comunidade. É um conjunto personalizado de ferramentas adaptadas ao Autodesk Maya. E nunca ouvi falar do formato de arquivo de clipe 4D. Parabéns ao líder do projeto! É uma decisão desconcertante. Por exemplo, eles têm o HairFX para renderização e simulação de cabelo. É baseado no TressFX. Eu portei o TressFX para OpenGL, WebGL e Vulkan. Eu entendo isso muito bem. E ainda assim este aplicativo usa cartões de cabelo! Original Sintel tem cabelo baseado em estrias, isso deveria ter sido uma simples operação de exportação. Esses sistemas precisam de documentação adequada.
No final das contas, a ferramenta é apenas uma ferramenta. Gostaria que a Unity colocasse suas prioridades em ordem. Eu diria que renderizar pessoas é muito importante no mercado atual.
Sim, mas certifique-se de entender por que deseja usar um mecanismo 3D para uma técnica de renderização 2D. Para Guilty Gear Xrd, os autores tiveram que ajustar os normais por quadro. Ainda hoje, o 3D é desaprovado pelos fãs de anime. A única exceção (até onde eu sei) é a Terra dos Lustrosos. E isso é ajudado por sua incrível composição de tomadas.
Olhando para a animação ocidental em tempo real, temos, por exemplo, Borderlands. Ele replica o estilo dos quadrinhos usando iluminação plana, cores suaves e linhas grossas de tinta. Existem muitos tutoriais no YouTube sobre sombreamento plano, mas você não conseguirá um resultado próximo sem ser bom em pintar texturas.
Embora isso possa parecer desanimador, quero que você considere seu objetivo. Há uma razão pela qual todo mundo está usando VTubeStudio e Live2D. Criar modelos para 2D e 3D não tem comparação em complexidade, nem é a mesma forma de arte.
Desconsidere tudo o que eu disse acima se você trabalha para Riot Games, Fortiche, Disney/Pixar DreamWorks ou Sony Pictures Animation.
O tamanho da instalação da unidade é menor. Destina-se a amadores. Você pode simplesmente escrever um script C# e soltá-lo em um objeto para adicionar um novo comportamento. Embora a UX possa estar em todos os lugares, ela é simples em aspectos essenciais.
O Unity supera o UE5 em facilidade de uso e tempo de iteração. O principal motivo para mudar para o UE5 seria um metahumano (!), produção virtual ou mocap padrão da indústria.
Depende do modelo LLM. O padrão gemma:2b-instruct
é minúsculo (3 bilhões de parâmetros). Ele pode criar frases coerentes, mas é até onde pode ir. Se você puder usar um modelo 7B de última geração (mesmo com quantização), ou algo maior, vá em frente. Você sempre pode trocá-lo por ChatGPT também. Ou use uma configuração multi-GPU. Ou execute o Unity em um telefone celular, o TTS em um Raspberry PI e tenha VRAM completo para LLM.
Eu não adicionei isso. Isso exigiria casos especiais adicionados ao modelo 3D. Por exemplo, pode ser difícil animar a boca durante a sincronização labial. O rubor com avatares 3D geralmente é feito misturando texturas especiais em um gráfico de sombreamento.
No entanto, a tecnologia básica já existe. Se quiser detectar emoções no texto, você pode usar o LLM para análise de sentimento. Também adicionei a tecnologia para acionar os eventos usando WebSocket. ATM está iniciando um efeito de partícula. Metade do código C# trata do acionamento de chaves de formato. Piscar é uma função chamada a cada poucos segundos. Depois de criar uma interação no modelo 3D, você poderá iniciá-la a qualquer momento. É apenas demorado criar.
Sim, tentei (não adicionado a este repositório). O plano original era transferir o estilo do quadro renderizado para uma imagem gerada por difusão estável. Pelos meus rápidos experimentos, além dos problemas de desempenho, as soluções mais simples não possuem a qualidade ou estabilidade temporal necessária.
Não temos um orçamento de desempenho para executar o VGG16/19. Isso exclui as técnicas 'originais' como "Um algoritmo neural de estilo artístico" [Gatys2015] ou "Perdas perceptuais para transferência de estilo em tempo real e super-resolução" [Johnson2016]. Nenhum deles também olhou para piscar. Eles foram projetados apenas para imagens estáticas e não para vídeos. Houve outros trabalhos que analisaram esse problema: [Jamriska2019], [Texler2020].
Eu sei que o Unity também tentou a transferência de estilo em tempo real em 2020: "Transferência de estilo em tempo real no Unity usando redes neurais profundas".
Depois, estamos no território dos transformadores (surpresa!). No ano passado, "Data AugmenTation with difUsion Models (DATUM)" [CVPR-W 2023] usou difusão (de novo, surpresa!). Existe uma categoria de documentos com código chamada Tradução Sintética para Real se você deseja acompanhar o que há de mais moderno.
Neste ponto, decidi que era um recurso estranho tentar encaixar isso no aplicativo.
Houve um episódio do Two Minute Papers que analisou técnicas semelhantes: "O videogame da Intel parece realidade!". Baseado no "Enhancing Photorealism Enhancement" da Intel [Richter2021].
Sim, verifique .fbx dentro de Unity-project/Assets/Sintel.
Todos os meus projetos têm nomes utilitários. Desta vez, eu queria algo mais distinto. Iris é uma flor azul-púrpura. A íris faz parte do olho. Pareceu adequado? Especialmente porque olhos e cabelos são os problemas dos personagens CG.