Baith-al-suroor / app.py
Xhaheen's picture
Update app.py
8eee1ba verified
import gradio as gr
import io
import os
import warnings
from PIL import Image
from stability_sdk import client
import stability_sdk.interfaces.gooseai.generation.generation_pb2 as generation
import google.generativeai as genai
genai.configure(api_key=os.environ['genai_img'])
# Replace with your API key
stability_api = client.StabilityInference(
key=os.environ['STABILITY_KEY'],
verbose=True,
engine="stable-diffusion-xl-1024-v1-0", # You can experiment with different engines
)
def generate_image_from_text(prompt):
"""Generates an image from a text prompt."""
try:
answers = stability_api.generate(
prompt=prompt,
seed=12345, # You can adjust the seed for different results
steps=30, # Adjust the number of steps for quality/speed trade-off
cfg_scale=8.0,
width=512, # Adjust width and height as needed
height=512,
sampler=generation.SAMPLER_K_DPMPP_2M
)
for resp in answers:
for artifact in resp.artifacts:
if artifact.finish_reason == generation.FILTER:
warnings.warn("Safety filter triggered. Please modify the prompt.")
return None
if artifact.type == generation.ARTIFACT_IMAGE:
img = Image.open(io.BytesIO(artifact.binary))
return img
except Exception as e:
print(f"Error during image generation: {e}")
return None
def generate_image_from_image(init_image, start_schedule, prompt):
"""Generates an image using the provided initial image, start schedule, and prompt."""
try:
answers = stability_api.generate(
prompt=prompt,
init_image=init_image,
start_schedule=start_schedule,
seed=12345, # You can adjust the seed for different results
steps=30, # Adjust the number of steps for quality/speed trade-off
cfg_scale=8.0,
width=512, # Adjust width and height as needed
height=512,
sampler=generation.SAMPLER_K_DPMPP_2M
)
for resp in answers:
for artifact in resp.artifacts:
if artifact.finish_reason == generation.FILTER:
warnings.warn("Safety filter triggered. Please modify the prompt.")
return None
if artifact.type == generation.ARTIFACT_IMAGE:
img = Image.open(io.BytesIO(artifact.binary))
return img
except Exception as e:
print(f"Error during image generation: {e}")
return None
# Placeholder for model loading (explained later)
def load_model():
# Replace with your Google Generative AI (GenAI) model loading logic
# Here's an example structure (assuming GenAI is available):
import pathlib
# Set up the model (replace with your actual API key and model name)
generation_config = {
"temperature": 1,
"top_p": 0.95,
"top_k": 64,
"max_output_tokens": 8192,
}
safety_settings = [
{
"category": "HARM_CATEGORY_HARASSMENT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
},
{
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
},
{
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
},
]
model = genai.GenerativeModel(
model_name="gemini-1.5-pro-latest",
generation_config=generation_config,
safety_settings=safety_settings,
)
return model
# Function to handle user input and model interaction
def chat(image, query):
# Load the model on the first call
if not hasattr(chat, 'model'):
chat.model = load_model()
# Process the image (replace with your image processing logic)
# Here's a placeholder for potential image processing:
processed_image = image # Assuming no processing needed for now
# Start or continue the conversation
convo = chat.model.start_chat(history=[
{
"role": "user",
"parts": [processed_image],
},
])
response = convo.send_message(query)
# return str(response)
print(response)
return response.text
# Extract only the text content from the response
# Gradio interface definition
chat_interface = gr.Interface(
fn=chat,
inputs=[gr.Image(type="pil"), gr.Textbox(lines=4)],
outputs="text",
title="Sustainable Interior Design Chatbot",
description="Ask the AI for sustainable design suggestions based on an image of your room.",
)
with gr.Blocks() as demo:
gr.Markdown("**Baith-al-suroor بَیتُ الْسرور  🏡🤖**, Transform your space with the power of artificial intelligence." ) # Add title with emojis
gr.Markdown("Baith al suroor بَیتُ الْسرور  (house of happiness in Arabic)  🏡🤖  is a deeptech app that uses the power of artificial intelligence to transform your space, leveraging diffusion models and powerful Gemini model , it can generate descriptions of your desired design, and the Stable Diffusion algorithm creates relevant images to bring your vision to your thoughts. Give Baith AI a try and see how it can elevate your interior design.--if you want to scale / reaserch / build mobile app / get secret key for research purpose on this space konnect me   @[Xhaheen](https://www.linkedin.com/in/sallu-mandya/)")
gr.Markdown("## Generate Images with Stability AI")
with gr.Accordion("Text-to-Image", open=False):
with gr.Row():
text_prompt = gr.Textbox(label="Prompt", lines=2,value='Zen-style (bedroom interior) With storage bench or ottoman and bed and accent chair and headboard and bedside table or night stand and night light and mirror and plant. . With natural light and serenity and harmony and clutter free and clean lines and mimimalist and Asian zen interior and Japanese minimalist interior and Japanese interior. . Cinematic photo, highly detailed, cinematic lighting, ultra-detailed, ultrarealistic, photorealism, 8k. Zen interior design style' ,placeholder="Enter your text prompt here...")
generate_text_button = gr.Button("Generate")
text_output = gr.Image(type="pil", label="Generated Image")
with gr.Accordion("Image-to-Image", open=False):
with gr.Row():
image_input = gr.Image(type="pil", label="Initial Image")
prompt_strength = gr.Slider(0.0, 1.0, value=0.85, label="Prompt Strength")
with gr.Row():
image_prompt = gr.Textbox(label="Prompt", lines=2,value='Zen-style ( interior) With storage bench or ottoman and bed and accent chair and headboard and bedside table or night stand and night light and mirror and plant. . With natural light and serenity and harmony and clutter free and clean lines and mimimalist and Asian zen interior and Japanese minimalist interior and Japanese interior. . Cinematic photo, highly detailed, cinematic lighting, ultra-detailed, ultrarealistic, photorealism, 8k. Zen interior design style' , placeholder="Enter your text prompt here...")
generate_image_button = gr.Button("Generate")
image_output = gr.Image(type="pil", label="Generated Image")
with gr.Accordion("Chat with AI", open=False):
chat_interface.render()
generate_text_button.click(generate_image_from_text, text_prompt, text_output)
generate_image_button.click(generate_image_from_image, [image_input, prompt_strength, image_prompt], image_output)
demo.launch(debug=True)