26 KiB
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 :
- Preuve légale de consentement (vidéo horodatée)
- Clonage vocal (extraction x-vector depuis l'audio)
- 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/RighteyeBlinkLeft/Right,browDownLeft/Right,browInnerUpcheekPuff,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
UnityPlayerActivitylancée depuis l'app Kotlin- Communication bidirectionnelle :
UnitySendMessage(Java→C#) etAndroidJavaObject(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
AndroidJavaObjectpour 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 |