|
import gradio as gr
|
|
import random
|
|
import json
|
|
from typing import List, Dict, Any
|
|
import pyperclip
|
|
|
|
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)
|
|
|
|
pyperclip.copy(prompt)
|
|
return f"<p style='color:{color};'>Estado: {estado.capitalize()}</p>{prompt}"
|
|
|
|
|
|
|
|
personajes = cargar_json("character_final.json")
|
|
categorias = cargar_json("categories.json")
|
|
|
|
|
|
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()
|
|
|