# GAB-071 · StoryAudioNarratorScene — « Scène narrée (audio + transcript) »

**Archétype / renderer_key :** `media_viewer` (cartographie) · **module :** EdTechStoryLearning
**renderer_key à concevoir (pas de moteur kit)** : aucun moteur kit de référence n'existe pour `media_viewer` — le renderer est dérivé directement de l'écran source (`INDEX-300-storylearning-GAB-070-073-PLAYABLE.html`, stage `data-tpl="71"`).
**Critère validé :** changer le JSON change le titre, le persona, le transcript et la source audio sans modifier le HTML.

## Pack (structure officielle par-GAB)
```
GAB-071/
  renderer.html            ← moteur scène narrée (ne pas modifier par instance)
  instance.example.json    ← SOURCE DE VÉRITÉ (contenu réel, à plat)
  schema.contract.json     ← contrat de validation
  README-contract.md       ← ce fichier
```

## Champs requis (instance, à plat)
`gab_id` · `scene_id` · `transcript`

Optionnels : `title`, `body`, `persona{name,avatar,role}`, `audio_src`, `accessibility{transcript_always_visible,fallback}`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre affiché, texte d'introduction (`body`), identité du narrateur (`persona`), texte narré + lu (`transcript`), source audio (`audio_src`).
- **HTML** : layout de la carte, player avec waveform animée, zone transcript, logique TTS fallback (Web Speech API), logique play/pause.

## Archétype
Scène narrative d'une Story avec narration audio enrichissant la lecture. Le transcript est **toujours affiché** — c'est à la fois la source pour le TTS (si `audio_src` absent/null) et le fallback accessibilité.

## Garde-fous
- **transcript OBLIGATOIRE et toujours visible** : audio sans transcript est interdit (spec source ligne 278 : "audio sans transcript (interdit)").
- **audio_src peut être absent** : le moteur active alors la Web Speech API sur le transcript. En production, fournir une URL audio réelle.
- **BLOCKED** si `transcript` absent/vide ou `scene_id` absent.
- **persona optionnel** : si absent, la zone narrateur est masquée sans crash.

## _TODO / Contenus manquants
- **`audio_src`** : la source HTML utilise la Web Speech API (TTS navigateur) sans fichier audio réel. En production, ce champ doit recevoir une URL vers un fichier audio (mp3/ogg/wav) ou rester `null` pour maintenir le fallback TTS.

## QA à vérifier
1. Modifier `transcript` → texte du player change sans toucher au HTML (critère d'or).
2. `transcript` absent → BLOCKED propre, carte cachée.
3. `audio_src` null/absent → fallback TTS actif, waveform animée.
4. `persona` absent → zone narrateur masquée, pas de crash.
5. Bouton play/pause → toggle correct.
6. Responsive 375/768/1024 → 0 débordement.
7. `prefers-reduced-motion` → animation waveform réduite.

## external_refs / dependencies
- **Lot parent** : `LOT-storylearning-GAB-070-073` (GAB-070, GAB-072, GAB-073).
- **Web Speech API** : dépendance navigateur pour le fallback TTS (Chrome/Edge/Safari) — ne nécessite aucune lib externe.

## Source
`INDEX-300-storylearning-GAB-070-073-PLAYABLE.html` (stage `data-tpl="71"`, handlers `audToggle`, `audStop`, constante `AUD_TXT`).
