JairoDanielMT's picture
Update app.py
b3fff1d verified
import gradio as gr
import random
import json
from typing import List, Dict, Any
def cargar_json(ruta: str) -> Any:
"""Carga datos desde un archivo JSON."""
try:
with open(ruta, "r") as f:
return json.load(f)
except (FileNotFoundError, json.JSONDecodeError) as e:
raise RuntimeError(f"Error al cargar el archivo {ruta}: {e}")
def aplicar_peso(termino: str) -> str:
"""Aplica un peso aleatorio al t茅rmino si no contiene ':'."""
peso = round(random.uniform(0.8, 1.5), 1) if ":" not in termino else ""
return f"({termino}:{peso})" if peso else f"({termino})"
def generar_prompt(personaje: Dict[str, Any], categorias: Dict[str, List[str]]) -> str:
"""Genera un prompt basado en un personaje y categor铆as aleatorias."""
atributos = {
"peinado": "hairstyle",
"ropa": "outfit",
"escenario": "scenario",
"emocion": "emotion",
"pose": "pose",
"angle": "angle",
"distance": "distance",
"extras": lambda: ", ".join(
aplicar_peso(extra)
for extra in random.sample(categorias["extras"], k=random.randint(1, 2))
),
"iluminacion": "lighting",
"elementos_especiales": "special_elements",
}
elementos = {
key: aplicar_peso(
random.choice(categorias[val]) if isinstance(val, str) else val()
)
for key, val in atributos.items()
if key != "extras"
}
elementos["extras"] = atributos["extras"]()
prompt = (
f"{personaje['name']}, "
f"{elementos['peinado']}, "
f"wearing {elementos['ropa']}. Positioned in a {elementos['escenario']}, "
f"striking a pose of {elementos['pose']}, feeling {elementos['emocion']}. "
f"Scene elements include {elementos['extras']}, "
f"{elementos['angle']}, {elementos['distance']}, "
f"{elementos['iluminacion']}, {elementos['elementos_especiales']}, "
f"masterpiece, high score, great score, absurdres, best quality, highres"
)
return prompt
def obtener_prompt(
nombre: str, personajes: List[Dict[str, Any]], categorias: Dict[str, List[str]]
) -> str:
"""Obtiene un prompt y muestra el estado del personaje seleccionado."""
personaje = next((p for p in personajes if p["name"] == nombre), None)
if not personaje:
return "No se encontr贸 el personaje seleccionado."
# Asignar colores seg煤n el estado
colores = {
"recognized": "green",
"partial": "yellow",
"not recognized": "red",
}
estado = personaje["status"]
color = colores.get(estado, "black")
prompt = generar_prompt(personaje, categorias)
return f"<p style='color:{color};'>Estado: {estado.capitalize()}</p>{prompt}"
# Carga los datos JSON
try:
personajes = cargar_json("character_final.json")
categorias = cargar_json("categories.json")
except RuntimeError as e:
print(e)
personajes = []
categorias = {}
# Lista de nombres para el Dropdown
nombres_personajes = [p["name"] for p in personajes]
# Interfaz de Gradio
with gr.Blocks() as interfaz:
gr.Markdown("# Generador de Prompts para Personajes")
dropdown = gr.Dropdown(
label="Selecciona un personaje",
choices=nombres_personajes,
interactive=True,
)
resultado = gr.HTML(label="Prompt generado")
boton = gr.Button("Generar Prompt")
boton.click(
obtener_prompt,
inputs=[dropdown, gr.State(personajes), gr.State(categorias)],
outputs=resultado,
)
# Ejecutar la aplicaci贸n
interfaz.launch()