darkmedia-x-api / implementation_plan.md
cybermedia's picture
Upload folder using huggingface_hub
343eed9 verified

A newer version of the Gradio SDK is available: 6.15.2

Upgrade

Remix Render — Plan d'implémentation

Objectif

Permettre de re-render une histoire déjà générée avec un profil différent (VFX, voix, musique) sans refaire les images IA (coûteuses et lentes). Chaque variante est sauvegardée séparément.

Comment ça marche aujourd'hui

  1. Dashboard → LANCER LA PRODUCTION
  2. trigger_story.json écrit avec story_id + config
  3. 00_master_pipeline.py lit le trigger → lance asset_generator.py (images IA) + story_to_video.py (montage)
  4. La vidéo finale écrase toujours TT_{slug}_final.mp4

Changements proposés


1. UI — Bouton "REMIX" dans le Project Bin

Ajouter un bouton ⚡ REMIX à côté de chaque histoire dans le bin (ou dans le Master Controls de l'Inspector).

Modal de remix :

  • Sélection VFX Profile (dropdown)
  • Sélection Voice (dropdown, depuis la liste existante)
  • Sélection Background Music (dropdown)
  • Checkbox : "Regenerate images (slow)" — décoché par défaut
  • Nom de variante (ex. vhs_jean) → auto-généré ou manuel
  • Bouton LANCER LE REMIX

2. Backend — Nouveau endpoint POST /api/stories/remix

[MODIFY] main_routes.py

Nouveau endpoint qui écrit un trigger_story.json enrichi avec les overrides de config ET un flag remix_only: true pour sauter la génération d'images.

{
  "story_id": "Les Pendus du Brise-Lames",
  "story_path": "/data/stories/Rimouski/Les Pendus du Brise-Lames",
  "config": {
    "remix_only": true,          # Saute asset_generator.py
    "vfx_profile": "vhs",        # Injecté dans env pour story_to_video.py
    "voice": "fr-CA-JeanNeural",
    "bg_music": "dark_ambient.mp3",
    "output_suffix": "vhs_jean"  # Nom de sortie unique
  }
}

3. Pipeline — Skip asset_generator.py si remix_only

[MODIFY] 00_master_pipeline.py

if triggered_config.get("remix_only"):
    info("MODE REMIX : Les images existantes seront réutilisées.")
else:
    # ... génération images IA comme avant
    run(f'python "{asset_script}"...')

Injection des overrides dans l'environnement avant story_to_video.py :

remix_env = {}
if vfx := triggered_config.get("vfx_profile"):
    remix_env["VFX_PROFILE"] = vfx
if voice := triggered_config.get("voice"):
    remix_env["VOICE_OVERRIDE"] = voice
if music := triggered_config.get("bg_music"):
    remix_env["MUSIC_OVERRIDE"] = music
if suffix := triggered_config.get("output_suffix"):
    remix_env["OUTPUT_SUFFIX"] = suffix

4. story_to_video.py — Lecture des overrides env

[MODIFY] story_to_video.py

  • VOICE_OVERRIDE → remplace la voix lue depuis le .md
  • MUSIC_OVERRIDE → cherche ce fichier dans MUSIC_ASSETS/ au lieu du fallback auto
  • OUTPUT_SUFFIX → append au nom du fichier de sortie : TT_{slug}_final_{suffix}.mp4

Résultat visuel

Dans le Project Bin, les histoires qui ont des variantes auront un indicateur :

📂 LES PENDUS DU BRISE-LAMES  [5]
  ► TT_Les_Pendus_final.mp4          (original)
  ► TT_Les_Pendus_final_vhs_jean.mp4 (variante 1)
  ► TT_Les_Pendus_final_grain_sylvie.mp4 (variante 2)

Vérification

  1. Lancer un remix sans regenerer images → vidéo produite en ~3-5 min au lieu de 30+ min
  2. La variante est bien sauvegardée avec le suffix correct
  3. Le UI affiche correctement le statut Engine pendant le remix

Questions ouvertes pour l'utilisateur

Est-ce que tu veux choisir à chaque fois, ou est-ce que tu veux définir des presets de remix (ex. "Preset Horror VHS", "Preset Cinématic Jean") que tu appliques en 1 clic ?

Si tu as déjà des fichiers audio ou des samples de musique que tu veux utiliser, ils doivent être dans data/assets/background_music/. Je peux aussi ajouter l'upload depuis le UI.