kazeia/AVATAR_3D_RAPPORT.md

26 KiB
Raw Permalink Blame History

Rapport technique — Avatar 3D pour Kazeia

Face cloning, voice cloning, lip sync temps réel

2026-04-02


1. Vision

Kazeia est un compagnon de support émotionnel. L'avatar 3D donne un visage à ce compagnon :

  • Mode enfant : personnage stylisé (ours en peluche, mascotte) avec expressions et lip sync
  • Mode ado/adulte : visage humain photoréaliste reconstruit depuis une photo/vidéo de la personne ayant donné son consentement (thérapeute, proche, éducateur...)

L'avatar parle avec la voix clonée de cette même personne (voice cloning Qwen3-TTS), créant une expérience cohérente visage + voix.


2. Hardware cible

Composant Spec
Tablette OnePlus Pad 3 (OPD2415)
SoC Snapdragon 8 Elite (SM8750P)
Écran 12.1", 2400×3392, 144Hz, HDR10/DolbyVision, 420 dpi
GPU Adreno 830 — 100% libre (ML sur NPU/Hexagon)
RAM 12 GB (~8 GB disponibles après ML + OS)
NPU Hexagon (HMX FP16 via ggml-hexagon + HTP via QNN SDK)

Un visage affiché en gros plan sur cet écran fait ~2000×2000 pixels effectifs. La barre de qualité est haute.


3. Répartition des ressources

Hexagon NPU (HMX FP16):
  ├── TTS Talker (27ms/step)
  └── TTS Code Predictor (86ms/step)

Hexagon NPU (HTP via QNN):
  ├── TTS Decoder (3.5s, séquentiel après runners)
  ├── Whisper STT (~600ms)
  └── LLM Qwen3-0.6B (93 tok/s)

CPU:
  ├── Sampling, IPC, embeddings (trivial)
  ├── Silero VAD
  ├── MediaPipe Face Mesh (capture, ~5ms)
  └── OVRLipSync (~2ms)

GPU Adreno 830 (100% dédié avatar):
  ├── Rendu 3D avatar (50-80K vertices, <15% GPU)
  ├── Blendshape animation (52 shapes, 60fps)
  ├── PBR shading + subsurface scattering approximé
  └── Marge : >80% GPU libre

4. Protocole de capture — Séquence unique (~60 secondes)

Principe

