lets_make_meme / app.py
ysharma's picture
ysharma HF Staff
update
3be8482
import gradio as gr
import os
import requests
import urllib
from os import path
import PIL
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import re
img_to_text = gr.Blocks.load(name="spaces/pharma/CLIP-Interrogator")
prompt_to_joke = gr.Blocks.load(name="spaces/ysharma/text_to_joke")
def driver(uploaded_image, prompt):
#get a joke based on the prompt
generated_joke = texttojoke_inference(prompt)
#write on the image
image0 = write_on_image(uploaded_image, generated_joke)
return image0
#get clip interrogator's prompt response
def clip_intero_inference(uploaded_image):
prompt = img_to_text(uploaded_image, fn_index=1)[0]
print(f"CLip interrogator prompt is : {prompt}")
return prompt
def texttojoke_inference(prompt):
generated_joke = prompt_to_joke(prompt)
print(f"Returned values from text_to_joke : {generated_joke}")
return generated_joke
def write_on_image(uploaded_image, joke):
image0 = Image.open(uploaded_image).convert("RGB").resize((512, 512))
I1 = ImageDraw.Draw(image0)
#cleaning ellipsis from joke
joke = re.sub(r'\.+', ".", joke)
lenjoke = len(joke)
#Cleaning and Splitting text for top and bottom
if joke[-1] == '.':
joke = joke[:-1]
if len(joke) < 45:
topline = joke
bottomline = ''
elif ('Q.' in joke) and ('A.' in joke):
topline = joke.split('?')[0] + '?'
bottomline = joke.split('?')[1]
elif '?' in joke:
topline = joke.split('?')[0] + '?'
bottomline = joke[len(joke.split('?')[0] + '?'):] #joke.split('?')[1]
elif '!' in joke:
topline = joke.split('!')[0]
#bottomline = joke.split('.')[1]
bottomline = joke[len(joke.split('!')[0])+1:]
elif '.' in joke:
topline = joke.split('.')[0]
#bottomline = joke.split('.')[1]
bottomline = joke[len(joke.split('.')[0])+1:]
else:
numwords = len(joke.split())
numwordstop = int(numwords/2)
topline = ' '.join(joke.split()[:numwordstop])
bottomline = ' '.join(joke.split()[numwordstop:])
print(f"Joke is : {joke}")
print(f"top line is : {topline }")
print(f"bottom line is : {bottomline }")
if len(topline.split()) <= 3:
I1.text((114, 14), topline, font=set_font(topline), fill =(255, 255, 255))
elif len(topline.split()) <= 6:
I1.text((74, 14), topline, font=set_font(topline), fill =(255, 255, 255))
else:
I1.text((14, 14), topline, font=set_font(topline), fill =(255, 255, 255))
if len(bottomline.split()) <= 3:
I1.text((114, 454), bottomline, font=set_font(bottomline), fill =(255, 255, 255))
elif len(bottomline.split()) <= 6:
I1.text((74, 454), bottomline, font=set_font(bottomline), fill =(255, 255, 255))
else:
I1.text((14, 454), bottomline, font=set_font(bottomline), fill =(255, 255, 255))
return image0 #, new_prompt
def set_font(line):
#SETTING UP FONT SIZE
length_line = len(line)
if length_line < 35 :
fontsize = 30
elif length_line < 45 :
fontsize = 25
elif length_line < 55 :
fontsize = 22
elif length_line < 65 :
fontsize = 18
elif length_line < 75 :
fontsize = 16
elif length_line < 80 :
fontsize = 14
elif length_line < 85 :
fontsize = 13
elif length_line < 95:
fontsize = 12
elif length_line < 110:
fontsize = 11
elif length_line < 130:
fontsize = 10
else:
fontsize = 8
myfont = ImageFont.truetype('./font1.ttf', fontsize)
return myfont
with gr.Blocks() as demo:
gr.Markdown("<h1><center>Meme your Image</center></h1>")
gr.Markdown(
"""<div align="center">First, generate image description using <a href="https://huggingface.co/spaces/pharma/CLIP-Interrogator">pharma/CLIP-Interrogator</a>, then fetch a joke using my own <a href="https://huggingface.co/spaces/ysharma/text_to_joke">ysharma/text_to_joke</a>. If you see the message "Error in model inference - Run Again Please", just press the 'Get Meme' button again every time!<br><br><b>How to use:</b> Press <b>Get Prompts</b>, wait for generated prompt, and then <b>Get Meme</b> buttons to get the final Meme!</div>
""")
with gr.Row():
in_image = gr.Image(type="filepath")
with gr.Row():
b1 = gr.Button("Get Prompts")
b2 = gr.Button("Get Meme")
with gr.Row():
out_prompt = gr.Textbox()
out_image = gr.Image()
#out_dataframe = gr.Dataframe(wrap=True, datatype = ["str", "str", "markdown", "markdown", "str"])
#b1.click(fn=driver, inputs=in_image, outputs=out_image)
b1.click(fn=clip_intero_inference, inputs=in_image, outputs=out_prompt)
b2.click(fn=driver, inputs=[in_image, out_prompt], outputs=out_image)
with gr.Row():
gr.Markdown(
"""Please keep in mind a few caveats while using this Space:<br>1. Kindly note that sometimes the joke might be NSFW. Although, I have tried putting in filters to avoid that experience, however, the filters seem non-exhaustive.<br>2. Sometimes the joke might not match your theme, please bear with the limited capabilities of free open-source ML prototypes.<br>3. Much like real life, sometimes the joke might just not land, haha!<br>4. Run time depends on the load on the underlying spaces at the time.
""")
demo.queue(concurrency_count=3)
demo.launch(debug=True, show_error=True, enable_queue=True)