Spaces:
Sleeping
Sleeping
| # 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. | |