Une seule séquence de capture sert 3 objectifs :

  1. Preuve légale de consentement (vidéo horodatée)
  2. Clonage vocal (extraction x-vector depuis l'audio)
  3. Création avatar (géométrie 3D, texture, calibration expressions)

Phase 1 — Rotation guidée (20s)

L'utilisateur tourne lentement la tête, guidé par un overlay face tracking (MediaPipe Face Mesh, 468 landmarks).

Captures automatiques aux angles détectés :

    ④              ②      ①      ③              ⑤
   60° gauche    30° G   FACE   30° D    60° droite
  • 5-7 photos pleine résolution (8-16 MP caméra frontale)
  • Expression neutre demandée
  • Pas de vidéo — photos nettes sans motion blur
  • Face tracking valide l'angle et la netteté avant déclenchement

Données extraites : géométrie 3D (multi-view FLAME fitting), texture UV côtés

Phase 2 — Vidéo de consentement (15s)

Texte affiché en mode prompteur. L'utilisateur lit face caméra :

"J'autorise l'application Kazeia à utiliser mon visage et ma voix, dans le cadre exclusif de cette application, pour créer mon avatar personnel."

Formulation choisie pour :

  • Durée ~6s (minimum pour x-vector fiable : 5s)
  • Phonèmes variés (voyelles : a/o/i/u/e, consonnes : k/z/p/l/v/d/m)
  • Clarté juridique (cadre exclusif, avatar personnel)

Données extraites :

  • Audio WAV 16kHz → extraction x-vector (1024 floats) pour voice cloning Qwen3-TTS
  • Preuve légale → vidéo horodatée, chiffrée, stockée sur l'appareil
  • Frames vidéo (~450 frames à 30fps) → sélection automatique des meilleurs frames :
    • Frame neutre → texture frontale haute résolution supplémentaire
    • Frames bouche ouverte → calibration visèmes personnalisés
    • Frames sourire naturel → calibration blendshape sourire

Phase 3 — Expressions guidées (10s)

5 expressions demandées rapidement, toujours frontal :

# Expression Ce qu'elle calibre
1 Neutre Référence de repos
2 Sourire (bouche fermée) Commissures, joues, pommettes
3 Bouche ouverte ("ah") Mâchoire, lèvres intérieures
4 Sourcils levés Front, paupières supérieures
5 Yeux fermés Paupières, cils

Données extraites : blendshapes personnalisés (pas les génériques FLAME)

Phase optionnelle — Gros plan iris (5s)

  • Capture rapprochée d'un oeil
  • Couleur et motif de l'iris pour des yeux réalistes
  • Les yeux sont le premier point de focalisation du regard

Conditions de capture

  • Éclairage : diffus, face à une fenêtre, pas de soleil direct ni flash
  • Fond : neutre (mur uni) pour faciliter la segmentation
  • Position : stable, tablette posée ou tenue à bout de bras
  • Même lumière pour toutes les phases (cohérence texture)

UX guidée

┌─────────────────────────────────────┐
│                                     │
│    ┌───────────────────────────┐    │
│    │    Caméra frontale         │    │
│    │                           │    │
│    │    Face tracking overlay   │    │
│    │    + cible de pose         │    │
│    │       ◎ ───►              │    │
│    │                           │    │
│    │    "Tournez la tête       │    │
│    │     vers la droite"       │    │
│    └───────────────────────────┘    │
│                                     │
│    ● ● ● ○ ○ ○ ○ ○ ○ ○   3/10    │
│                                     │
│    [Recommencer cette étape]        │
└─────────────────────────────────────┘

MediaPipe Face Mesh détecte en temps réel :

  • Angle de la tête (yaw/pitch/roll) → validation de pose
  • Expression faciale → validation avant capture
  • Netteté (variance du Laplacien) → rejet des frames floues

5. Pipeline de reconstruction 3D

5.1 Géométrie — FLAME multi-view fitting

5-7 photos angles + frames vidéo
         │
         ▼
   DECA / EMOCA (ResNet-50 backbone, ~25M params)
         │
         ▼
   Paramètres FLAME :
   ├── 300 shape params (identité : nez, mâchoire, pommettes...)
   ├── 50 expression params (blendshapes)
   └── Pose (rotation tête)
         │
         ▼
   Mesh FLAME brut : ~5K vertices
         │
         ▼
   Subdivision Catmull-Clark (2 passes)
         │
         ▼
   Mesh final : ~80K vertices, topology régulière
  • DECA inference : ~200ms sur GPU Adreno ou NPU (one-shot, une seule fois)
  • Multi-view fitting améliore significativement vs single-image : profondeur du nez, mâchoire, pommettes
  • La subdivision est offline (une fois) — ne rajoute pas de coût au rendu

5.2 Texture — Projection multi-vue + super-résolution

5-7 photos angles
         │
         ▼
   Projection UV par vue
   (chaque pixel photo → coordonnée UV sur le mesh)
         │
         ▼
   Blending multi-vue (pondéré par angle de vue)
         │
         ▼
   Texture UV 2048×2048 (données directes ~90%)
         │
         ▼
   Inpainting zones manquantes (<10% : dessous menton, intérieur oreilles)
         │
         ▼
   Super-résolution (Real-ESRGAN ou équivalent)
         │
         ▼
   Texture finale 4096×4096

Cartes additionnelles pour le photoréalisme :

  • Normal map : détail des pores (halluciné par ML depuis la texture diffuse, e.g. DECA detail map)
  • Roughness/specular map : zones brillantes (nez, front) vs mates (joues)
  • Subsurface scattering : paramètres peau génériques (difficile à capturer depuis tablette)

5.3 Blendshapes personnalisés

5 photos expressions + frames vidéo parole
         │
         ▼
   DECA/EMOCA par frame → 50 expression params
         │
         ▼
   Optimisation : ajuster les bases FLAME pour coller
   au visage spécifique (sourire de cette personne,
   pas le sourire "moyen" FLAME)
         │
         ▼
   52 blendshapes ARKit-compatibles personnalisés

Mapping FLAME → ARKit quasi 1:1 :

  • jawOpen, mouthClose, mouthFunnel, mouthPucker, mouthLeft/Right
  • eyeBlinkLeft/Right, browDownLeft/Right, browInnerUp
  • cheekPuff, cheekSquintLeft/Right
  • etc.

5.4 Yeux

  • Iris : texture extraite du gros plan (ou frame vidéo haute-res)
  • Sclera : blanc procédural avec veinules subtiles
  • Cornée : reflet spéculaire procédural (point lumineux)
  • Humidité : couche transparente réflective
  • Animation : saccades oculaires aléatoires, suivi regard (optionnel)

5.5 Cheveux

Approche pragmatique pour la v1 :

  • Carte alpha (billboard cards) suivant la forme détectée
  • Pas de rendu strand-level (trop coûteux, pas nécessaire pour un cadrage visage)
  • Couleur extraite de la photo
  • Alternative : cadrage serré (front → menton) qui évite le problème

6. Rendu temps réel

6.1 Unity as a Library (UaaL)

Unity embarqué dans l'app Android native via UaaL :

  • Export Android AAR depuis Unity
  • UnityPlayerActivity lancée depuis l'app Kotlin
  • Communication bidirectionnelle : UnitySendMessage (Java→C#) et AndroidJavaObject (C#→Java)

Contraintes :

  • Unity exige sa propre Activity (pas un Fragment)
  • Un seul player Unity actif à la fois
  • Lifecycle : pause/resume coordonné avec les autres composants

6.2 Specs rendu

Paramètre Valeur
Mesh 50-80K vertices, topology quad subdivisée
Texture diffuse 4096×4096
Normal map 2048×2048 (détail pores)
Roughness map 1024×1024
Blendshapes 52 (ARKit-compatible)
Shading PBR + subsurface scattering approx. (skin shader)
Target framerate 60fps (stabilité thermique pour sessions longues de 15-30 min)
Résolution rendu Natif 2400×3392 ou 80% avec upscale
Antialiasing MSAA 4x ou TAA
Éclairage 1 directionnelle + 1 ambient + IBL (image-based lighting)

Budget GPU estimé : <15% de l'Adreno 830 pour un seul personnage.

6.3 Style visuel

Approche photoréaliste en premier, fallback semi-stylisé si qualité insuffisante :

Pour le photoréalisme :

  • Skin shader avec subsurface scattering (pre-integrated SSS ou screen-space SSS)
  • Normal map pore-level
  • Specular lobe dual (peau grasse vs sèche)
  • Eye shader avec refraction cornée
  • Anti-aliasing agressif (les bords du visage à 3392px montrent tout)

Si le résultat tombe dans l'uncanny valley :

  • Passer en semi-stylisé (peau lissée, yeux légèrement agrandis, shader toon subtil)
  • Réduit les exigences de texture et de normal map
  • Plus chaleureux pour du support émotionnel

7. Lip sync

7.1 Pipeline

TTS Qwen3-TTS → Audio PCM 24kHz
        │
        ▼
  OVRLipSync (Meta, Android NDK)
  ou uLipSync (Unity, plus léger)
        │
        ▼
  15 visèmes Oculus → mapping vers 52 blendshapes ARKit
        │
        ▼
  Interpolation cubique Hermite (pas linéaire)
        │
        ▼
  Coarticulation (lookahead 2-3 frames)
        │
        ▼
  Blendshape weights à 60fps → SkinnedMeshRenderer Unity

7.2 Qualité lip sync sur grand écran

Les lèvres font ~300px de large à plein écran. Exigences :

  • 52 blendshapes ARKit (pas seulement 15 visèmes) — lèvres supérieure/inférieure/gauche/droite indépendantes
  • 60fps de mise à jour des poids (pas 30 — les transitions sont visibles sur 144Hz)
  • Interpolation cubique Hermite entre keyframes — le linéaire donne un effet robotique
  • Coarticulation : le shape de la bouche pour "ba" dépend de la voyelle suivante. 2-3 frames de lookahead dans le buffer audio

7.3 Mapping visèmes → blendshapes

Les 15 visèmes OVR se décomposent en mouvements de blendshapes multiples :

Visème OVR Blendshapes ARKit activés
PP (p/b/m) mouthClose + mouthPucker
FF (f/v) mouthFunnel + jawOpen(0.1)
TH (th) tongueOut + jawOpen(0.2)
AA (a) jawOpen(0.6) + mouthWideLeft/Right
OO (ou) mouthPucker + mouthFunnel + jawOpen(0.3)
EE (i/e) mouthSmileLeft/Right + jawOpen(0.2)
... ...

Chaque visème active 2-5 blendshapes avec des poids différents → résultat plus riche que 15 shapes binaires.


8. Expressions émotionnelles

8.1 Émotions depuis le LLM

Le LLM Qwen3-0.6B tagger ses réponses avec des émotions inline, y compris au milieu des phrases :

Prompt système :
"Insère des tags d'émotion [joie], [tristesse], [empathie], [encouragement],
[neutre], [surprise] dans ta réponse quand l'émotion change."

Réponse LLM :
"[empathie] Je comprends que cette situation soit difficile.
[encouragement] Mais tu as déjà fait un grand pas en en parlant.
[joie] C'est vraiment courageux de ta part."

L'app parse les tags au fil du texte. Chaque tag déclenche une transition d'expression sur l'avatar synchronisée avec le TTS — l'émotion change au moment où la phrase correspondante est prononcée, pas avant.

8.2 Mapping émotion → expressions faciales

Émotion LLM Blendshapes dominants Intensité
joie mouthSmile + cheekSquint + eyeSquint 0.6-0.8
tristesse browInnerUp + mouthFrown + eyeWide(0.1) 0.4-0.6
empathie browInnerUp(0.3) + mouthSmile(0.2) + headTilt 0.3-0.5
encouragement browUp + mouthSmile(0.5) + nod 0.5-0.7
surprise eyeWide + browUp + jawOpen(0.3) 0.5-0.7
neutre repos + micro-expressions 0.0-0.1

Les expressions se blendent avec le lip sync — l'avatar peut sourire tout en parlant.

8.3 Transitions

  • Transition entre émotions : ease-in-out sur 500ms (pas de snap brutal)
  • L'émotion s'applique sur la durée de la phrase TTS
  • Les micro-expressions (léger sourire, haussement de sourcils) ajoutent du naturel

9. Idle animations — L'avatar vivant

Un avatar figé quand il ne parle pas = immédiatement "mort". Animations subtiles obligatoires :

Animation Fréquence Amplitude
Clignement des yeux Aléatoire, ~15-20/min Naturel (rapide : 150ms)
Micro-saccades oculaires Continu, 2-3/s ±2° aléatoire
Respiration Continue, ~16/min Léger mouvement épaules/poitrine
Micro-expressions Aléatoire, toutes les 3-8s Très subtil (0.02-0.05)
Mouvement tête Lent, continu ±2° drift aléatoire

Ces animations sont procédurales (pas des clips) — elles se blendent naturellement avec le lip sync et les émotions.


10. Mode enfant

Pipeline simplifié

Asset pré-fait (ours en peluche .glb)
  ├── Mesh : 10-20K vertices
  ├── 15-20 blendshapes (visèmes + sourire + triste + surprise)
  ├── Texture : stylisée, pré-faite
  └── Rig : squelette simple (tête + corps)
         │
    Même pipeline lip sync + émotions
         │
    Pas de capture nécessaire
  • Pas de reconstruction faciale
  • Pas de voice cloning (voix synthétique par défaut ou voix pré-enregistrée)
  • L'ours en peluche fait les mêmes expressions et lip sync que l'avatar humain
  • Premier livrable pour valider le pipeline complet avant le mode adulte

11. Multi-utilisateurs et profils

Modèle de profils

Un profil = un avatar (visage + voix). Un utilisateur = une personne qui utilise Kazeia.

Profil "Dr. Martin"
  ├── Avatar 3D (mesh, texture, blendshapes)
  ├── X-vector voix
  ├── Vidéo consentement
  └── Permissions :
       ├── Utilisateur: Léa (autorisé)
       ├── Utilisateur: Hugo (autorisé)
       └── Mode: multi-utilisateur (autorisé par Dr. Martin)

Profil "Maman de Léa"
  ├── Avatar 3D + voix
  └── Permissions :
       └── Utilisateur: Léa uniquement (mono-utilisateur)

Règles

  • Création : la personne filmée crée le profil et donne son consentement
  • Mono-utilisateur (par défaut) : le profil n'est utilisable que par un seul utilisateur désigné
  • Multi-utilisateur : la personne doit explicitement autoriser le partage lors du consentement
    • Phrase modifiée : "...pour un usage partagé avec les utilisateurs que j'autorise"
  • Révocation : la personne peut révoquer son profil à tout moment (suppression avatar + voix, vidéo consentement conservée)
  • Pas de transfert : un profil ne peut pas être copié vers un autre appareil (lié au device)

Stockage profils

/data/data/com.kazeia/profiles/
  ├── profile_001/
  │    ├── consent_video.enc      (chiffré, non supprimable)
  │    ├── avatar_mesh.enc        (chiffré)
  │    ├── avatar_texture.enc     (chiffré)
  │    ├── avatar_blendshapes.enc (chiffré)
  │    ├── speaker_xvector.enc    (chiffré)
  │    └── metadata.json          (permissions, utilisateurs autorisés)
  └── profile_002/
       └── ...

12. Mode dégradé

Si la personne ne souhaite pas un avatar photoréaliste de son visage :

Option Description Voix
Semi-stylisé Son visage mais en style 3D animation (Pixar-like) Sa voix clonée
Avatar générique Visage prédéfini parmi un catalogue Sa voix clonée
Personnage Ours en peluche ou autre mascotte Sa voix clonée
Voix seule Pas d'avatar, écran avec animation abstraite Sa voix clonée

Le choix est fait lors de la création du profil. Le voice cloning reste disponible dans tous les modes (seul le visuel change).

Le style semi-stylisé utilise le même pipeline de capture mais applique un style transfer au rendu :

  • Peau lissée (pas de pores)
  • Yeux légèrement agrandis
  • Proportions adoucies
  • Shader toon subtil au lieu de PBR réaliste

13. Mise à jour du profil

L'utilisateur ou la personne du profil peut mettre à jour les photos :

  • Ajout de photos : nouvelles vues → amélioration texture + géométrie
  • Changement d'apparence : lunettes, coupe de cheveux → re-capture partielle
  • Vieillissement : re-capture complète tous les X mois si souhaité
  • Process : même protocole de capture (phase 1 + 3), pas besoin de re-filmer le consentement
  • Versioning : l'ancien avatar est conservé jusqu'à validation du nouveau

14. Simultanéité TTS + Avatar

L'avatar et le TTS travaillent ensemble en temps réel :

Timeline d'une réponse Kazeia :

t=0s    LLM génère texte + tag émotion
t=0.1s  Avatar reçoit émotion → transition expression (500ms ease-in)
t=0.1s  TTS démarre génération (Hexagon NPU)
t=6s    Génération terminée → hexStopRunner()
t=6.5s  QNN decode audio (3.5s)
t=10s   Audio prêt → AudioTrack.play()
        → OVRLipSync analyse en temps réel
        → Blendshape weights envoyés à Unity à 60fps
        → Avatar parle avec lip sync + émotion
t=14s   Audio terminé → avatar retour idle (ease-out 500ms)

Pas de streaming pour l'instant (conflit DSP hexagon/QNN). L'avatar affiche l'émotion et les idle animations pendant la génération TTS, puis commence le lip sync quand l'audio est prêt.

Le lip sync est synchrone avec l'audio — Unity lit le même buffer PCM que AudioTrack.


15. Consentement et données personnelles

Stockage sur l'appareil

Donnée Taille Chiffré Supprimable Durée
Vidéo consentement ~30 MB AES-256 Non (preuve légale) Permanent
Photos capture ~50 MB Non (temp) Supprimées après traitement ~2 min
Audio brut ~1 MB Non (temp) Supprimé après extraction x-vector ~1 min
X-vector voix 4 KB AES-256 Oui (supprime avatar) Tant que avatar existe
Mesh avatar ~5 MB AES-256 Oui Tant que avatar existe
Texture avatar ~15 MB AES-256 Oui Tant que avatar existe
Blendshapes ~2 MB AES-256 Oui Tant que avatar existe

Principes RGPD

  • Rien ne quitte l'appareil — tout le traitement est on-device
  • Consentement explicite — vidéo avec déclaration orale comme preuve
  • Droit à l'effacement — l'utilisateur peut supprimer son avatar (sauf vidéo consentement)
  • Minimisation — photos et audio brut supprimés dès que traités
  • Pas de biométrie stockée — le x-vector seul ne permet pas de reconnaître une voix (vecteur de 1024 dimensions, non réversible)

16. Architecture d'intégration

┌─────────────────────────────────────────────────────┐
│                    App Kazeia                        │
│                                                     │
│  ┌──────────────────┐    ┌───────────────────────┐  │
│  │  ChatActivity     │    │  UnityPlayerActivity  │  │
│  │  (Conversation)   │◄──►│  (Avatar 3D)          │  │
│  │                   │    │                       │  │
│  │  - Chat UI        │    │  - Rendu avatar       │  │
│  │  - Contrôles      │    │  - Blendshape anim.   │  │
│  │  - État session    │    │  - Lip sync           │  │
│  └───────┬──────────┘    │  - Idle anims          │  │
│          │               │  - Émotions            │  │
│          │               └───────┬───────────────┘  │
│          │                       │                   │
│  ┌───────▼───────────────────────▼───────────────┐  │
│  │              KazeiaService                     │  │
│  │                                                │  │
│  │  Whisper STT (NPU) → LLM Qwen3 (NPU)          │  │
│  │       → TTS Qwen3 (Hexagon + QNN)              │  │
│  │                                                │  │
│  │  Events émis :                                 │  │
│  │  ├── onTtsAudioChunk(pcm) → lip sync           │  │
│  │  ├── onEmotion(tag) → expression avatar        │  │
│  │  ├── onSpeechStart() → avatar attentif         │  │
│  │  └── onSpeechEnd() → avatar retour idle        │  │
│  └────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────┘

Communication KazeiaService ↔ Unity

  • Java → C# : UnityPlayer.UnitySendMessage("AvatarController", "OnEmotion", "joie")
  • Audio → lip sync : SharedMemory ou AudioTrack partagé — Unity lit le même buffer audio
  • C# → Java : callback via AndroidJavaObject pour les événements Unity (avatar ready, etc.)

17. Phases d'implémentation

Phase 1 — Proof of concept (2-3 semaines)

  • Projet Unity avec UaaL export Android
  • Asset ours en peluche avec 15 blendshapes
  • Lip sync basique (OVRLipSync ou uLipSync)
  • Intégration dans kazeia-android (UnityPlayerActivity)
  • Bridge : audio TTS → lip sync Unity
  • Idle animations (clignements, respiration)

Livrable : ours en peluche qui parle avec lip sync depuis le TTS Kazeia

Phase 2 — Face cloning (3-4 semaines)

  • UI de capture guidée (MediaPipe Face Mesh)
  • Vidéo consentement + extraction audio
  • Voice cloning : extraction x-vector, remplacement de l'embedding
  • DECA/EMOCA inference on-device
  • Multi-view FLAME fitting
  • Subdivision mesh + projection texture UV
  • Super-résolution texture
  • Export mesh + blendshapes vers Unity

Livrable : avatar personnalisé depuis selfies, voix clonée

Phase 3 — Photoréalisme (2-3 semaines)

  • Skin shader PBR + subsurface scattering
  • Normal map pore-level
  • Eye shader (iris, cornée, reflets)
  • Cheveux (cards alpha ou cadrage serré)
  • Émotions LLM → expressions faciales
  • Blending émotions + lip sync
  • Polish : micro-expressions, transitions fluides

Livrable : avatar photoréaliste avec expressions émotionnelles

Phase 4 — Polish et optimisation (1-2 semaines)

  • Profiling GPU (vérifier budget <15%)
  • Optimisation mémoire (LOD, texture streaming)
  • Gestion lifecycle Unity ↔ Android robuste
  • Chiffrement données avatar
  • UI de gestion avatar (créer, supprimer, changer)
  • Test uncanny valley → décision photoréaliste vs semi-stylisé

18. Risques et mitigations

Risque Impact Mitigation
Uncanny valley (visage réaliste mal animé) Rejet utilisateur Fallback semi-stylisé préparé en parallèle
Texture basse qualité depuis caméra frontale Avatar flou en gros plan Super-résolution + normal map halluciné
DECA insuffisant pour photoréalisme Géométrie approximative Multi-view fitting + calibration expressions
UaaL lifecycle complexe Crashs, fuites mémoire Isolation stricte, tests intensifs
Lip sync saccadé sur grand écran Effet robotique 52 blendshapes + cubique Hermite + 60fps
Cheveux difficiles à rendre Apparence artificielle Cadrage serré (front→menton) pour v1
Taille APK Unity (+40-80 MB) Download lourd Asset bundles, chargement à la demande
Performance GPU inattendue Framerate bas Budget large (15% estimé), marge 85%

19. Résumé

Aspect Choix
Moteur 3D Unity (UaaL) embarqué dans app Android native
Capture 10 photos guidées + vidéo consentement (~60s)
Reconstruction DECA/FLAME multi-view → 80K vertices subdivisé
Texture Projection multi-vue 4096×4096 + super-résolution
Blendshapes 52 ARKit-compatibles, personnalisés par expressions
Lip sync OVRLipSync → 52 blendshapes, interpolation cubique, 60fps
Émotions Tag LLM → expressions faciales blendées avec lip sync
Voice cloning X-vector extrait de la vidéo de consentement
Style Photoréaliste (fallback semi-stylisé si uncanny valley)
Mode enfant Asset pré-fait (ours en peluche), même pipeline lip sync
Données 100% on-device, chiffré, RGPD-compatible
GPU Adreno 830, <15% utilisé, 100% dédié avatar