npcGenerator / app.py
Logan Zoellner
fix comment
b12ef9e
raw history blame
No virus
7.23 kB
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)