Carlex22222 commited on
Commit
191e368
·
verified ·
1 Parent(s): eea736e

Update aduc_framework/orchestrator.py

Browse files
Files changed (1) hide show
  1. aduc_framework/orchestrator.py +31 -22
aduc_framework/orchestrator.py CHANGED
@@ -2,11 +2,11 @@
2
  #
3
  # Copyright (C) August 4, 2025 Carlos Rodrigues dos Santos
4
  #
5
- # Version: 4.1.0 (Multi-Pool with Forced SeedVR 3B)
6
  #
7
- # Esta versão do orquestrador opera com uma arquitetura de múltiplos pools de
8
- # especialistas e simplifica a tarefa de masterização HD, fixando o uso do
9
- # modelo SeedVR 3B e removendo a necessidade de selecionar a versão do modelo.
10
 
11
  import logging
12
  from typing import List, Dict, Any, Tuple, Callable, Optional, Generator
@@ -19,14 +19,14 @@ import time
19
  import gc
20
  import torch
21
 
22
- # Componentes internos do framework
23
  from .director import AducDirector
24
  from .types import GenerationState, PreProductionParams, ProductionParams
25
 
26
  # Engenheiros de alto nível que definem a lógica do fluxo
27
  from .engineers import deformes2d_thinker_singleton, deformes3d_engine_singleton, Deformes4DEngine
28
 
29
- # Managers (Pools) de especialistas que executam as tarefas em hardware dedicado
30
  from .managers.latent_enhancer_manager import latent_enhancer_specialist_singleton
31
  from .managers.seedvr_manager import seedvr_manager_singleton
32
  from .managers.mmaudio_manager import mmaudio_manager_singleton
@@ -36,7 +36,6 @@ from .managers.vae_manager import vae_manager_singleton
36
  from .tools.video_encode_tool import video_encode_tool_singleton
37
 
38
  logger = logging.getLogger(__name__)
39
-
40
  ProgressCallback = Optional[Callable[[float, str], None]]
41
 
42
  class AducOrchestrator:
@@ -55,11 +54,11 @@ class AducOrchestrator:
55
  logger.info("ADUC Maestro (Framework Core) pronto para reger a orquestra de especialistas.")
56
 
57
  def get_current_state(self) -> GenerationState:
58
- """Retorna o estado de geração atual."""
59
  return self.director.get_full_state()
60
 
61
  def process_image_for_story(self, image_path: str, size: int, filename: str) -> str:
62
- """Processa uma imagem de referência para o formato quadrado padrão."""
63
  img = Image.open(image_path).convert("RGB")
64
  img_square = ImageOps.fit(img, (size, size), Image.Resampling.LANCZOS)
65
  processed_path = os.path.join(self.director.workspace_dir, filename)
@@ -69,16 +68,26 @@ class AducOrchestrator:
69
 
70
  # --- ETAPA 1: PRÉ-PRODUÇÃO ---
71
  def task_pre_production(self, params: PreProductionParams, progress_callback: ProgressCallback = None) -> Tuple[List[str], List[str], GenerationState]:
72
- """Orquestra a criação do storyboard e dos keyframes visuais."""
73
  logger.info("Maestro: Iniciando tarefa de Pré-Produção.")
74
  self.director.update_parameters("pre_producao", params)
75
 
76
- if progress_callback: progress_callback(0.1, "Gerando storyboard...")
77
- storyboard_list = deformes2d_thinker_singleton.generate_storyboard(prompt=params.prompt, num_keyframes=params.num_keyframes, ref_image_paths=params.ref_paths)
 
 
 
78
  self.director.update_pre_production_state(params.prompt, params.ref_paths, storyboard_list)
79
 
80
- if progress_callback: progress_callback(0.2, "Iniciando geração de keyframes...")
81
- keyframes_detailed_data = self.painter.generate_keyframes_from_storyboard(generation_state=self.director.get_full_state_as_dict(), progress_callback=progress_callback)
 
 
 
 
 
 
 
82
  self.director.update_keyframes_state(keyframes_detailed_data)
83
 
84
  final_keyframe_paths = [kf["caminho_pixel"] for kf in keyframes_detailed_data]
@@ -92,7 +101,10 @@ class AducOrchestrator:
92
  logger.info("Maestro: Iniciando tarefa de Produção do Filme Original.")
93
  self.director.update_parameters("producao", params)
94
 
95
- result_data = self.editor.generate_original_movie(full_generation_state=self.director.get_full_state_as_dict(), progress_callback=progress_callback)
 
 
 
96
  self.director.update_video_state(result_data["video_data"])
97
 
98
  final_video_path = result_data["final_path"]
@@ -105,7 +117,6 @@ class AducOrchestrator:
105
 
