# GAB-166 · AudioIntroPlayer — « Lecteur audio d'intro »

**Archétype / renderer_key :** `media_viewer` (cartographie) · **module :** EdTechAudioLearning
**Note :** `renderer_key = media_viewer` → pas de moteur kit de référence existant ; renderer dérivé de l'écran source lui-même.
**Critère validé :** changer le JSON change le rendu sans modifier le HTML. ✅ check.py 12/12.

## Pack (structure officielle par-GAB)
```
GAB-166/
  renderer.html            ← moteur lecteur audio intro (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` · `audio_intro_id` · `title` · `instruction` · `audio_src` · `transcript`

Optionnels : `audio_lang`, `audio_rate`, `duration_label`, `transcript_label`, `transcript_required`, `banner_text`, `accessibility{...}`, `child_safety{...}`.

## Ce qui vient du JSON vs HTML
- **JSON** : titre du chapitre, instruction, texte du banner, transcript intégral, langue/vitesse audio, durée affichée.
- **HTML** : structure player (bouton, wave-bars, timer), section transcript, états played/paused, fallback Web Speech API.

## Garde-fous (child_safety + doctrine module)
- **Transcript OBLIGATOIRE** — doctrine MODULE 9 : « TRANSCRIPT TOUJOURS visible/disponible ». BLOCKED si absent.
- **Pas d'enregistrement, pas de transmission** — ce GAB est lecture seule (RGPD mineurs).
- **audio_src `_TODO`** : si l'URL audio réelle n'est pas fournie, le renderer affiche un warning et utilise Web Speech API (simulation) — jamais de crash silencieux.
- **BLOCKED** si `title` absent, `transcript` absent/vide, ou `audio_intro_id` absent.

## _TODO (contenus manquants dans la source)
- `audio_src` : la source HTML utilise Web Speech API comme simulation — aucune URL de fichier audio réel n'est présente. À fournir lors de l'intégration pédagogique réelle (mp3/ogg/wav).

## QA à vérifier
1. Modifier `title`/`transcript`/`instruction` → rendu change sans toucher au HTML.
2. `transcript:""` → BLOCKED propre.
3. `title` absent → BLOCKED propre.
4. Bouton ▶/⏸ → toggle correct, wave s'anime/s'arrête.
5. `audio_src="_TODO:..."` → warning visible, pas de crash.
6. Instance externe injectée via `ENGINE.init(ext)` → rendu change.
7. Responsive 375/768/1024 px.

## Source
`INDEX-300-audiolearning-GAB-166-170-PLAYABLE.html` (stage `data-tpl="166"`, handler `audToggle('ip', IP_TXT)`).
Contenu extrait : `IP_TXT` (transcript), titre `.ip-title`, instruction `.ip-sub`, banner `.aud-banner`, durée `.aud-time`.

## external_refs / dependencies
- **GAB-071** : narration Ketty story (ne pas confondre avec ce GAB — usage intro chapitre uniquement).
- **GAB-134** : audio dans exercice noté (ne pas utiliser GAB-166 pour évaluation officielle).
- Module **EdTechAudioLearning** — canon PART-09A (slots : title/audio/transcript/duration/instruction).
