[Mão na Massa] Aplicação com Stable Diffusion no estilo “Dark Fantasy”
Olá, pessoal!
Estou avançando nos estudos com IA aqui na Alura e gostaria de compartilhar o resultado de um exercício prático que desenvolvi com apoio do conteúdo do curso e da ajuda do ChatGPT.
A proposta era criar uma aplicação visual para que os funcionários de uma agência de marketing pudessem gerar imagens com o modelo Stable Diffusion, mas com um detalhe: todas as imagens deveriam seguir o estilo “dark fantasy”, mantendo uma identidade visual consistente.
Como ainda estou aprendendo, optei por seguir o caminho mais simples e funcional para mim neste momento, usando o Streamlit junto da API da Stability AI. A aplicação permite que o usuário insira um prompt e, automaticamente, o estilo "dark fantasy" é adicionado ao comando enviado ao modelo.
Tecnologias utilizadas:
- Python
- Streamlit
- Requests
- API da Stability AI (Stable Diffusion)
-
.env
para proteger a chave da API
Código resumido (app.py
):
import streamlit as st
import requests, os, base64
from dotenv import load_dotenv
from PIL import Image
from io import BytesIO
load_dotenv()
API_KEY = os.getenv("STABILITY_API_KEY")
def gerar_imagem(prompt):
headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
prompt_estilizado = f"{prompt}, dark fantasy style, highly detailed, cinematic lighting"
body = {
"text_prompts": [{"text": prompt_estilizado}],
"cfg_scale": 7, "height": 512, "width": 512,
"samples": 1, "steps": 30,
}
r = requests.post(
"https://api.stability.ai/v1/generation/stable-diffusion-v1-6/text-to-image",
headers=headers, json=body
)
if r.status_code == 200:
img_base64 = r.json()["artifacts"][0]["base64"]
return Image.open(BytesIO(base64.b64decode(img_base64)))
else:
st.error(f"Erro: {r.status_code}")
return None
st.title("Gerador de Imagens Dark Fantasy")
prompt = st.text_input("Descreva a imagem que deseja:")
if st.button("Gerar Imagem"):
if prompt.strip():
with st.spinner("Gerando..."):
img = gerar_imagem(prompt)
if img: st.image(img, caption="Imagem gerada!")
else:
st.warning("Digite um prompt.")
Outras dicas:
Criei um arquivo .env para armazenar minha chave da API:
STABILITY_API_KEY=sua_chave_aqui
Para rodar a aplicação:
streamlit run app.py
O que aprendi:
Como usar o Streamlit para montar interfaces simples.
Como consumir uma API externa (Stability AI).
Como enriquecer automaticamente um prompt com estilo visual.
Como proteger chaves com o .env.
Gostaria de saber:
Como posso melhorar essa aplicação?
Existe uma forma mais elegante ou eficiente de modularizar o código?
Alguma dica para lidar com erros ou melhorar a usabilidade?
Agradeço a todos que lerem ou comentarem. Estou comprometido em aprender e contribuir também com o que puder!