|
import gradio as gr |
|
import requests |
|
from PIL import Image |
|
from io import BytesIO |
|
from tqdm import tqdm |
|
import time |
|
import os |
|
|
|
repo = "artificialguybr/TshirtDesignRedmond-V2" |
|
|
|
|
|
def infer(color_prompt, phone_type_prompt, design_prompt): |
|
prompt = ( |
|
f"A single vertical {color_prompt} colored {phone_type_prompt} back cover featuring a bold {design_prompt} design on the front, hanging on the plain wall. The soft light and shadows, creating a striking contrast against the minimal background, evoking modern sophistication." |
|
) |
|
full_prompt = f"{prompt}" |
|
|
|
print("Generating image with prompt:", full_prompt) |
|
api_url = f"https://api-inference.huggingface.co/models/{repo}" |
|
headers = {} |
|
payload = { |
|
"inputs": full_prompt, |
|
"parameters": { |
|
"negative_prompt": "(worst quality, low quality, lowres, oversaturated, grayscale, bad photo:1.4)", |
|
"num_inference_steps": 30, |
|
"scheduler": "DPMSolverMultistepScheduler", |
|
}, |
|
} |
|
|
|
error_count = 0 |
|
pbar = tqdm(total=None, desc="Loading model") |
|
while True: |
|
response = requests.post(api_url, headers=headers, json=payload) |
|
if response.status_code == 200: |
|
speech_text = f"Your design is generated with the color '{color_prompt}', mobile type '{phone_type_prompt}', and design '{design_prompt}'." |
|
return Image.open(BytesIO(response.content)), speech_text |
|
elif response.status_code == 503: |
|
time.sleep(1) |
|
pbar.update(1) |
|
elif response.status_code == 500 and error_count < 5: |
|
time.sleep(1) |
|
error_count += 1 |
|
else: |
|
raise Exception(f"API Error: {response.status_code}") |
|
|
|
|
|
def save_design(image): |
|
file_path = "saved_design.png" |
|
image.save(file_path) |
|
return f"Design saved as {file_path}!" |
|
|
|
|
|
custom_css = """ |
|
body { |
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; |
|
margin: 0; |
|
padding: 0; |
|
overflow: hidden; |
|
} |
|
body::before { |
|
content: ""; |
|
position: fixed; |
|
top: 0; |
|
left: 0; |
|
width: 100%; |
|
height: 100%; |
|
background: linear-gradient(-45deg, #ff9a9e, #fad0c4, #fbc2eb, #8fd3f4); |
|
background-size: 400% 400%; |
|
z-index: -1; |
|
animation: gradientShift 15s ease infinite; |
|
} |
|
@keyframes gradientShift { |
|
0% { background-position: 0% 50%; } |
|
50% { background-position: 100% 50%; } |
|
100% { background-position: 0% 50%; } |
|
} |
|
.carousel { |
|
display: flex; |
|
overflow-x: auto; |
|
scroll-behavior: smooth; |
|
} |
|
.carousel .image-container { |
|
display: inline-block; |
|
text-align: center; |
|
margin: 0 10px; |
|
} |
|
.carousel img { |
|
max-height: 200px; |
|
border-radius: 10px; |
|
transition: transform 0.3s; |
|
} |
|
.carousel img:hover { |
|
transform: scale(1.1); |
|
} |
|
.carousel .caption { |
|
margin-top: 5px; |
|
font-size: 14px; |
|
color: #333; |
|
} |
|
""" |
|
|
|
|
|
custom_js = """ |
|
<script> |
|
document.addEventListener('DOMContentLoaded', function () { |
|
function speak(text) { |
|
const synth = window.speechSynthesis; |
|
const utterance = new SpeechSynthesisUtterance(text); |
|
synth.speak(utterance); |
|
} |
|
document.addEventListener('gradio_event:output_update', (event) => { |
|
const outputText = event.detail?.text || ''; |
|
if (outputText) { |
|
speak(outputText); |
|
} |
|
}); |
|
}); |
|
</script> |
|
""" |
|
def load_gallery_images(): |
|
folder_path = "New folder (4)" |
|
images = [] |
|
if not os.path.exists(folder_path): |
|
return images |
|
for filename in os.listdir(folder_path): |
|
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.webp')): |
|
img_path = os.path.abspath(os.path.join(folder_path, filename)) |
|
images.append(img_path) |
|
return images |
|
|
|
gallery_images = load_gallery_images() |
|
|
|
with gr.Blocks(css=custom_css) as interface: |
|
gr.HTML(custom_js) |
|
gr.Markdown("# **AI Phone Cover Designer**") |
|
gr.Markdown("Create custom phone covers with AI. Save your designs for future use.") |
|
|
|
with gr.Tabs(): |
|
with gr.Tab("Home"): |
|
gr.Markdown("Welcome to the **AI Phone Cover Designer**! Use the 'Design' tab to start creating custom designs.") |
|
gr.Markdown("### Gallery") |
|
if gallery_images: |
|
gr.Gallery(value=gallery_images, label="Design Gallery", columns=2, height="auto") |
|
else: |
|
gr.Markdown("No images found in the gallery folder.") |
|
|
|
|
|
with gr.Tab("Design"): |
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
color_prompt = gr.Textbox(label="Color", placeholder="E.g., Red") |
|
phone_type_prompt = gr.Textbox(label="Mobile type", placeholder="E.g., iPhone, Samsung") |
|
design_prompt = gr.Textbox(label="Design Details", placeholder="E.g., Bold stripes with geometric patterns") |
|
chatbot = gr.Chatbot() |
|
generate_button = gr.Button("Generate Design") |
|
save_button = gr.Button("Save Design") |
|
with gr.Column(scale=1): |
|
output_image = gr.Image(label="Generated Design") |
|
output_message = gr.Textbox(label="AI Assistant Message", interactive=False) |
|
|
|
generate_button.click( |
|
infer, |
|
inputs=[color_prompt, phone_type_prompt, design_prompt], |
|
outputs=[output_image, output_message], |
|
) |
|
save_button.click( |
|
save_design, |
|
inputs=[output_image], |
|
outputs=output_message, |
|
) |
|
|
|
with gr.Tab("About"): |
|
gr.Markdown(""" |
|
## About AI Phone Cover Maker |
|
The **AI Phone Cover Maker** is a cutting-edge tool designed to help users create personalized phone cover designs quickly and easily. |
|
Powered by AI, it uses advanced image generation techniques to craft unique, high-quality designs for any mobile device. |
|
|
|
### Features: |
|
- Create custom designs using simple prompts. |
|
- Generate designs for various phone models. |
|
- Save your designs for future use. |
|
|
|
Start designing today and bring your creative ideas to life! |
|
""") |
|
|
|
interface.launch(debug=True) |