DOCS/test-plan-studio-narration.md
Thomas Fransolet 78517cb38f Studio : lot 8e ajouté au plan, STATUS, kanban et plan de test à jour
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011VxSQeGQYUvPmSEoGdnidA
2026-09-15 23:00:46 +02:00

14 KiB
Raw Permalink Blame History

Plan de test — Studio lots 6 à 8 (mention IA, calibrage, narration, casting)

É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 (357 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 § 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" "<clé Gemini>" --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, AddCasting
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.12b Carte : réglages de la section, Narrateur par défaut des points = La sentinelle, enregistrer la section Chaque fiche de point affiche « ↳ La sentinelle » dans son bloc Narration audio
4.12c Carte : ouvrir un point, choisir Léon dans son bloc Narration audio Le point s'enregistre seul ; moins d'une seconde après, l'état se relit (Léon, « à générer »)
4.12d Carte : générer l'audio d'un point, puis modifier son titre L'audio reste rattaché au point après rechargement ; l'état passe « à régénérer »
4.12e web : ouvrir ce point sur la carte Lecteur audio en tête de la fiche, portrait + nom du narrateur au-dessus (lot 8e)
4.12f mymuseum-visitapp : ouvrir ce point Lecteur audio au-dessus de la description, portrait + nom
4.12g tablet-app : ouvrir ce point Portrait + nom à gauche du bouton de lecture
4.12h Les trois : langue sans audio pour ce point Pas de lecteur sur mobile et tablette (pas de repli de langue) ; le web retombe sur la première langue, comme pour l'article
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

5bis. Casting — « les personnes que vous allez rencontrer » (lot 8bis)

Migration supplémentaire à appliquer : AddCasting. Même configuration qu'en § 3 (Léon et La sentinelle avec portrait, ajouter La cuisinière sans portrait comme narratrice d'une étape).

# App Étape Attendu
5b.1 manager Configuration sans aucun narrateur ni guide Carte « Personnages de la visite » : « Aucun personnage ne raconte cette visite »
5b.2 manager Seul le guide (Léon) raconte « Léon raconte toute cette visite (le guide) », ni liste ni interrupteur
5b.3 manager Étape 3 = La sentinelle, étape 4 = La cuisinière Liste de 3 : Léon en gris « ↳ » (hérité), les deux autres en gras, avec « N étape(s) » ; ordre = ordre d'apparition dans la visite
5b.4 manager Ligne La cuisinière « Pas de portrait : ne peut pas être montré », case grisée
5b.5 manager Réordonner (glisser La sentinelle en tête), décocher Léon, armer « Présenter les personnages au visiteur », Enregistrer, recharger Ordre, cases et interrupteur conservés
5b.6 manager Toucher l'ordre puis Annuler Retour à l'état enregistré
5b.7 web Ouvrir la visite (Léon décoché) Pas d'écran d'entrée : un seul portrait montré
5b.8 manager + web Recocher Léon, enregistrer, rouvrir la visite (attendre ~1 min, cache) Écran d'entrée : La sentinelle puis Léon, portraits ronds, bouton « Commencer la visite »
5b.9 web Fermer, revenir à la liste des sections L'écran ne revient pas dans la même session ; un nouvel onglet le remontre
5b.10 web Passer en NL Titre « De personen die u zult ontmoeten »
5b.11 mymuseum-visitapp Ouvrir la visite Même écran, une fois par lancement de l'app
5b.12 tablet-app Charger la configuration Même écran au chargement
5b.13 manager Désarmer l'interrupteur, enregistrer Plus aucun écran d'entrée sur les trois apps

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 &amp; (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.