DnDItem / app.py
Bryan Wade
better defaults
ed4c076
#!/usr/bin/env python
# coding: utf-8
import os
import openai
import gradio as gr
import torch
from diffusers import StableDiffusionPipeline
from torch import autocast
from contextlib import nullcontext
#from PIL import Image
#from torchvision import transforms
openai.api_key = os.getenv('openaikey')
authtoken = os.getenv('authtoken')
device = "cuda" if torch.cuda.is_available() else "cpu"
context = autocast if device == "cuda" else nullcontext
dtype = torch.float16 if device == "cuda" else torch.float32
pipe = StableDiffusionPipeline.from_pretrained("stale2000/sd-dnditem", torch_dtype=dtype, use_auth_token=authtoken)
pipe = pipe.to(device)
disable_safety = True
if disable_safety:
def null_safety(images, **kwargs):
return images, False
pipe.safety_checker = null_safety
def create_files():
directory = 'C:\\Users\\brcwa\\OneDrive\\Desktop\\destinyCaptures\\dnd\\fullcaptionsimple\\full'
for filename2 in os.listdir(directory):
if not filename2.endswith('txt'):
continue
f = os.path.join(directory, filename2)
# checking if it is a file
if os.path.isfile(f):
text_file = open(f, "r")
lines = text_file.read()
print(lines.split(',')[1] + "," + lines.split(',')[1])
#create_files()
def createGPTPrompt(item_type, description):
return item_type.split(",")[0].split(" ")[-1] + " of " + description
def convert_lines(lines):
key_arr = []
key_hash = {}
for line in lines:
key = line.split(",")[0]
val = line.split(",")[1]
key_arr.append(key)
key_hash[key] = val
return key_arr, key_hash
def predict(dropdown, style_dropdown, manual_gpt_replacement, manual_sd_prompt, n_samples, history=[]):
# gpt3
sd_input = ""
gpt_input = ""
description = style_dropdown
if manual_sd_prompt != '':
gpt_input = manual_gpt_replacement
else:
gpt_input = "Describe the mechanics of a 5th Edition DnD item called '" + createGPTPrompt(dropdown, description) + "' :"
if manual_sd_prompt != '':
sd_input = manual_sd_prompt
else:
sd_input = "dnditem, " + dropdown + ", " + style_hashmap[style_dropdown] + ", circle inner background and white outerbackground"
response = openai.Completion.create(
model="text-davinci-003",
prompt=gpt_input,
temperature=0.9,
max_tokens=200,
top_p=1,
frequency_penalty=0,
presence_penalty=0.6)
# tokenize the new input sentence
responseText = response["choices"][0]["text"]
history.append((sd_input, responseText))
#img generation
scale = 5.5
#with autocast("cuda"):
# images = pipe(n_samples*[prompt], guidance_scale=scale).images
with context("cuda"):
images = pipe(n_samples*[sd_input], guidance_scale=scale, num_inference_steps=40).images
return history, history, images
#inputText = gr.Textbox(placeholder="input query")
manual_gpt_query = gr.Textbox(placeholder="Input any query here, to replace the gpt query builder entirely.")
manual_sd_prompt = gr.Textbox(placeholder="Input any query here, to replace the gpt query builder entirely.")
choiceArr = ["a pair of boots", "a cloak", "a pair of gloves", "a helmet", "a necklace", "a ring", "a robe", "a rod", "a shield", "a staff", "a sword", "a wand"]
dropdown = gr.Dropdown(label= "Item Type", choices=choiceArr, value="a pair of boots")
text_file = open("styles.txt", "r")
lines = text_file.read().split('\n')
dropdown_arr, style_hashmap = convert_lines(lines)
style_dropdown = gr.Dropdown(label= "Item Ability and Style", choices=dropdown_arr, value="ultimate evil")
output_img = gr.Gallery(label="Generated image")
output_img.style(grid=2)
step_slide = gr.Slider(1, 4, value=2, step=1),
slide = gr.Slider(label="Number of Images Generated", minimum=1, maximum=4, value=2, step=1)
gr.Interface(fn=predict,
inputs=[dropdown, style_dropdown, manual_gpt_query,manual_sd_prompt,slide,'state'],
outputs=["chatbot",'state', output_img]).launch()