Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -2,7 +2,7 @@ import gradio as gr
|
|
| 2 |
import re
|
| 3 |
from diffusers import StableDiffusionPipeline
|
| 4 |
import torch
|
| 5 |
-
from transformers import pipeline
|
| 6 |
|
| 7 |
# Carregue modelos (cache para performance)
|
| 8 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
|
@@ -11,39 +11,64 @@ pipe = StableDiffusionPipeline.from_pretrained(
|
|
| 11 |
torch_dtype=torch.float16 if device == "cuda" else torch.float32
|
| 12 |
)
|
| 13 |
pipe = pipe.to(device)
|
|
|
|
| 14 |
|
| 15 |
extractor = pipeline("token-classification", model="valurank/MiniLM-L6-Keyword-Extraction")
|
| 16 |
|
| 17 |
-
def gerar_storyboard(roteiro, num_cenas=4, steps=20, guidance=7.5):
|
| 18 |
# Passo 1: Divida o roteiro em cenas
|
| 19 |
-
cenas = re.split(r'(?=CENA \d+:|Seção
|
| 20 |
cenas = [c.strip() for c in cenas if c.strip()]
|
| 21 |
|
| 22 |
-
# Passo 2: Extraia prompts visuais por cena
|
| 23 |
imagens = []
|
| 24 |
for cena in cenas:
|
|
|
|
| 25 |
keywords = [ent['word'] for ent in extractor(cena)[:5]]
|
| 26 |
-
prompt = f"Storyboard scene: {', '.join(keywords)}, cinematic, detailed, historical style" # Adapte para tema (ex.: "máquina de lavar antiga")
|
| 27 |
|
| 28 |
-
# Passo 3:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
with torch.autocast(device):
|
| 30 |
img = pipe(prompt, num_inference_steps=steps, guidance_scale=guidance).images[0]
|
| 31 |
imagens.append(img)
|
| 32 |
|
| 33 |
-
return imagens
|
| 34 |
|
| 35 |
-
# Interface Gradio
|
| 36 |
with gr.Blocks(title="Roteiro to Storyboard") as demo:
|
| 37 |
gr.Markdown("# Gere Storyboards do Seu Roteiro com IA")
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
|
| 43 |
output = gr.Gallery(label="Storyboards Gerados")
|
| 44 |
-
gerar_btn = gr.Button("Gerar Storyboard")
|
| 45 |
|
| 46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
|
| 48 |
if __name__ == "__main__":
|
| 49 |
demo.launch()
|
|
|
|
| 2 |
import re
|
| 3 |
from diffusers import StableDiffusionPipeline
|
| 4 |
import torch
|
| 5 |
+
from transformers import pipeline
|
| 6 |
|
| 7 |
# Carregue modelos (cache para performance)
|
| 8 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
|
|
|
| 11 |
torch_dtype=torch.float16 if device == "cuda" else torch.float32
|
| 12 |
)
|
| 13 |
pipe = pipe.to(device)
|
| 14 |
+
pipe.enable_model_cpu_offload() # Otimização pra acelerar e economizar memória
|
| 15 |
|
| 16 |
extractor = pipeline("token-classification", model="valurank/MiniLM-L6-Keyword-Extraction")
|
| 17 |
|
| 18 |
+
def gerar_storyboard(roteiro, num_cenas=4, steps=20, guidance=7.5, estilos_customizados=""):
|
| 19 |
# Passo 1: Divida o roteiro em cenas
|
| 20 |
+
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"
|
| 21 |
cenas = [c.strip() for c in cenas if c.strip()]
|
| 22 |
|
|
|
|
| 23 |
imagens = []
|
| 24 |
for cena in cenas:
|
| 25 |
+
# Passo 2: Extraia keywords
|
| 26 |
keywords = [ent['word'] for ent in extractor(cena)[:5]]
|
|
|
|
| 27 |
|
| 28 |
+
# Passo 3: Construa o prompt base
|
| 29 |
+
prompt = f"Storyboard scene: {', '.join(keywords)}, cinematic, detailed, historical style"
|
| 30 |
+
|
| 31 |
+
# Adicione estilos customizados (se fornecidos, senão usa vazio)
|
| 32 |
+
if estilos_customizados.strip():
|
| 33 |
+
prompt += f", {estilos_customizados}"
|
| 34 |
+
|
| 35 |
+
print(f"Prompt gerado para cena: {prompt}") # Log pra debug (remove se quiser)
|
| 36 |
+
|
| 37 |
+
# Passo 4: Gere imagem
|
| 38 |
with torch.autocast(device):
|
| 39 |
img = pipe(prompt, num_inference_steps=steps, guidance_scale=guidance).images[0]
|
| 40 |
imagens.append(img)
|
| 41 |
|
| 42 |
+
return imagens
|
| 43 |
|
| 44 |
+
# Interface Gradio com a nova Textbox
|
| 45 |
with gr.Blocks(title="Roteiro to Storyboard") as demo:
|
| 46 |
gr.Markdown("# Gere Storyboards do Seu Roteiro com IA")
|
| 47 |
+
|
| 48 |
+
with gr.Row():
|
| 49 |
+
roteiro_input = gr.Textbox(label="Cole seu roteiro aqui", lines=10, placeholder="Ex: Máquina de Lavar – A Batalha Silenciosa...")
|
| 50 |
+
|
| 51 |
+
with gr.Row():
|
| 52 |
+
num_cenas = gr.Slider(2, 10, value=5, label="Número de Cenas")
|
| 53 |
+
steps = gr.Slider(10, 50, value=15, label="Passos de Inferência (qualidade vs. velocidade)") # Default menor pra acelerar
|
| 54 |
+
guidance = gr.Slider(1, 20, value=7.5, label="Guidance Scale (criatividade)")
|
| 55 |
+
|
| 56 |
+
# Nova Textbox para estilos
|
| 57 |
+
estilos_input = gr.Textbox(
|
| 58 |
+
label="Estilos Personalizados (opcional)",
|
| 59 |
+
lines=2,
|
| 60 |
+
placeholder="Ex: vintage washing machine, industrial revolution style, era vitoriana, vapor e engrenagens"
|
| 61 |
+
)
|
| 62 |
|
| 63 |
output = gr.Gallery(label="Storyboards Gerados")
|
| 64 |
+
gerar_btn = gr.Button("Gerar Storyboard", variant="primary")
|
| 65 |
|
| 66 |
+
# Conecte tudo à função
|
| 67 |
+
gerar_btn.click(
|
| 68 |
+
gerar_storyboard,
|
| 69 |
+
inputs=[roteiro_input, num_cenas, steps, guidance, estilos_input],
|
| 70 |
+
outputs=output
|
| 71 |
+
)
|
| 72 |
|
| 73 |
if __name__ == "__main__":
|
| 74 |
demo.launch()
|