106
  def task_run_latent_upscaler(self, latent_paths: List[str], chunk_size: int, progress_callback: ProgressCallback = None) -> Generator[Dict[str, Any], None, None]:
107
  """Aplica upscale 2x nos latentes e os decodifica para um novo vídeo."""
108
- if not self.director.workspace_dir: raise RuntimeError("Orchestrator não inicializado.")
109
  if not latent_paths: raise ValueError("Nenhum caminho de latente fornecido para o upscale.")
110
 
111
  logger.info("--- ORQUESTRADOR: Tarefa de Upscaling de Latentes ---")
@@ -127,7 +138,7 @@ class AducOrchestrator:
127
  pixel_tensor = vae_manager_singleton.decode(upscaled_latent_chunk)
128
 
129
  current_clip_path = os.path.join(temp_dir, f"upscaled_clip_{i:04d}.mp4")
130
- self.editor.save_video_from_tensor(pixel_tensor, current_clip_path, fps=24)
131
  final_upscaled_clip_paths.append(current_clip_path)
132
 
133
  del tensors_in_chunk, sub_group_latent, upscaled_latent_chunk, pixel_tensor
@@ -142,12 +153,11 @@ class AducOrchestrator:
142
  yield {"final_path": final_video_path}
143
 
144
  def task_run_hd_mastering(self, source_video_path: str, steps: int, prompt: str, progress_callback: ProgressCallback = None) -> Generator[Dict[str, Any], None, None]:
145
- """Aplica masterização em HD usando o pool de GPUs do SeedVR com o modelo 3B."""
146
- if not self.director.workspace_dir: raise RuntimeError("Orchestrator não inicializado.")
147
- logger.info(f"--- ORQUESTRADOR: Tarefa de Masterização HD com SeedVR 3B ---")
148
 
149
  run_timestamp = int(time.time())
150
- output_path = os.path.join(self.director.workspace_dir, f"hd_mastered_movie_3B_{run_timestamp}.mp4")
151
 
