aducsdr commited on
Commit
6fb6534
·
verified ·
1 Parent(s): 2f4cdcb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -111
app.py CHANGED
@@ -2,7 +2,7 @@
2
  #
3
  # Copyright (C) August 4, 2025 Carlos Rodrigues dos Santos
4
  #
5
- # Versão 3.0.0 (UI Head for Aduc Framework)
6
  #
7
  # Este arquivo implementa a interface de usuário com Gradio para o Aduc-Sdr.
8
  # Ele atua como um cliente para o 'aduc_framework', que contém toda a
@@ -18,13 +18,10 @@ import time
18
  import json
19
 
20
  # --- 1. IMPORTAÇÃO DO FRAMEWORK E SEUS TIPOS ---
21
- # A UI agora trata o Aduc-Sdr como um pacote que ela consome.
22
  import aduc_framework
23
  from aduc_framework.types import PreProductionParams, ProductionParams
24
 
25
  # --- CUSTOM UI THEME E CONFIGURAÇÃO INICIAL ---
26
- # (Esta seção permanece a mesma, pois é específica da aplicação)
27
-
28
  cinematic_theme = gr.themes.Base(
29
  primary_hue=gr.themes.colors.indigo,
30
  secondary_hue=gr.themes.colors.purple,
@@ -45,29 +42,22 @@ LOG_FILE_PATH = "aduc_log.txt"
45
  if os.path.exists(LOG_FILE_PATH):
46
  os.remove(LOG_FILE_PATH)
47
 
48
- # Configuração de logging
49
  log_format = '%(asctime)s - %(levelname)s - [%(name)s:%(funcName)s] - %(message)s'
50
  root_logger = logging.getLogger()
51
  root_logger.setLevel(logging.INFO)
52
  root_logger.handlers.clear()
53
  stream_handler = logging.StreamHandler(sys.stdout)
54
- stream_handler.setLevel(logging.INFO)
55
  stream_handler.setFormatter(logging.Formatter(log_format))
56
  root_logger.addHandler(stream_handler)
57
  file_handler = logging.FileHandler(LOG_FILE_PATH, mode='w', encoding='utf-8')
58
- file_handler.setLevel(logging.INFO)
59
  file_handler.setFormatter(logging.Formatter(log_format))
60
  root_logger.addHandler(file_handler)
61
  logger = logging.getLogger(__name__)
62
 
63
- # Carrega a configuração e inicializa o framework
64
  try:
65
  with open("config.yaml", 'r') as f: config = yaml.safe_load(f)
66
  WORKSPACE_DIR = config['application']['workspace_dir']
67
-
68
- # --- PONTO DE ENTRADA DO FRAMEWORK ---
69
  aduc = aduc_framework.create_aduc_instance(workspace_dir=WORKSPACE_DIR)
70
-
71
  logger.info("Interface Gradio inicializada e conectada ao Aduc Framework.")
72
  except Exception as e:
73
  logger.critical(f"ERRO CRÍTICO durante a inicialização: {e}", exc_info=True)
@@ -76,88 +66,53 @@ except Exception as e:
76
  # --- 2. FUNÇÕES WRAPPER (CAMADA DE TRADUÇÃO UI <-> FRAMEWORK) ---
77
 
78
  def run_pre_production_wrapper(prompt, num_keyframes, ref_files, resolution_str, duration_per_fragment, progress=gr.Progress()):
79
- """
80
- Coleta dados da UI, os empacota em um objeto Pydantic e chama a tarefa de pré-produção do framework.
81
- """
82
- if not ref_files:
83
- raise gr.Error("Por favor, forneça pelo menos uma imagem de referência.")
84
-
85
- # Etapa de UI: Processar e salvar os arquivos de referência
86
  ref_paths = [aduc.process_image_for_story(f.name, 480, f"ref_processed_{i}.png") for i, f in enumerate(ref_files)]
87
-
88
- # 1. Empacota os parâmetros da UI no modelo Pydantic que o framework espera
89
- params = PreProductionParams(
90
- prompt=prompt,
91
- num_keyframes=int(num_keyframes),
92
- ref_paths=ref_paths,
93
- resolution=int(resolution_str.split('x')[0]),
94
- duration_per_fragment=duration_per_fragment
95
- )
96
-
97
- # 2. Define a função de callback para o progresso
98
- progress_callback = progress
99
-
100
- # 3. Chama o framework
101
- storyboard, final_keyframes, updated_state = aduc.task_pre_production(params, progress_callback)
102
-
103
- # 4. Retorna os resultados desempacotados para os componentes corretos da UI
104
  return updated_state.model_dump(), storyboard, final_keyframes, gr.update(visible=True, open=True)
105
 
106
  def run_original_production_wrapper(current_state_dict, trim_percent, handler_strength, dest_strength, guidance_scale, stg_scale, steps, progress=gr.Progress()):
107
- """
108
- Coleta os parâmetros da etapa de produção e o estado atual, e chama a tarefa de produção do framework.
109
- """
110
- yield {
111
- original_video_output: gr.update(value=None, visible=True, label="🎬 Produzindo seu filme..."),
112
- final_video_output: gr.update(value=None, visible=True, label="🎬 Produção em progresso..."),
113
- step4_accordion: gr.update(visible=False)
114
- }
115
-
116
- # 1. Empacota os parâmetros dos sliders no modelo Pydantic
117
- production_params = ProductionParams(
118
- trim_percent=int(trim_percent),
119
- handler_strength=handler_strength,
120
- destination_convergence_strength=dest_strength,
121
- guidance_scale=guidance_scale,
122
- stg_scale=stg_scale,
123
- inference_steps=int(steps)
124
- )
125
-
126
- # 2. Chama a tarefa de produção no framework.
127
- final_video_path, latent_paths, updated_state = aduc.task_produce_original_movie(
128
- params=production_params,
129
- progress_callback=progress
130
- )
131
-
132
  updated_state_dict = updated_state.model_dump()
133
-
134
- # 3. Desempacota e retorna o resultado final para a UI
135
- yield {
136
- original_video_output: gr.update(value=final_video_path, label=" Filme Original Master"),
137
- final_video_output: gr.update(value=final_video_path),
138
- step4_accordion: gr.update(visible=True, open=True),
139
- original_latents_paths_state: latent_paths,
140
- original_video_path_state: final_video_path,
141
- current_source_video_state: final_video_path,
142
- generation_state_holder: updated_state_dict,
143
- generation_data_output: updated_state_dict
144
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
 
146
  def get_log_content():
147
  try:
148
- with open(LOG_FILE_PATH, "r", encoding="utf-8") as f:
149
- return f.read()
150
- except FileNotFoundError:
151
- return "Arquivo de log ainda não criado. Inicie uma geração."
152
 
153
  # --- 3. DEFINIÇÃO DA UI GRADIO ---
154
  with gr.Blocks(theme=cinematic_theme, css="style.css") as demo:
155
-
156
- # O gr.State é a "memória" da nossa UI. Ele armazena o JSON de estado entre os cliques.
157
  generation_state_holder = gr.State(value={})
158
-
159
- # Outros states para gerenciar caminhos de arquivos
160
- original_latents_paths_state = gr.State(value=None)
161
  original_video_path_state = gr.State(value=None)
162
  current_source_video_state = gr.State(value=None)
163
  upscaled_video_path_state = gr.State(value=None)
@@ -191,8 +146,20 @@ with gr.Blocks(theme=cinematic_theme, css="style.css") as demo:
191
  original_video_output = gr.Video(label="Filme Original Master", visible=False, interactive=False)
192
 
193
  with gr.Accordion("Etapa 4: Pós-Produção (Opcional)", open=False, visible=False) as step4_accordion:
194
- gr.Markdown("Aplique efeitos de melhoria ao vídeo mais recente.")
195
- # ... (Componentes de pós-produção aqui) ...
 
 
 
 
 
 
 
 
 
 
 
 
196
 
197
  with gr.Accordion("🧬 DNA Digital da Geração (JSON)", open=False) as data_accordion:
198
  generation_data_output = gr.JSON(label="Estado de Geração Completo")
@@ -204,41 +171,20 @@ with gr.Blocks(theme=cinematic_theme, css="style.css") as demo:
204
  update_log_button = gr.Button("Atualizar Log")
205
 
206
  # --- 4. CONEXÕES DE EVENTOS DA UI ---
 
 
207
 
208
- storyboard_and_keyframes_button.click(
209
- fn=run_pre_production_wrapper,
210
- inputs=[prompt_input, num_keyframes_slider, ref_image_input, resolution_selector, duration_per_fragment_slider],
211
- outputs=[generation_state_holder, storyboard_output, keyframe_gallery, step3_accordion]
212
- )
213
-
214
- produce_original_button.click(
215
- fn=run_original_production_wrapper,
216
- inputs=[
217
- generation_state_holder,
218
- trim_percent_slider, handler_strength, dest_strength,
219
- guidance_scale_slider, stg_scale_slider, inference_steps_slider
220
- ],
221
- outputs=[
222
- original_video_output, final_video_output, step4_accordion,
223
- original_latents_paths_state, original_video_path_state, current_source_video_state,
224
- generation_state_holder, generation_data_output
225
- ]
226
- )
227
-
228
- generation_state_holder.change(
229
- fn=lambda state: state,
230
- inputs=generation_state_holder,
231
- outputs=generation_data_output
232
- )
233
 
 
234
  update_log_button.click(fn=get_log_content, inputs=[], outputs=[log_display])
235
-
236
  # --- 5. INICIALIZAÇÃO DA APLICAÇÃO ---
237
  if __name__ == "__main__":
238
  if os.path.exists(WORKSPACE_DIR):
239
- logger.info(f"Limpando workspace anterior em: {WORKSPACE_DIR}")
240
  shutil.rmtree(WORKSPACE_DIR)
241
  os.makedirs(WORKSPACE_DIR)
242
-
243
  logger.info("Aplicaç��o Gradio iniciada. Lançando interface...")
244
  demo.queue().launch()
 
2
  #
3
  # Copyright (C) August 4, 2025 Carlos Rodrigues dos Santos
4
  #
5
+ # Versão 3.2.0 (UI Head for Aduc Framework)
6
  #
7
  # Este arquivo implementa a interface de usuário com Gradio para o Aduc-Sdr.
8
  # Ele atua como um cliente para o 'aduc_framework', que contém toda a
 
18
  import json
19
 
20
  # --- 1. IMPORTAÇÃO DO FRAMEWORK E SEUS TIPOS ---
 
21
  import aduc_framework
22
  from aduc_framework.types import PreProductionParams, ProductionParams
23
 
24
  # --- CUSTOM UI THEME E CONFIGURAÇÃO INICIAL ---
 
 
25
  cinematic_theme = gr.themes.Base(
26
  primary_hue=gr.themes.colors.indigo,
27
  secondary_hue=gr.themes.colors.purple,
 
42
  if os.path.exists(LOG_FILE_PATH):
43
  os.remove(LOG_FILE_PATH)
44
 
 
45
  log_format = '%(asctime)s - %(levelname)s - [%(name)s:%(funcName)s] - %(message)s'
46
  root_logger = logging.getLogger()
47
  root_logger.setLevel(logging.INFO)
48
  root_logger.handlers.clear()
49
  stream_handler = logging.StreamHandler(sys.stdout)
 
50
  stream_handler.setFormatter(logging.Formatter(log_format))
51
  root_logger.addHandler(stream_handler)
52
  file_handler = logging.FileHandler(LOG_FILE_PATH, mode='w', encoding='utf-8')
 
53
  file_handler.setFormatter(logging.Formatter(log_format))
54
  root_logger.addHandler(file_handler)
55
  logger = logging.getLogger(__name__)
56
 
 
57
  try:
58
  with open("config.yaml", 'r') as f: config = yaml.safe_load(f)
59
  WORKSPACE_DIR = config['application']['workspace_dir']
 
 
60
  aduc = aduc_framework.create_aduc_instance(workspace_dir=WORKSPACE_DIR)
 
61
  logger.info("Interface Gradio inicializada e conectada ao Aduc Framework.")
62
  except Exception as e:
63
  logger.critical(f"ERRO CRÍTICO durante a inicialização: {e}", exc_info=True)
 
66
  # --- 2. FUNÇÕES WRAPPER (CAMADA DE TRADUÇÃO UI <-> FRAMEWORK) ---
67
 
68
  def run_pre_production_wrapper(prompt, num_keyframes, ref_files, resolution_str, duration_per_fragment, progress=gr.Progress()):
69
+ if not ref_files: raise gr.Error("Por favor, forneça pelo menos uma imagem de referência.")
 
 
 
 
 
 
70
  ref_paths = [aduc.process_image_for_story(f.name, 480, f"ref_processed_{i}.png") for i, f in enumerate(ref_files)]
71
+ params = PreProductionParams(prompt=prompt, num_keyframes=int(num_keyframes), ref_paths=ref_paths, resolution=int(resolution_str.split('x')[0]), duration_per_fragment=duration_per_fragment)
72
+ storyboard, final_keyframes, updated_state = aduc.task_pre_production(params, progress)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  return updated_state.model_dump(), storyboard, final_keyframes, gr.update(visible=True, open=True)
74
 
75
  def run_original_production_wrapper(current_state_dict, trim_percent, handler_strength, dest_strength, guidance_scale, stg_scale, steps, progress=gr.Progress()):
76
+ yield {original_video_output: gr.update(value=None, visible=True, label="🎬 Produzindo seu filme..."), final_video_output: gr.update(value=None, visible=True, label="🎬 Produção em progresso..."), step4_accordion: gr.update(visible=False)}
77
+ production_params = ProductionParams(trim_percent=int(trim_percent), handler_strength=handler_strength, destination_convergence_strength=dest_strength, guidance_scale=guidance_scale, stg_scale=stg_scale, inference_steps=int(steps))
78
+ final_video_path, latent_paths, updated_state = aduc.task_produce_original_movie(params=production_params, progress_callback=progress)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  updated_state_dict = updated_state.model_dump()
80
+ yield {original_video_output: gr.update(value=final_video_path, label="✅ Filme Original Master"), final_video_output: gr.update(value=final_video_path), step4_accordion: gr.update(visible=True, open=True), original_latents_paths_state: latent_paths, original_video_path_state: final_video_path, current_source_video_state: final_video_path, generation_state_holder: updated_state_dict, generation_data_output: updated_state_dict}
81
+
82
+ def run_upscaler_wrapper(latent_paths, chunk_size, progress=gr.Progress()):
83
+ if not latent_paths: raise gr.Error("Não é possível executar o Upscaler. Nenhum latente original encontrado.")
84
+ yield {upscaler_video_output: gr.update(value=None, visible=True, label="Fazendo upscale dos latentes..."), final_video_output: gr.update(label="Pós-Produção: Upscaler Latente...")}
85
+ final_path = None
86
+ for update in aduc.task_run_latent_upscaler(latent_paths, int(chunk_size), progress):
87
+ if "final_path" in update: final_path = update['final_path']
88
+ yield {upscaler_video_output: gr.update(value=final_path, label="✅ Upscale Latente Concluído"), final_video_output: gr.update(value=final_path), upscaled_video_path_state: final_path, current_source_video_state: final_path}
89
+
90
+ def run_hd_wrapper(source_video, model_version, steps, global_prompt, progress=gr.Progress()):
91
+ if not source_video: raise gr.Error("Não é possível executar a Masterização HD.")
92
+ yield {hd_video_output: gr.update(value=None, visible=True, label="Aplicando masterização HD..."), final_video_output: gr.update(label="Pós-Produção: Masterização HD...")}
93
+ final_path = None
94
+ for update in aduc.task_run_hd_mastering(source_video, model_version, int(steps), global_prompt, progress):
95
+ if "final_path" in update: final_path = update['final_path']
96
+ yield {hd_video_output: gr.update(value=final_path, label="✅ Masterização HD Concluída"), final_video_output: gr.update(value=final_path), hd_video_path_state: final_path, current_source_video_state: final_path}
97
+
98
+ def run_audio_wrapper(source_video, audio_prompt, global_prompt, progress=gr.Progress()):
99
+ if not source_video: raise gr.Error("Não é possível executar a Geração de Áudio.")
100
+ yield {audio_video_output: gr.update(value=None, visible=True, label="Gerando áudio e unindo..."), final_video_output: gr.update(label="Pós-Produção: Geração de Áudio...")}
101
+ final_audio_prompt = audio_prompt if audio_prompt and audio_prompt.strip() else global_prompt
102
+ final_path = None
103
+ for update in aduc.task_run_audio_generation(source_video, final_audio_prompt, progress):
104
+ if "final_path" in update: final_path = update['final_path']
105
+ yield {audio_video_output: gr.update(value=final_path, label="✅ Geração de Áudio Concluída"), final_video_output: gr.update(value=final_path)}
106
 
107
  def get_log_content():
108
  try:
109
+ with open(LOG_FILE_PATH, "r", encoding="utf-8") as f: return f.read()
110
+ except FileNotFoundError: return "Arquivo de log ainda não criado."
 
 
111
 
112
  # --- 3. DEFINIÇÃO DA UI GRADIO ---
113
  with gr.Blocks(theme=cinematic_theme, css="style.css") as demo:
 
 
114
  generation_state_holder = gr.State(value={})
115
+ original_latents_paths_state = gr.State(value=[])
 
 
116
  original_video_path_state = gr.State(value=None)
117
  current_source_video_state = gr.State(value=None)
118
  upscaled_video_path_state = gr.State(value=None)
 
146
  original_video_output = gr.Video(label="Filme Original Master", visible=False, interactive=False)
147
 
148
  with gr.Accordion("Etapa 4: Pós-Produção (Opcional)", open=False, visible=False) as step4_accordion:
149
+ gr.Markdown("Aplique efeitos de melhoria ao vídeo mais recente. Cada etapa usa o resultado da anterior como fonte.")
150
+ with gr.Accordion("A. Upscaler Latente 2x", open=True):
151
+ upscaler_chunk_size_slider = gr.Slider(minimum=1, maximum=10, value=2, step=1, label="Fragmentos por Lote")
152
+ run_upscaler_button = gr.Button("Executar Upscaler Latente", variant="secondary")
153
+ upscaler_video_output = gr.Video(label="Vídeo com Upscale", visible=False, interactive=False)
154
+ with gr.Accordion("B. Masterização HD (SeedVR)", open=True):
155
+ hd_model_radio = gr.Radio(["3B", "7B"], value="7B", label="Modelo SeedVR")
156
+ hd_steps_slider = gr.Slider(minimum=20, maximum=150, value=100, step=5, label="Passos de Inferência HD")
157
+ run_hd_button = gr.Button("Executar Masterização HD", variant="secondary")
158
+ hd_video_output = gr.Video(label="Vídeo Masterizado em HD", visible=False, interactive=False)
159
+ with gr.Accordion("C. Geração de Áudio", open=True):
160
+ audio_prompt_input = gr.Textbox(label="Prompt de Áudio Detalhado (Opcional)", lines=3, placeholder="Descreva os sons, efeitos e música desejados. Se vazio, usará o prompt geral do filme.")
161
+ run_audio_button = gr.Button("Gerar Áudio", variant="secondary")
162
+ audio_video_output = gr.Video(label="Vídeo com Áudio", visible=False, interactive=False)
163
 
164
  with gr.Accordion("🧬 DNA Digital da Geração (JSON)", open=False) as data_accordion:
165
  generation_data_output = gr.JSON(label="Estado de Geração Completo")
 
171
  update_log_button = gr.Button("Atualizar Log")
172
 
173
  # --- 4. CONEXÕES DE EVENTOS DA UI ---
174
+ storyboard_and_keyframes_button.click(fn=run_pre_production_wrapper, inputs=[prompt_input, num_keyframes_slider, ref_image_input, resolution_selector, duration_per_fragment_slider], outputs=[generation_state_holder, storyboard_output, keyframe_gallery, step3_accordion])
175
+ produce_original_button.click(fn=run_original_production_wrapper, inputs=[generation_state_holder, trim_percent_slider, handler_strength, dest_strength, guidance_scale_slider, stg_scale_slider, inference_steps_slider], outputs=[original_video_output, final_video_output, step4_accordion, original_latents_paths_state, original_video_path_state, current_source_video_state, generation_state_holder, generation_data_output])
176
 
177
+ run_upscaler_button.click(fn=run_upscaler_wrapper, inputs=[original_latents_paths_state, upscaler_chunk_size_slider], outputs=[upscaler_video_output, final_video_output, upscaled_video_path_state, current_source_video_state])
178
+ run_hd_button.click(fn=run_hd_wrapper, inputs=[current_source_video_state, hd_model_radio, hd_steps_slider, prompt_input], outputs=[hd_video_output, final_video_output, hd_video_path_state, current_source_video_state])
179
+ run_audio_button.click(fn=run_audio_wrapper, inputs=[current_source_video_state, audio_prompt_input, prompt_input], outputs=[audio_video_output, final_video_output])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
 
181
+ generation_state_holder.change(fn=lambda state: state, inputs=generation_state_holder, outputs=generation_data_output)
182
  update_log_button.click(fn=get_log_content, inputs=[], outputs=[log_display])
183
+
184
  # --- 5. INICIALIZAÇÃO DA APLICAÇÃO ---
185
  if __name__ == "__main__":
186
  if os.path.exists(WORKSPACE_DIR):
 
187
  shutil.rmtree(WORKSPACE_DIR)
188
  os.makedirs(WORKSPACE_DIR)
 
189
  logger.info("Aplicaç��o Gradio iniciada. Lançando interface...")
190
  demo.queue().launch()