npcGenerator / app.py
Logan Zoellner
fix comment
b12ef9e
from asyncio import constants
import gradio as gr
import requests
import os
import re
import random
from words import *
from base64 import b64decode
from PIL import Image
import io
import numpy as np
# GPT-J-6B API
API_URL = "https://api-inference.huggingface.co/models/EleutherAI/gpt-j-6B"
#HF_TOKEN = os.environ["HF_TOKEN"]
#headers = {"Authorization": f"Bearer {HF_TOKEN}"}
prompt = """
Bilbo is a hobbit rogue who wears a brown cloak and carries a ring.
Bremen is a human wizard, he wears a blue robe and carries a wand.
"""
examples = [["river"], ["night"], ["trees"],["table"],["laughs"]]
def npc_randomize():
#name is a random combination of syllables
name =""
for i in range(random.randint(2,4)):
name += random.choice(constants)
name += random.choice(vowels)
if random.random()<0.5:
name += random.choice(constants)
if random.random()<0.1:
name += random.choice(seperators)
#capitalize first letter
name = name[0].upper() + name[1:]
race=random.choice(races)
characterClass=random.choice(classes)
pronoun=random.choices(["he","she","they"],weights=[0.45,0.45,0.1],k=1)[0]
return name,race,characterClass,pronoun
def genericDescription():
desc=" wears a {color} {outfit}".format(color=random.choice(colors),outfit=random.choice(outfits))
if random.random()<0.5:
desc+=" and a {color} {outfit}".format(color=random.choice(colors),outfit=random.choice(outfits))
if random.random()<0.5:
desc+=" and carries a {weapon}".format(weapon=random.choice(weapons))
elif random.random()<0.5:
desc+=" and carries a {weapon} and a {object}".format(weapon=random.choice(weapons),object=random.choice(objects))
else:
desc+=" and carries two {weapon}s".format(weapon=random.choice(weapons))
return desc
def npc_generate(name,race,characterClass,pronoun):
desc="{name} is a {race} {characterClass}, {pronoun}".format(name=name,race=race,characterClass=characterClass,pronoun=pronoun)
p = prompt + "\n"+desc
print(f"*****Inside desc_generate - Prompt is :{p}")
json_ = {"inputs": p,
"parameters":
{
"top_p": 0.9,
"temperature": 1.1,
"max_new_tokens": 50,
"return_full_text": False,
}}
#response = requests.post(API_URL, headers=headers, json=json_)
response = requests.post(API_URL, json=json_)
output = response.json()
print(f"If there was an error? Reason is : {output}")
#error handling
if "error" in output:
print("using fallback description method!")
#fallback method
longDescription=genericDescription()
else:
output_tmp = output[0]['generated_text']
print(f"GPTJ response without splits is: {output_tmp}")
if "\n\n" not in output_tmp:
if output_tmp.find('.') != -1:
idx = output_tmp.find('.')
longDescription = output_tmp[:idx+1]
else:
idx = output_tmp.rfind('\n')
longDescription = output_tmp[:idx]
else:
longDescription = output_tmp.split("\n\n")[0] # +"."
longDescription = longDescription.replace('?','')
print(f"longDescription being returned is: {longDescription}")
return desc+longDescription
def desc_to_image(desc):
print("*****Inside desc_to_image")
desc = " ".join(desc.split('\n'))
desc = desc + ", character art, concept art, artstation"
steps, width, height, images, diversity = '50','256','256','1',15
iface = gr.Interface.load("spaces/multimodalart/latentdiffusion")
print("about to die",iface,dir(iface))
prompt = re.sub(r'[^a-zA-Z0-9 ,.]', '', desc)
print("about to die",prompt)
img=iface(desc, steps, width, height, images, diversity)[0]
return img
def desc_to_image_dalle(desc):
print("*****Inside desc_to_image")
desc = " ".join(desc.split('\n'))
desc = desc + ", character art, concept art, artstation"
steps, width, height, images, diversity = '50','256','256','1',15
#iface = gr.Interface.load("huggingface/flax-community/dalle-mini")#this isn't a real interface
iface = gr.Interface.load("spaces/multimodalart/rudalle")
print("about to die",iface,dir(iface))
prompt = re.sub(r'[^a-zA-Z0-9 ,.]', '', desc)
print("about to die",prompt)
model='Realism'
aspect_ratio = 'Square'
#img=iface(desc,model,aspect_ratio)[0]
result=iface(desc,"Square","Realism")
print(f"result is: {result}")
return result[0]
def desc_to_image_cf(desc):
cf = gr.Interface.load("spaces/Gradio-Blocks/clip-guided-faces")
print("about to die",cf)
text=desc
init_image=None
skip_timesteps=0
clip_guidance_scale=600
tv_scale=0
range_scale=0
init_scale=0
seed=0
image_prompts=None
timestep_respacing= 25
cutn=16
im_prompt_weight =1
result = cf.fns[0].fn(text, init_image, skip_timesteps, clip_guidance_scale, tv_scale, range_scale, init_scale, seed, image_prompts,timestep_respacing, cutn, im_prompt_weight)
#convert result from dataurl to image
img=result[0]
header, encoded = img.split(",", 1)
data = b64decode(encoded)
image = Image.open(io.BytesIO(data))
image_np = np.array(image)
return image_np
demo = gr.Blocks()
with demo:
gr.Markdown("<h1><center>NPC Generator</center></h1>")
gr.Markdown(
"based on <a href=https://huggingface.co/spaces/Gradio-Blocks/GPTJ6B_Poetry_LatentDiff_Illustration> Gradio poetry generator</a>."
"<div>first input name, race and class (or generate them randomly)</div>"
"<div>Next, use GPT-J to generate a short description</div>"
"<div>Finally, Generate an illustration 🎨 provided by <a href=https://huggingface.co/spaces/multimodalart/latentdiffusion>Latent Diffusion model</a>.</div>"
#"<div>Or using <a href=https://huggingface.co/spaces/multimodalart/rudalle> Rudalle model</a>.</div>"
"<div>Or using <a href=https://huggingface.co/spaces/Gradio-Blocks/clip-guided-faces> clip-guides faces</a>.</div>"
)
with gr.Row():
b0 = gr.Button("Randomize name,race and class")
b1 = gr.Button("Generate NPC Description")
b2 = gr.Button("Generate Portrait (latent diffusion)")
b3 = gr.Button("Generate Portrait (clip-faces)")
with gr.Row():
input_name = gr.Textbox(label="name",placeholder="Drizzt")
input_race = gr.Textbox(label="race",placeholder="dark elf")
input_class = gr.Textbox(label="class",placeholder="ranger")
input_pronoun = gr.Textbox(label="pronoun",placeholder="he")
with gr.Row():
desc_txt = gr.Textbox(label="description",lines=7)
output_image = gr.Image(label="portrait",type="filepath", shape=(256,256))
b0.click(npc_randomize,inputs=[],outputs=[input_name,input_race,input_class,input_pronoun])
b1.click(npc_generate, inputs=[ input_name,input_race,input_class,input_pronoun], outputs=desc_txt)
b2.click(desc_to_image, desc_txt, output_image)
b3.click(desc_to_image_cf, desc_txt, output_image)
#examples=examples
demo.launch(enable_queue=True, debug=True)