File size: 5,390 Bytes
82f3ba5 b5023f2 f022eee b5023f2 3470339 b5023f2 f022eee b5023f2 3470339 3a03753 4761c77 3470339 82f3ba5 3470339 f022eee 3470339 f022eee 3470339 f022eee 3470339 f022eee 3470339 f022eee 3470339 f022eee 3470339 f022eee 3470339 f022eee 3470339 f022eee 3470339 dda79db 3470339 f022eee 3470339 f022eee 3470339 f022eee 3470339 f022eee |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# engineers/deformes3D.py
# AducSdr: Uma implementação aberta e funcional da arquitetura ADUC-SDR
# Copyright (C) 4 de Agosto de 2025 Carlos Rodrigues dos Santos
#
# Contato:
# Carlos Rodrigues dos Santos
# carlex22@gmail.com
# Rua Eduardo Carlos Pereira, 4125, B1 Ap32, Curitiba, PR, Brazil, CEP 8102025
#
# Repositórios e Projetos Relacionados:
# GitHub: https://github.com/carlex22/Aduc-sdr
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License...
# PENDING PATENT NOTICE: Please see NOTICE.md.
#
# Version 1.4.5
from PIL import Image
import os
import time
import logging
import gradio as gr
import yaml
from managers.flux_kontext_manager import flux_kontext_singleton
from engineers.deformes2D_thinker import deformes2d_thinker_singleton
logger = logging.getLogger(__name__)
class Deformes3DEngine:
"""
ADUC Specialist for static image (keyframe) generation.
This is responsible for the entire process of turning a script into a gallery of keyframes.
"""
def __init__(self, workspace_dir):
self.workspace_dir = workspace_dir
self.image_generation_helper = flux_kontext_singleton
logger.info("3D Engine (Image Specialist) ready to receive orders from the Maestro.")
def _generate_single_keyframe(self, prompt: str, reference_images: list[Image.Image], output_filename: str, width: int, height: int, callback: callable = None) -> str:
"""
Low-level function that generates a single image.
"""
logger.info(f"Generating keyframe '{output_filename}' with prompt: '{prompt}'")
generated_image = self.image_generation_helper.generate_image(
reference_images=reference_images, prompt=prompt, width=width,
height=height, seed=int(time.time()), callback=callback
)
final_path = os.path.join(self.workspace_dir, output_filename)
generated_image.save(final_path)
logger.info(f"Keyframe successfully saved to: {final_path}")
return final_path
def generate_keyframes_from_storyboard(self, storyboard: list, initial_ref_path: str, global_prompt: str, keyframe_resolution: int, general_ref_paths: list, progress_callback_factory: callable = None):
"""
Orchestrates the generation of all keyframes from a storyboard.
"""
current_base_image_path = initial_ref_path
previous_prompt = "N/A (initial reference image)"
final_keyframes = [current_base_image_path]
width, height = keyframe_resolution, keyframe_resolution
num_keyframes_to_generate = len(storyboard) - 1
logger.info(f"IMAGE SPECIALIST: Received order to generate {num_keyframes_to_generate} keyframes.")
for i in range(num_keyframes_to_generate):
current_scene = storyboard[i]
future_scene = storyboard[i+1]
progress_callback = progress_callback_factory(i + 1, num_keyframes_to_generate) if progress_callback_factory else None
logger.info(f"--> Generating Keyframe {i+1}/{num_keyframes_to_generate}...")
new_flux_prompt = deformes2d_thinker_singleton.get_anticipatory_keyframe_prompt(
global_prompt=global_prompt, scene_history=previous_prompt,
current_scene_desc=current_scene, future_scene_desc=future_scene,
last_image_path=current_base_image_path, fixed_ref_paths=general_ref_paths
)
images_for_flux_paths = list(set([current_base_image_path] + general_ref_paths))
images_for_flux = [Image.open(p) for p in images_for_flux_paths]
new_keyframe_path = self._generate_single_keyframe(
prompt=new_flux_prompt, reference_images=images_for_flux,
output_filename=f"keyframe_{i+1}.png", width=width, height=height,
callback=progress_callback
)
final_keyframes.append(new_keyframe_path)
current_base_image_path = new_keyframe_path
previous_prompt = new_flux_prompt
logger.info(f"IMAGE SPECIALIST: Keyframe generation complete.")
return final_keyframes
# --- Singleton Instantiation ---
try:
with open("config.yaml", 'r') as f:
config = yaml.safe_load(f)
WORKSPACE_DIR = config['application']['workspace_dir']
# Correctly instantiate the Deformes3DEngine class
deformes3d_engine_singleton = Deformes3DEngine(workspace_dir=WORKSPACE_DIR)
except Exception as e:
logger.error(f"Could not initialize Deformes3DEngine: {e}", exc_info=True)
deformes3d_engine_singleton = None |