""" Dispatch AI — Arabic Calligraphy Generate Arabic calligraphy art with FLUX.1-schnell. Text input, style selector (Thuluth/Naskh/Diwani/Kufi/Modern), color scheme. """ import os import io import gradio as gr from huggingface_hub import InferenceClient from PIL import Image, ImageDraw # --- Configuration ----------------------------------------------------------- HF_TOKEN = os.environ.get("HF_TOKEN", None) MODEL_ID = "black-forest-labs/FLUX.1-schnell" client = InferenceClient(model=MODEL_ID, token=HF_TOKEN) BG_COLOR = "#0A0F1A" ACCENT = "#1FE0E6" # Calligraphy styles STYLES = { "Thuluth": "Thuluth script, elegant large sweeping curves, ornate flowing letters, classical Islamic style", "Naskh": "Naskh script, clean readable traditional book script, rounded letters, classic", "Diwani": "Diwani script, decorative curved ornamental Ottoman style, intricate overlapping letters", "Kufi": "Kufic script, geometric angular blocky letters, strict grid pattern, ancient architectural style", "Modern": "Modern Arabic calligraphy, contemporary stylized abstract elegant fusion of traditional and modern art", "Nasta'liq": "Nasta'liq script, elegant Persian-Arabic style with hanging baseline, refined sloping letters", "Ruq'ah": "Ruq'ah script, compact fast style with sharp angles, traditional handwriting style", } # Color schemes: name -> (foreground desc, background desc) COLOR_SCHEMES = { "Gold on Black": ("gold metallic letters", "deep black textured background"), "White on Blue": ("pure white letters", "rich deep blue gradient background"), "Silver on Dark": ("silver metallic letters", "dark charcoal gradient background"), "Gold on Green": ("gold letters", "deep emerald green background with Islamic patterns"), "White on Maroon": ("pure white letters", "rich maroon red gradient background"), "Bronze on Cream": ("bronze letters", "warm cream parchment background"), "Neon on Dark": ("glowing neon cyan letters", "dark black background with subtle glow"), } # Composition / layout options COMPOSITIONS = { "Centered": "centered composition, elegant ornamental frame", "Circular": "circular medallion composition, decorative border", "Panel": "horizontal panel composition, framed like a mosque tile", "Freestyle": "freestyle abstract composition, no frame, artistic flow", } # Example prompts in Arabic EXAMPLES_AR = [ "بسم الله الرحمن الرحيم", "السلام عليكم ورحمة الله وبركاته", "الحب للوطن من الايمان", "العلم نور", "صبر جميل", "توكل على الله", "Dispatch AI", "الإمارات", "العزة للوطن", ] def build_prompt(arabic_text, style, color_scheme, composition): """Construct a detailed prompt for FLUX.""" style_desc = STYLES.get(style, STYLES["Thuluth"]) fg, bg = COLOR_SCHEMES.get(color_scheme, COLOR_SCHEMES["Gold on Black"]) comp_desc = COMPOSITIONS.get(composition, COMPOSITIONS["Centered"]) text = arabic_text.strip() if arabic_text.strip() else "بسم الله" prompt = ( f"Arabic calligraphy art of the text '{text}', " f"rendered in {style_desc}, " f"with {fg} on {bg}, " f"{comp_desc}, " f"high detail, ultra sharp, 4k, luxurious Islamic art style" ) return prompt def generate_calligraphy(arabic_text, style, color_scheme, composition): """Generate Arabic calligraphy art via FLUX.1-schnell.""" prompt = build_prompt(arabic_text, style, color_scheme, composition) w, h = 1024, 1024 try: image = client.text_to_image(prompt, width=w, height=h) if not isinstance(image, Image.Image): image = Image.open(io.BytesIO(image)) if hasattr(image, "read") else Image.open(image) return image, "✅ Calligraphy generated!", prompt except Exception as e: img = Image.new("RGB", (w, h), BG_COLOR) d = ImageDraw.Draw(img) d.text((w // 4, h // 2), f"Error: {str(e)[:60]}", fill=ACCENT) return img, f"❌ Error: {str(e)}", prompt # --- UI ----------------------------------------------------------------------- CSS = """ #dispatch-header h1 { color: #FFFFFF; font-size: 2.2rem; margin: 0; background: linear-gradient(90deg, #1FE0E6 0%, #FFFFFF 60%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } #dispatch-header p { color: #1FE0E6; font-size: 1.05rem; margin: 6px 0 0 0; } .dispatch-footer { text-align: center; color: #8A8F9C; font-size: 0.9rem; padding-top: 8px; } """ with gr.Blocks( title="Dispatch AI — Arabic Calligraphy", theme=gr.themes.Base( primary_hue="cyan", secondary_hue="cyan", neutral_hue="slate", font=[gr.themes.GoogleFont("Inter"), "ui-sans-serif", "system-ui"], ).set( body_background_fill="#0A0F1A", body_background_fill_dark="#0A0F1A", body_text_color="#FFFFFF", body_text_color_dark="#FFFFFF", block_background_fill="#0E1424", block_background_fill_dark="#0E1424", block_border_color="#1FE0E6", block_border_width="1px", block_label_text_color="#1FE0E6", block_title_text_color="#1FE0E6", button_primary_background_fill="#1FE0E6", button_primary_background_fill_dark="#1FE0E6", button_primary_text_color="#0A0F1A", button_primary_border_color="#1FE0E6", input_background_fill="#0E1424", input_background_fill_dark="#0E1424", input_border_color="#1FE0E6", input_border_width="1px", ), css=CSS, ) as demo: with gr.Column(elem_id="dispatch-header"): gr.Markdown( """ # Dispatch AI — Arabic Calligraphy Generate beautiful Arabic calligraphy art with FLUX.1-schnell · Dispatch AI (FZE) · UAE """ ) with gr.Row(): with gr.Column(scale=1): arabic_input = gr.Textbox( label="Arabic Text", placeholder="اكتب النص هنا", value="بسم الله الرحمن الرحيم", lines=2, rtl=True, ) style_select = gr.Dropdown( list(STYLES.keys()), label="Calligraphy Style", value="Thuluth", ) color_select = gr.Dropdown( list(COLOR_SCHEMES.keys()), label="Color Scheme", value="Gold on Black", ) composition_select = gr.Dropdown( list(COMPOSITIONS.keys()), label="Composition / Layout", value="Centered", ) generate_btn = gr.Button("✨ Generate Calligraphy", variant="primary") with gr.Column(scale=2): output_image = gr.Image( label="Generated Calligraphy", type="pil", show_download_button=True, ) status_box = gr.Textbox(label="Status", interactive=False) prompt_box = gr.Textbox(label="Generated Prompt (for debugging)", interactive=False, lines=3) gr.Markdown("### Example Arabic Prompts") gr.Examples( examples=[[ex] for ex in EXAMPLES_AR], inputs=arabic_input, label="Click an example to load it into the Arabic text box", ) # Events generate_btn.click( generate_calligraphy, inputs=[arabic_input, style_select, color_select, composition_select], outputs=[output_image, status_box, prompt_box], ) gr.Markdown( """
""" ) if __name__ == "__main__": demo.queue() demo.launch()