# Plan de test — Studio lots 6 à 8 (mention IA, calibrage, narration) > Écrit le 2026-09-15, pour une première passe le 16/09. **Rien de ce plan n'a encore tourné en réel** : > tout est couvert par des tests unitaires (353 verts côté service) et l'analyse Flutter / TypeScript, mais > aucun écran n'a été affiché et aucun audio n'a été généré. Les résultats viennent de Thomas, pas du code. > > Légende : colonne ✓ à remplir (✅ / ❌ + une note). Un ❌ dans § 0 arrête la suite. > Référence : [v2/studio-plan.md](v2/studio-plan.md) § 9.4 (calibrage) et lot 8. --- ## 0. Prérequis — une fois | # | Étape | Attendu | ✓ | |---|---|---|---| | 0.1 | `winget install Gyan.FFmpeg`, rouvrir le terminal, `ffmpeg -version` | Une version s'affiche. Sans ffmpeg, la génération audio échoue et les crédits sont remboursés | | | 0.2 | `dotnet user-secrets set "AI:ApiKey" "" --project manager-service/ManagerService` | `dotnet user-secrets list` montre `AI:ApiKey` (et `Studio:Fal:Key`) | | | 0.3 | Lancer Postgres puis `dotnet ef database update` avec `MIGRATIONS_CONNECTION` (voir la note mémoire EF) | Migrations appliquées : `AddAiWatermarkBurned`, `StudioCalibrationEngravingStyle`, `StudioCreditUnitPerReference`, `AddNarrators`, `AddGeoPointAudio` | | | 0.4 | `dotnet run` (manager-service), `flutter run -d chrome` (manager-app) | Les deux démarrent, connexion SuperAdmin OK | | | 0.5 | Dialogue d'instance (SuperAdmin) : assistant **et** Studio activés, **100 crédits** accordés | Solde 100 dans la jauge du menu | | | 0.6 | Guide IA › Personnages : un personnage **Léon** avec une **voix** (Umbriel) et une intonation, un second **La sentinelle** avec une autre voix (Kore) | Les deux apparaissent dans la liste, sans « (sans voix) » | | | 0.7 | Donner un **portrait** à Léon (onglet Visage → générer ou choisir une vue Portrait) | La vue Portrait est enregistrée | | --- ## 1. Mention IA dans le fichier (lot 6) | # | Étape | Attendu | ✓ | |---|---|---|---| | 1.1 | Studio : générer une image et la **valider** | L'image arrive dans la médiathèque avec la facette IA | | | 1.2 | Télécharger le fichier validé, l'ouvrir dans un lecteur de métadonnées (ex. exiftool, ou Propriétés › Détails) | XMP `DigitalSourceType = trainedAlgorithmicMedia`, droits = nom de l'instance | | | 1.3 | Dialogue d'instance : cocher **Graver la mention IA**, générer et valider une nouvelle image | Bandeau « Généré par IA · AI-generated » en bas à droite de l'image. L'ancienne image n'a pas changé | | | 1.4 | ⚠️ Enregistrer l'instance **depuis un autre écran** (ex. Abonnement) | La case gravure reste cochée : un enregistrement qui ne l'envoie pas ne la remet pas à faux | | | 1.5 | Décocher la gravure | Les images suivantes n'ont plus de bandeau | | --- ## 2. Calibrage et unité de crédit | # | Étape | Attendu | ✓ | |---|---|---|---| | 2.1 | Studio › Identité : ouvrir la grille des styles | **8 tuiles avec un moulin**, un style chacune (plus aucune tuile vide) | | | 2.2 | Guide IA › Personnages › Visage : grille des archétypes | **12 mannequins au trait**, un par pose | | | 2.3 | Générer 3 variantes **sans image de référence** | Estimation et débit = **6 crédits** (2 par image) | | | 2.4 | Ajouter 3 images de référence à l'identité, relancer 3 variantes | Estimation = **15 crédits** (3 × (2 + 3)) | | | 2.5 | Style Gravure, gabarit « Décor d'énigme », 3 variantes | Images **noir et blanc**, **aucune légende ni signature** (c'était ~4/10 avant correction) | | | 2.6 | Gabarit « Objet d'époque » depuis une photo d'objet **portant une date** | La date reste gravée sur l'objet | | | 2.7 | Relire les planches `outputs/studio-calibrage-2026-09-15/` | Ton verdict « du même projet » par série, à reporter dans studio-plan § 9.4 | | --- ## 3. Qui raconte quoi (lot 8a et 8c) Préparer une configuration avec un **parcours de 4 étapes** (titre + description remplis en FR et NL) et un **article** avec du texte. | # | Étape | Attendu | ✓ | |---|---|---|---| | 3.1 | Écran Configuration : carte **Narration** visible | Deux champs : « Guide de cette visite » et « Narrateur par défaut de la visite » | | | 3.2 | Guide de la visite = *Guide de l'instance*, narrateur par défaut = *Le guide raconte*, **Enregistrer** | Enregistré ; recharger l'écran garde les valeurs | | | 3.3 | Ouvrir le parcours : dans le rail, une entrée **Narrateurs** sous « Parcours » | L'onglet s'ouvre, une ligne par étape | | | 3.4 | Sans rien choisir | Chaque étape affiche en gris « ↳ » + le guide de l'instance, ou « Aucun narrateur » s'il n'y en a pas | | | 3.5 | Narrateur par défaut du parcours = **Léon** | Toutes les lignes passent à « ↳ Léon » en gris | | | 3.6 | Étape 3 : choisir **La sentinelle** | La ligne 3 affiche La sentinelle **en gras** ; les autres restent « ↳ Léon » | | | 3.7 | Fermer et rouvrir le parcours | Le choix de l'étape 3 et le défaut sont conservés | | | 3.8 | **Toutes les étapes suivent le défaut** | Confirmation « Retirer le narrateur choisi sur 1 étape(s) ? », puis l'étape 3 repasse à « ↳ Léon » | | | 3.9 | Remettre La sentinelle sur l'étape 3 (pour la suite) | — | | | 3.10 | ⚠️ Archiver La sentinelle (Personnages) puis revenir à l'onglet | L'étape 3 retombe sur « ↳ Léon » : un personnage archivé ne parle plus | | | 3.11 | Désarchiver La sentinelle | L'étape 3 la retrouve | | | 3.12 | Instance **sans Studio** (décocher dans le dialogue) | L'entrée Narrateurs disparaît du rail et le bloc Narration de l'article aussi. Réactiver ensuite | | --- ## 4. Générer l'audio (lot 8b et 8c) | # | Étape | Attendu | ✓ | |---|---|---|---| | 4.1 | Onglet Narrateurs : colonne Audio | « 2 à générer · N crédits » par étape (FR + NL) ; barre du bas « X fichier(s) audio à générer · Y crédits » | | | 4.2 | **Générer l'audio** | Confirmation qui répète le total. Rien ne part avant « Oui » | | | 4.3 | Confirmer | Notification « Génération lancée » ; en moins d'une minute les lignes passent à **Audio à jour** sans rien toucher (relecture toutes les 5 s) | | | 4.4 | Jauge de crédits | Débit ≈ **1 crédit par minute d'audio par langue**, jamais plus que l'estimation affichée | | | 4.5 | Médiathèque, filtre Audio | Un MP3 par étape et par langue, libellé « Léon · titre (FR) », facette IA | | | 4.6 | Écouter un MP3 (étape 3) | Voix de **La sentinelle**, dans la bonne langue, avec l'intonation du personnage | | | 4.7 | ⚠️ **Piège corrigé** : modifier le **titre** d'une étape juste après la génération, attendre l'enregistrement, rouvrir | L'audio de l'étape est **toujours rattaché** (avant correction, l'enregistrement le détachait) | | | 4.8 | Revenir à l'onglet Narrateurs | L'étape modifiée est « 2 à régénérer » : son texte a changé | | | 4.9 | Changer la voix de Léon (Personnages › Voix) | Toutes les étapes de Léon passent « à régénérer » ; celle de La sentinelle reste à jour | | | 4.10 | Régénérer | L'ancien MP3 **disparaît** de la médiathèque, le nouveau le remplace | | | 4.11 | Étape avec un **audio déposé à la main** en FR, puis générer FR | L'audio généré prend sa place dans l'étape, **le fichier déposé reste** dans la médiathèque | | | 4.12 | Article : bloc **Narration audio** sous les réglages audio | Narrateur « ↳ Léon » (hérité), état, bouton Générer | | | 4.13 | Article : générer, puis **Enregistrer** la section après le passage à « Audio à jour » | L'audio reste sur l'article après rechargement | | | 4.14 | Personnage **sans voix** en narrateur, Générer | Message « Ce narrateur n'a pas de voix », aucun crédit réservé | | | 4.15 | Solde à 0, Générer | Message « Crédits Studio insuffisants » | | | 4.16 | Couper le réseau du **serveur** vers Gemini (ou mauvaise clé), Générer | Les lignes ne passent jamais à jour, et les crédits réservés sont **remboursés** (jauge) | | --- ## 5. Côté visiteur — le portrait du narrateur (lot 8d) Même configuration, avec l'audio généré en § 4. Léon a un portrait, La sentinelle non. | # | App | Étape | Attendu | ✓ | |---|---|---|---|---| | 5.1 | visitapp-web | Ouvrir l'**article** | Le lecteur audio joue ; à la place de « GUIDE AUDIO », **portrait + « Léon »** | | | 5.2 | visitapp-web | Parcours **en liste**, étapes 1 et 3 | L'audio **joue** (avant, un audio rangé par identifiant n'avait pas de lecteur) ; portrait de Léon à l'étape 1, disque neutre + « La sentinelle » à l'étape 3 | | | 5.3 | visitapp-web | Parcours **en carte** (`showMap`) | Même chose dans la vue carte | | | 5.4 | visitapp-web | Changer la langue en NL | L'audio NL joue, même narrateur | | | 5.5 | mymuseum-visitapp (en ligne) | Article | Lecteur replié à droite ; déplié, le **portrait** ouvre la ligne | | | 5.6 | mymuseum-visitapp (en ligne) | Parcours, vue contenu **et** vue carte | L'audio de l'étape joue, portrait + nom au-dessus du lecteur | | | 5.7 | mymuseum-visitapp (**hors ligne**) | Article téléchargé, mode avion | L'audio joue ; **pas de portrait** (limite connue, il n'est pas téléchargé) | | | 5.8 | tablet-app | Article | Portrait + nom à gauche du bouton de lecture | | | 5.9 | Les trois | Un audio **déposé à la main** (pas une narration) | Lecteur habituel, **aucun** portrait | | | 5.10 | Les trois | Une ancienne étape dont l'audio est une **URL** | L'audio joue toujours | | --- ## 6. Non-régression | # | Étape | Attendu | ✓ | |---|---|---|---| | 6.1 | Guide IA (assistant) : poser une question sur un contenu dont le **titre** contient du gras ou un `&` | Réponse normale, titre cité sans balises ni `&` (le nettoyage HTML de l'assistant est désormais partagé avec la narration) | | | 6.2 | Image générée côté visiteur | Mention « Image générée par IA » toujours présente (lot 6) | | | 6.3 | Enregistrer un article **sans** toucher à la narration | Rien ne change dans ses audios | | | 6.4 | Modifier un point de carte dans l'ancienne fenêtre | Enregistrement OK ; son audio éventuel n'est pas effacé | | --- ## Limites connues (pas des bugs) - Les **points de carte** n'ont pas encore d'assignation de narrateur ni de bouton Générer dans le manager. - Hors ligne, mymuseum-visitapp ne montre pas le portrait. - Le portrait affiché est le portrait **actuel** du personnage ; le nom et la voix sont ceux de l'audio entendu. - Les extraits d'écoute des voix (lot 7) ne sont pas encore produits.