Petit atelier à venir sur le Live Bloging
Découvrez comment couvrir des conférences en direct sans stress avec un setup technologique innovant et léger.
Mon cahier des charges (version « détendue »)
L’idée en deux phrases
Je veux couvrir des conférences en direct sans y laisser un rein : l’iPhone enregistre et transcrit, mon serveur Symfony reformule avec GPT-4o, et les lecteurs suivent le flux en quasi temps réel. S’il y a le moindre raté, tout bascule automatiquement sur un mode dégradé, donc pas de sueur froide.
Parcours utilisateur rêvé
- Moi, dans la salle : j’ouvre le raccourci « Conf → Live », je choisis le slug de l’événement et la langue source, puis je pose l’iPhone près de la sono.
- Toutes les dix minutes : l’iPhone envoie le texte brut au serveur.
- Le site : reformule, complète les mots mangés par le micro, résume en cinq phrases maxi, publie.
- Les lecteurs : reçoivent la mise à jour via SSE ; si le hub Mercure tousse, ils passent sans s’en rendre compte sur un polling de dix secondes.
- Fin du show : je ferme le raccourci, le live se range tout seul dans les archives, et je file au cocktail.
Technologie & pile choisies
Côté client
- iPhone + Raccourcis : aucun matos à acheter, transcription locale gratuite, détection automatique de la langue.
- Stimulus + Turbo : un seul controller gère SSE, hub de secours, puis bascule en polling ; zéro framework front lourd, directement Tailwind.
Côté serveur
- Symfony 7 : mon site vit déjà dessus ; j’ajoute le module live sans tout casser.
- Workflow Component : garde chaque entrée dans un état clair : new → processing → processed → published.
- Messenger + Doctrine transport : appels GPT-4o et rendu Twig hors requête, donc jamais de timeout.
- php-llm/llm-chain-bundle : super glue PHP pour interroger GPT-4o, gérer le prompt « traduis + corrige + résume ».
- Mercure Hub : temps réel natif Hotwire, hébergé comme service.
Architecture grossière
Route API /api/live/{slug}
- Vérifie un JWT (l’iPhone l’envoie).
- Crée l’entité LiveEntry (new) puis balance un message ProcessLiveEntry.
Worker
- Passe new → processing.
- Appelle GPT-4o via LLM-Chain : « traduis, complète, résume ».
- Stocke content_fr et summary_fr, passe en published.
- Pousse le fragment Turbo Stream via HubInterface.
Navigation
- Stimulus ouvre un EventSource vers le hub interne.
- Erreur ? il repasse en polling /live/updates.
Budget & exploitation
- GPT-4o (traduction + résumé) : ≈ 1 €/jour seulement les jours de conf.
- Mercure : dans mon plan PlatformSH
Risques & parades
- Hub Mercure saturé : Stimulus bascule ↦ hub SaaS ↦ polling.
- GPT-4o rate une requête : Workflow reste en processing, retry via Messenger.
- iPhone verrouillé A: ccès guidé + alim secteur ; Pushcut si je veux écran éteint.
- Conf trop longue : Coût GPT-4o toujours < 2 € même sur deux jours (calculé).
« Définition de prêt à publier »
- Page /live/{slug} affiche la bannière « EN DIRECT ».
- Latence ≤ 5 s en SSE, ≤ 12 s en mode polling.
- Archive 301 vers /live/2025/{slug} après coverageEndTime.
- JSON-LD LiveBlogPosting valide sur https://validator.schema.org.
- Alerte si /healthz ≠ 200 plus de 30 s.
Le mot de la fin
Je mise sur un trio Symfony + Hotwire + GPT-4o : presque aucun surcoût, très peu d’opérations manuelles, et l’assurance qu’un pic de trafic ou un micro qui grésille ne viendra pas casser mon direct. On code léger, on déploie vite, et on sirote l’after-party en respirant.