Skip to content

feat(genai-audio): pipeline livecoding-video — narration slammée + capture Strudel + TTS expressif (hommage SwitchAngel) #15604

Description

@jsboige

Hommage — SwitchAngel, source d'inspiration

Cette proposition s'inspire directement du travail de SwitchAngel sur YouTube — 4 vidéos de livecoding Strudel visionnées et analysées localement le 2026-09-11 :

SwitchAngel a inventé — ou du moins porté à un niveau rare — un genre complet : narration poétique slammée + construction orchestrale multi-pistes Strudel + modulation lente par slider + visualizer génératif + storytelling final (écran qui s'éteint, musique qui décroît). Ce n'est pas du livecoding "regardez je tape du code", c'est une performance construite où chaque élément (voix, code, image, fin) joue un rôle.

Ce qui est retenu pour le pipeline : la méthode — narration poétique pré-écrite + TTS expressif + Strudel multi-pistes incrémental + capture navigateur en temps réel + visualizer custom + fade-out coordonné. Ce qui n'est PAS retenu : son code Strudel, ses transcriptions, son audio, ses vidéos, son ASCII art. Aucune archive SwitchAngel ne sera committée dans le dépôt. Tout le banc d'analyse reste local sous G:\Mon Drive\MyIA\IA\Bibliographie IA\SwitchAngel-livecoding-strudel\2026-09-11\ (périmètre bibliography-hygiene.md §2).

Voix : la voix off dans la vidéo générée sera synthétisée (Kokoro / FishAudio), pas clonée. La règle de 02-2-XTTS-Voice-Cloning.ipynb (« consentement écrit obligatoire ») s'applique aussi à la voix SwitchAngel, même si elle est parfois traitée. Si un jour SwitchAngel donne son accord explicite, la cellule de garde du pipeline citera son nom avec lien et date du consentement — pas avant.

Contexte — pourquoi cette proposition maintenant

Le dépôt a déjà les briques :

  • Notebook Strudel embryon : MyIA.AI.Notebooks/GenAI/Audio/04-Applications/04-5-LiveCoding-LLM-Music.ipynb (48 cellules, kernel Python 3, mini-notation + itération conversationnelle LLM, exercices de livecoding). Couvre la construction musicale incrémentale et l'intégration web <strudel-editor> dans Jupyter, mais aucun pipeline de production vidéo.
  • Workflow audiobook (MyIA.AI.Notebooks/GenAI/Audio/04-Applications/04-6 à 04-13, Epic [EPIC] GenAI Audiobook Agentique — Pipeline 5-pass avec voice cloning + tags expressifs #1028) : TTS multi-voix Kokoro / FishAudio S2-Pro (29 tags prosodiques), analyse littéraire, casting par personnage, compilation FFmpeg avec loudnorm. Le plus avancé.
  • Workflow podcast (fil rouge narratif, ébauché) : 03-2-Audio-Pipeline-Orchestration.ipynb Section 4 "Generation de podcast multi-voix" (démo 2 voix, 48.7 s). Spec narrative + POC, pas industrialisé.
  • Briques vidéo/transcription : 04-2-Transcription-Pipeline (SRT/VTT Whisper), 04-4-Audio-Video-Sync (moviepy + ffmpeg + Whisper), Video/04-1-Educational-Video-Generation (script → visuels → narration vocale → assemblage), scripts/audiobook_pipeline.py (orchestrateur).
  • Services Docker audio dispo : whisper-webui (127.0.0.1:36540), whisper-api (8190), tts-gateway (8196), tts-kokoro, tts-fishaudio.

Manque : un pipeline unifié qui prend (a) un script Strudel + (b) un texte poétique de narration, et produit (c) une vidéo .mp4 avec (i) la capture du navigateur Strudel, (ii) la voix off TTS expressive, (iii) le visualizer, (iv) le mixage et le fade-out final.

Périmètre proposé — pipeline en 6 étapes

Étape 1 — Composition Strudel multi-pistes (Python, hors navigateur)

Input : un style (trance, ambient, techno, melancholy) + une durée cible (3-10 min) + un BPM.
Output : un script Strudel Python-string contenant N voies parallèles ($:), avec :

  • Un plan de modulation lente par slider (paramètres X[i] qui évoluent au cours du temps selon une courbe).
  • Des effets de spatialisation (.delay, .room, .pan(rand)) sur chaque voie.
  • Un trancegate rythmique sur la voix principale.
  • Un scope() ou pianoroll() sur 1-2 voies pour la visualisation interne.

Méthode : réutiliser le notebook 04-5-LiveCoding-LLM-Music.ipynb (LLM compositeur) + un module strudel_compose.py qui contraint la sortie à un format valide (parsing mini-notation côté Python).

Étape 2 — Narration poétique (LLM, sortie texte)

Input : le script Strudel (étape 1) + le style + la durée cible.
Output : un texte de voix off structuré en segments {start_s, end_s, text, intensity} qui :

  • Nomme l'action (« let's add the bass », « next, the supersaw ») — comme dans SwitchAngel.
  • Glisse vers le poétique (« once there was a lonely melody wandering... »).
  • Tient en 60-90 s pour les vidéos courtes (3 min) ou 100 % de la durée pour les ambient lents.

Méthode : LLM avec system prompt dédié, calibré sur le genre observé (pas le contenu — zéro verbatim). Sortie : JSON segments timestampés.

Étape 3 — Synthèse vocale (TTS expressif)

Input : les segments JSON de l'étape 2.
Output : N fichiers WAV voix off (un par segment, ou concaténé).

Méthode : FishAudio S2-Pro (29 tags prosodiques via v4/fishaudio_client.py, déjà dans le workflow audiobook) ou Kokoro pour les voix simples. Voix libres (pas de clonage, pas d'imitation de SwitchAngel).

Étape 4 — Capture navigateur Strudel (Playwright + audio sync)

Input : le script Strudel de l'étape 1.
Output : une vidéo .webm du navigateur (audio + visuel) en train de jouer le script en temps réel.

Méthode :

  • Lancer Playwright headless sur https://strudel.cc/ (le 04-5 a déjà l'intégration <strudel-editor>, mais pas le boot du REPL).
  • Injecter le script Strudel via la console DevTools.
  • Capturer la vidéo de l'écran (page.video) et l'audio (page.evaluate(() => { navigator.mediaDevices.getDisplayMedia...}) OU routage audio via BlackHole/VB-Cable sur Windows, ou — plus simple — laisser le navigateur jouer et capturer via une autre entrée micro virtuelle).
  • Synchroniser audio navigateur + voix off TTS : mixer les deux pistes dans ffmpeg.

Défi technique : la capture audio du navigateur sans casser la latence. À tester d'abord avec un POC : playwright + strudel.cc + 30 s de musique + capture vidéo. Si infaisable, fallback : capture audio seule + rendu visuel = screen-recording manuel (mais perd la synchronicité fine).

Étape 5 — Visualizer custom (option V1, hors V0)

Input : l'audio mixé de l'étape 4.
Output : un overlay vidéo (calques alpha) avec un visualizer FFT ou un donut "Patron Angel".

Méthode V0 : skip — la capture navigateur Strudel inclut déjà les scopes internes (scope(), pianoroll()), c'est suffisant.
Méthode V1 : composant Three.js custom ou shader GLSL piloté par analyse FFT du mix final. Sortie .webm transparente → composite ffmpeg avec la capture navigateur.

Étape 6 — Composition finale (ffmpeg)

Input : la vidéo capture navigateur (étape 4) + la voix off WAV (étape 3) + le générique ASCII art (PNG transparent ou SVG) + optionnellement le visualizer (étape 5).
Output : un .mp4 final avec :

  • Layout : Strudel à gauche 70 %, ASCII art + webcam/avatar à droite 30 %.
  • Audio mixé (Stems navigateur + voix off, normalisé loudnorm -14 LUFS).
  • Sous-titres SRT (optionnel, via faster-whisper ou depuis les segments JSON étape 2).
  • Fade-out coordonné (vidéo qui s'éteint en parallèle de la musique).

Méthode : pipeline ffmpeg documenté dans 04-12-Compilation-Audio.ipynb (crossfade 20 ms, loudnorm, concat) + overlay moviepy ou ffmpeg -filter_complex.

Acceptance — vérifiable, 5 critères

  1. Pipeline exécutable de bout en bout : commande unique python scripts/livecoding_video_pipeline.py --style trance --duration 180 --output out/trance_demo.mp4 qui produit un .mp4 ≥ 60 s sans intervention manuelle.
  2. Code Strudel réellement joué dans le navigateur : assertion que la page strudel.cc est chargée, le script est injecté, l'audio est produit (vérif via page.evaluate qui lit le contexte audio Web Audio API).
  3. Voix off expressive : 1 voix TTS (Kokoro ou FishAudio), prosodie non plate (≥ 3 variations pitch/intensity/pace sur la vidéo démo), pas de voix par défaut documentation.
  4. Mix final propre : loudness normalisée (-14 LUFS), pas de clip, durée = script durée ± 5 s.
  5. Vérification visuelle post-prod : la vidéo démo montre (a) le code Strudel en cours d'évolution (au moins 3 états visibles distincts au cours du temps), (b) la voix off audible et synchronisée, (c) le fade-out final musique + vidéo coordonné.

Hors scope (voie 3 B.0)

  • Voix SwitchAngel clonée — non (consentement obligatoire, règle 02-2-XTTS-Voice-Cloning.ipynb).
  • Recopiage verbatim des textes poétiques SwitchAngel — non (audit-cross-source-distillation).
  • Archive SwitchAngel dans le dépôt — non (bibliography-hygiene §2, archive canonique hors Git).
  • Wan 2.1 14B / Wan 2.2 A14B — non lié (rappel c.445 : investigation(genai-dotnet): axe multimodal de #12353 — TensorSharp Qwen-Image-Edit / Wan video sur eGPU RTX 3090 (po-2023) #14549 axe Vidéo reste à comparer ComfyUI).
  • Générique visuel fixe ASCII art — la V0 utilise un simple titre overlay (strudel + narration), l'ASCII art "SWITCH ANGEL" est explicitement NON copié (il appartient à SwitchAngel, pas un template générique).
  • Effet "vocodé" sur la voix TTS — la V0 vise une voix propre, le vocodeur serait une V1 si besoin (cf. voix FishAudio S2-Pro tags).

Risques identifiés

  • Capture audio navigateur sur Windows : routeur audio virtuel requis (VB-Cable / BlackHole). Vérifier disponibilité sur po-2023.
  • Latence navigateur / Playwright : le REPL Strudel a un délai audio non négligeable (~50-200 ms selon cps). Test POC 30 s avant d'investir dans le pipeline complet.
  • LLM compositeur Strudel : le notebook 04-5 montre que c'est faisable mais pas trivial (sortie parfois invalide). Préférer la composition template + variantes (remplir un template avec paramètres) à la composition libre pour la V0.
  • Droits TTS voix : FishAudio S2-Pro a une licence qui peut restreindre la redistribution ; vérifier la licence exacte avant de publier une démo publique.

Lane / routage

myia-po-2023 (RTX 3090 + services Docker GenAI) pour le POC + itération. Si l'audio navigateur nécessite une latence basse, basculer sur la machine H100 (ai-01).

Tell applicable

  • c.1502 strict · c.647 strict substance INLINE · c.677-L4 ★★ body HORS worktree · c.1069 strict honnêteté référentielle · c.1102 ★★★★★ anti-stonewall · c.1830 dissociation substance/coordination · c.1356 ★★★ preflight first-hand · c.745 ★★★ inspection non-destructive · bibliography-hygiene §2 (archive hors Git) · audit-cross-source-distillation §3.1 (DIVERGENCE POSITIVE — originaux ≠ copier-coller) · 02-2-XTTS-Voice-Cloning ligne 2018 (consentement écrit obligatoire) · c.257-L2 sustained fenêtre cron

🤖 Generated with Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions