|
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." |
|
|
|
|
|
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}" |
|
|
|
|
|
|
|
try: |
|
personajes = cargar_json("character_final.json") |
|
categorias = cargar_json("categories.json") |
|
except RuntimeError as e: |
|
print(e) |
|
personajes = [] |
|
categorias = {} |
|
|
|
|
|
nombres_personajes = [p["name"] for p in personajes] |
|
|
|
|
|
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, |
|
) |
|
|
|
|
|
interfaz.launch() |