kazeia/AVATAR_3D_RAPPORT.md

692 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 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é (frontmenton) 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 |