152
  final_path = seedvr_manager_singleton.process_video(
153
  input_video_path=source_video_path,
@@ -160,7 +170,6 @@ class AducOrchestrator:
160
 
161
  def task_run_audio_generation(self, source_video_path: str, audio_prompt: str, progress_callback: ProgressCallback = None) -> Generator[Dict[str, Any], None, None]:
162
  """Gera e adiciona áudio ao vídeo usando o pool de GPUs do MMAudio."""
163
- if not self.director.workspace_dir: raise RuntimeError("Orchestrator não inicializado.")
164
  logger.info(f"--- ORQUESTRADOR: Tarefa de Geração de Áudio ---")
165
 
166
  if progress_callback: progress_callback(0.1, "Preparando para geração de áudio...")
 
2
  #
3
  # Copyright (C) August 4, 2025 Carlos Rodrigues dos Santos
4
  #
5
+ # Versão 5.0.0 (Conductor for Autonomous Director)
6
  #
7
+ # Esta versão do orquestrador está alinhada com a arquitetura do Diretor Autônomo.
8
+ # Ele delega a complexa tarefa de geração de keyframes ao Deformes3DEngine (`painter`),
9
+ # que agora gerencia seu próprio ciclo de avaliação, correção e improviso.
10
 
11
  import logging
12
  from typing import List, Dict, Any, Tuple, Callable, Optional, Generator
 
19
  import gc
20
  import torch
21
 
22
+ # --- Componentes Internos do Framework ---
23
  from .director import AducDirector
24
  from .types import GenerationState, PreProductionParams, ProductionParams
25
 
26
  # Engenheiros de alto nível que definem a lógica do fluxo
27
  from .engineers import deformes2d_thinker_singleton, deformes3d_engine_singleton, Deformes4DEngine
28
 
29
+ # Managers (Pools) de especialistas que executam tarefas de pós-produção
30
  from .managers.latent_enhancer_manager import latent_enhancer_specialist_singleton
31
  from .managers.seedvr_manager import seedvr_manager_singleton
32
  from .managers.mmaudio_manager import mmaudio_manager_singleton
 
36
  from .tools.video_encode_tool import video_encode_tool_singleton
37
 
38
  logger = logging.getLogger(__name__)
 
39
  ProgressCallback = Optional[Callable[[float, str], None]]
40
 
41
  class AducOrchestrator:
 
54
  logger.info("ADUC Maestro (Framework Core) pronto para reger a orquestra de especialistas.")
55
 
56
  def get_current_state(self) -> GenerationState:
57
+ """Retorna o estado de geração atual, útil para APIs."""
58
  return self.director.get_full_state()
59
 
60
  def process_image_for_story(self, image_path: str, size: int, filename: str) -> str:
61
+ """Processa e padroniza uma imagem de referência para o formato quadrado."""
62
  img = Image.open(image_path).convert("RGB")
63
  img_square = ImageOps.fit(img, (size, size), Image.Resampling.LANCZOS)
64
  processed_path = os.path.join(self.director.workspace_dir, filename)
 
68
 
69
  # --- ETAPA 1: PRÉ-PRODUÇÃO ---
70
  def task_pre_production(self, params: PreProductionParams, progress_callback: ProgressCallback = None) -> Tuple[List[str], List[str], GenerationState]:
71
+ """Orquestra a criação do storyboard e a geração autônoma de keyframes."""
72
  logger.info("Maestro: Iniciando tarefa de Pré-Produção.")
73
  self.director.update_parameters("pre_producao", params)
74
 
75
+ # Passo 1A: Gerar o roteiro inicial (storyboard)
76
+ if progress_callback: progress_callback(0.1, "Gerando roteiro inicial...")
77
+ storyboard_list = deformes2d_thinker_singleton.generate_storyboard(
78
+ prompt=params.prompt, num_keyframes=params.num_keyframes, ref_image_paths=params.ref_paths
79
+ )
80
  self.director.update_pre_production_state(params.prompt, params.ref_paths, storyboard_list)
81
 
82
+ # Passo 1B: Entregar produção ao Diretor Autônomo para gerar os keyframes
83
+ if progress_callback: progress_callback(0.2, "Entregando produção ao Diretor Autônomo...")
84
+
85
+ # CORREÇÃO APLICADA: Chamamos o método correto e renomeado `generate_keyframes`.
86
+ keyframes_detailed_data = self.painter.generate_keyframes(
87
+ generation_state=self.director.get_full_state_as_dict(),
88
+ progress_callback=progress_callback
89
+ )
90
+
91
  self.director.update_keyframes_state(keyframes_detailed_data)
92
 
93
  final_keyframe_paths = [kf["caminho_pixel"] for kf in keyframes_detailed_data]
 
101
  logger.info("Maestro: Iniciando tarefa de Produção do Filme Original.")
102
  self.director.update_parameters("producao", params)
103
 
104
+ result_data = self.editor.generate_original_movie(
105
+ full_generation_state=self.director.get_full_state_as_dict(),
106
+ progress_callback=progress_callback
107
+ )
108
  self.director.update_video_state(result_data["video_data"])
109
 
110
  final_video_path = result_data["final_path"]
 
117
 
118
  def task_run_latent_upscaler(self, latent_paths: List[str], chunk_size: int, progress_callback: ProgressCallback = None) -> Generator[Dict[str, Any], None, None]:
119
  """Aplica upscale 2x nos latentes e os decodifica para um novo vídeo."""
 
120
  if not latent_paths: raise ValueError("Nenhum caminho de latente fornecido para o upscale.")
121
 
122
  logger.info("--- ORQUESTRADOR: Tarefa de Upscaling de Latentes ---")
 
138
  pixel_tensor = vae_manager_singleton.decode(upscaled_latent_chunk)
139
 
140
  current_clip_path = os.path.join(temp_dir, f"upscaled_clip_{i:04d}.mp4")
141
+ video_encode_tool_singleton.save_video_from_tensor(pixel_tensor, current_clip_path)
142
  final_upscaled_clip_paths.append(current_clip_path)
143
 
144
  del tensors_in_chunk, sub_group_latent, upscaled_latent_chunk, pixel_tensor
 
153
  yield {"final_path": final_video_path}
154
 
155
  def task_run_hd_mastering(self, source_video_path: str, steps: int, prompt: str, progress_callback: ProgressCallback = None) -> Generator[Dict[str, Any], None, None]:
156
+ """Aplica masterização em HD usando o pool de GPUs do SeedVR."""
157
+ logger.info(f"--- ORQUESTRADOR: Tarefa de Masterização HD com SeedVR ---")
 
158
 
159
  run_timestamp = int(time.time())
160
+ output_path = os.path.join(self.director.workspace_dir, f"hd_mastered_movie_{run_timestamp}.mp4")
161
 
162
  final_path = seedvr_manager_singleton.process_video(
163
  input_video_path=source_video_path,
 
170
 
171
  def task_run_audio_generation(self, source_video_path: str, audio_prompt: str, progress_callback: ProgressCallback = None) -> Generator[Dict[str, Any], None, None]:
172
  """Gera e adiciona áudio ao vídeo usando o pool de GPUs do MMAudio."""
 
173
  logger.info(f"--- ORQUESTRADOR: Tarefa de Geração de Áudio ---")
174
 
175
  if progress_callback: progress_callback(0.1, "Preparando para geração de áudio...")