3morixd's picture
Upload app.py with huggingface_hub
5727128 verified
Raw
History Blame Contribute Delete
7.94 kB
"""
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(
"""
<div class="dispatch-footer">
© 2026 Dispatch AI (FZE) · UAE · License 10818 · Model: FLUX.1-schnell · Arabic Calligraphy Engine
</div>
"""
)
if __name__ == "__main__":
demo.queue()
demo.launch()