# 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](file:///home/jfvallee/Repository/darkmedia-x_studio/backend/api/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. ```python { "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](file:///home/jfvallee/Repository/darkmedia-x_studio/backend/pipeline/00_master_pipeline.py) ```python 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` : ```python 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](file:///home/jfvallee/Repository/darkmedia-x_studio/engine/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 > [!IMPORTANT] > **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 ? > [!NOTE] > 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.