Spaces:
Running
Running
import gradio as gr | |
import json | |
import re | |
import random | |
from openai import OpenAI | |
import fal_client | |
from pydantic import BaseModel | |
import os | |
from huggingface_hub import HfApi | |
# Environment variables from Hugging Face Secrets | |
api_key = os.environ.get('API_KEY') | |
api_base = os.environ.get('API_BASE') | |
FAL_KEY = os.environ.get('FAL_KEY') | |
# Initialize OpenAI client | |
client = OpenAI( | |
api_key=api_key, | |
base_url=api_base | |
) | |
model = "google/gemini-flash-1.5" | |
class MemeRequest(BaseModel): | |
domain: str | |
class MemeResponse(BaseModel): | |
image_url: str | |
top_text: str | |
bottom_text: str | |
def generate_meme(domain: str) -> MemeResponse: | |
""" | |
Generates a meme based on the given domain. | |
""" | |
temperature = round(random.uniform(0.5, 0.9), 2) | |
print(f"Temperature: {temperature}") | |
user_content = (f"Act like Non offensive meme maker. Always create different and unique funny memes " | |
f"always remember stable diffusion cannot render text natively hence, write prompt just detailing the scene or image without text " | |
f"Return meme details in below json format for topic {domain}\n\n" | |
"{ \"stableDiffusionPrompt\": \" \", \"topText\": \"\", \"bottomText\": \"\" }\n\n" | |
"Strictly just reply json no extra text") | |
try: | |
chat_completion = client.chat.completions.create( | |
messages=[ | |
{"role": "system", "content": "You are a helpful meme maker, who makes non offensive memes(Dont include Cat in memes)"}, | |
{"role": "user", "content": user_content} | |
], | |
model=model, | |
temperature=temperature | |
) | |
result = chat_completion.choices[0].message.content | |
try: | |
meme_data = json.loads(result) | |
except json.JSONDecodeError: | |
json_match = re.search(r'```json\s*(.*?)\s*```', result, re.DOTALL) | |
if json_match: | |
json_string = json_match.group(1) | |
meme_data = json.loads(json_string) | |
else: | |
raise ValueError("No valid JSON found in the response") | |
print(" Meme subject :",domain) | |
print("Stable Diffusion Prompt:", meme_data['stableDiffusionPrompt']) | |
print("Top Text:", meme_data['topText']) | |
print("Bottom Text:", meme_data['bottomText']) | |
# Configure fal_client with API key | |
fal_client.api_key = FAL_KEY | |
handler = fal_client.submit( | |
"fal-ai/flux/schnell", | |
arguments={ | |
"prompt": meme_data['stableDiffusionPrompt'], | |
"image_size": "landscape_4_3", | |
"num_inference_steps": 4, | |
"num_images": 1, | |
"enable_safety_checker": True | |
} | |
) | |
result = handler.get() | |
image_url = result['images'][0]['url'] | |
print("Generated Image URL:", image_url) | |
return MemeResponse( | |
top_text=meme_data['topText'], | |
image_url=image_url, | |
bottom_text=meme_data['bottomText'] | |
) | |
except Exception as e: | |
print(f"Error generating meme: {str(e)}") | |
raise | |
def generate_meme_gradio(domain): | |
""" | |
Wrapper function for Gradio interface. | |
""" | |
try: | |
meme_response = generate_meme(domain) | |
return meme_response.top_text, meme_response.image_url, meme_response.bottom_text | |
except Exception as e: | |
return "Error", None, f"Failed to generate meme: {str(e)}" | |
# Example domains for the interface | |
example_domains = [ | |
'HR', 'Technology', 'AI', 'Machine Learning', 'Sales', 'Marketing', | |
'Remote Work', 'Coffee', 'Monday', 'Deadlines', 'Office Pranks', 'Tech Support', | |
'Social Media', 'Startup Life', 'Zoom Fails', 'Work-Life Balance', 'Coding', | |
'Data Privacy', 'Cybersecurity', 'Cloud Computing', 'Blockchain', 'IoT', | |
'Virtual Reality', 'Augmented Reality', 'Quantum Computing', '5G', 'AI Ethics' | |
] | |
# Create Gradio interface | |
demo = gr.Interface( | |
fn=generate_meme_gradio, | |
inputs=[ | |
gr.Textbox( | |
label="Enter your meme topic", | |
value="Human Resource team", | |
placeholder="Type a topic or choose from examples below", | |
info="Try topics like 'AI', 'Remote Work', or 'Tech Support'" | |
) | |
], | |
outputs=[ | |
gr.Textbox(label="Top Text"), | |
gr.Image(label="Generated Meme"), | |
gr.Textbox(label="Bottom Text") | |
], | |
theme=gr.themes.Ocean(), | |
title="π¨ AI Meme Factory", | |
description=""" | |
Welcome to the AI Meme Factory! World's First Generative meme Engine. | |
Generate unique, funny, and non-offensive memes using the power of AI. | |
π€ Powered by: | |
- Gemini for creative text generation | |
- Flux for high-quality image generation | |
β¨ Features: | |
- Instant meme generation | |
- Professional and work-appropriate content | |
- Wide range of topics supported | |
""", | |
examples=[[domain] for domain in random.sample(example_domains, 6)], | |
allow_flagging="never", | |
cache_examples=False | |
) | |
# Launch the app | |
if __name__ == "__main__": | |
demo.launch(debug=True) |