| 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) |