|
import gradio as gr |
|
import requests |
|
from PIL import Image |
|
from io import BytesIO |
|
from tqdm import tqdm |
|
import time |
|
|
|
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> |
|
""" |
|
|
|
|
|
gallery_images = [ |
|
("https://gaur3009-phone-c.hf.space/gradio_api/file=/tmp/gradio/387f5407e32dd2e2d9e7017977f5ee98e4f40dcb8b1d2a9ef23612255a675163/image.webp", "Red Color, iPhone 14, Naruto Anime Theme"), |
|
("https://gaur3009-phone-c.hf.space/gradio_api/file=/tmp/gradio/3037d9cae7a86b29be5969cf3a361ae847915b54d97d6d5dffb6e019a2b9ddc9/image.webp", "Red Color, iPhone 14, Darth Vader Theme"), |
|
("https://gaur3009-phone-c.hf.space/gradio_api/file=/tmp/gradio/1958c8d60219357edbb2e1f69331152f1cd1109407b274c4511a810650dd574b/image.webp", "Black, iPhone 15, Thomas Shelby (Peaky Blinders) Theme"), |
|
("https://gaur3009-phone-c.hf.space/gradio_api/file=/tmp/gradio/183392add00a7fa3d53653f856bc88d4113bd74c0d37c43de7a9af414e9c1d84/image.webp", "Green color, iPhone, Green Goblin"), |
|
("https://gaur3009-phone-c.hf.space/gradio_api/file=/tmp/gradio/b7b0b2415f15f810f71658616a885b97c0466d09f1d852684a868ab9b5d18e6c/image.webp", "White and Cream Color, iPhone 15, Iron-Man"), |
|
] |
|
|
|
|
|
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") |
|
gallery_html = "<div class='carousel'>" |
|
for img_url, caption in gallery_images: |
|
gallery_html += f"<div class='image-container'><img src='{img_url}' alt='Design'><div class='caption'>{caption}</div></div>" |
|
gallery_html += "</div>" |
|
gr.HTML(gallery_html) |
|
|
|
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) |
|
|