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"

Estado: {estado.capitalize()}

{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()