File size: 3,698 Bytes
e1339c7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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."

    # 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)
    # copiar al portapapeles
    pyperclip.copy(prompt)
    return f"<p style='color:{color};'>Estado: {estado.capitalize()}</p>{prompt}"


# Carga los datos JSON
personajes = cargar_json("character_final.json")
categorias = cargar_json("categories.json")

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