import gradio as gr import re from diffusers import StableDiffusionPipeline import torch from transformers import pipeline # Carregue modelos (cache para performance) device = "cuda" if torch.cuda.is_available() else "cpu" pipe = StableDiffusionPipeline.from_pretrained( "runwayml/stable-diffusion-v1-5", dtype=torch.float16 if device == "cuda" else torch.float32 # Corrigido: dtype em vez de torch_dtype ) pipe = pipe.to(device) # Removido: pipe.enable_model_cpu_offload() # Isso causava o erro; opcional, mas não essencial aqui extractor = pipeline("token-classification", model="valurank/MiniLM-L6-Keyword-Extraction") def gerar_storyboard(roteiro, num_cenas=4, steps=20, guidance=7.5, estilos_customizados=""): # Passo 1: Divida o roteiro em cenas cenas = re.split(r'(?=CENA \d+:|Seção:|\n[A-Z][a-z]+:)', roteiro)[:num_cenas] # Regex melhorada pra capturar seções como "A Invenção Invisível" cenas = [c.strip() for c in cenas if c.strip()] imagens = [] for cena in cenas: # Passo 2: Extraia keywords keywords = [ent['word'] for ent in extractor(cena)[:5]] # Passo 3: Construa o prompt base prompt = f"Storyboard scene: {', '.join(keywords)}, cinematic, detailed, historical style" # Adicione estilos customizados (se fornecidos, senão usa vazio) if estilos_customizados.strip(): prompt += f", {estilos_customizados}" print(f"Prompt gerado para cena: {prompt}") # Log pra debug (remove se quiser) # Passo 4: Gere imagem with torch.autocast(device): img = pipe(prompt, num_inference_steps=steps, guidance_scale=guidance).images[0] imagens.append(img) return imagens # Interface Gradio com a nova Textbox with gr.Blocks(title="Roteiro to Storyboard") as demo: gr.Markdown("# Gere Storyboards do Seu Roteiro com IA") with gr.Row(): roteiro_input = gr.Textbox(label="Cole seu roteiro aqui", lines=10, placeholder="Ex: Máquina de Lavar – A Batalha Silenciosa...") with gr.Row(): num_cenas = gr.Slider(2, 10, value=5, label="Número de Cenas") steps = gr.Slider(10, 50, value=15, label="Passos de Inferência (qualidade vs. velocidade)") # Default menor pra acelerar guidance = gr.Slider(1, 20, value=7.5, label="Guidance Scale (criatividade)") # Nova Textbox para estilos estilos_input = gr.Textbox( label="Estilos Personalizados (opcional)", lines=2, placeholder="Ex: vintage washing machine, industrial revolution style, era vitoriana, vapor e engrenagens" ) output = gr.Gallery(label="Storyboards Gerados") gerar_btn = gr.Button("Gerar Storyboard", variant="primary") # Conecte tudo à função gerar_btn.click( gerar_storyboard, inputs=[roteiro_input, num_cenas, steps, guidance, estilos_input], outputs=output ) if __name__ == "__main__": demo.launch()