Meme__Factory / app.py
Xhaheen's picture
Update app.py
477193a verified
raw
history blame
5.15 kB
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)