Piper-tts-api / app.py
Thursday88's picture
Upload app.py
e614d21 verified
Raw
History Blame Contribute Delete
112 kB
import os
import re
import wave
import tempfile
from functools import lru_cache
import gradio as gr
from huggingface_hub import hf_hub_download
from piper import PiperVoice, SynthesisConfig
from groq import Groq
# ============================================================
# 1. CONFIGURATION
# ============================================================
GROQ_API_KEY = os.environ.get("GROQ_API_KEY")
client = Groq(api_key=GROQ_API_KEY) if GROQ_API_KEY else None
REPO_ID = "rhasspy/piper-voices"
# ============================================================
# 2. LATIFA AI — SYSTEM PROMPT
# ============================================================
LATIFA_PROMPT = (
"You are Latifa AI — the official voice guide of 'Under the Palm Tree' "
"(تحت شجرة النخيل), an interactive English learning project set in Oman, 1973.\n\n"
"IDENTITY:\n"
"- You are an Omani educational guide created by Thuraya Mohammed Ali Al-Naabia.\n"
"- You are warm, professional, knowledgeable, and encouraging.\n"
"- You speak naturally like a real Omani English teacher.\n\n"
"═══════════════════════════════════════\n"
"LANGUAGE RULES (CRITICAL — FOLLOW STRICTLY):\n"
"═══════════════════════════════════════\n"
"- Detect the user's language automatically.\n"
"- If the user writes in Arabic → respond ENTIRELY in Arabic. No English words mixed in.\n"
"- If the user writes in English → respond ENTIRELY in English. No Arabic words mixed in.\n"
"- If the user writes in mixed Arabic-English → respond in the SAME language the user used MOST.\n"
"- NEVER switch languages mid-sentence. Pick ONE language per response.\n"
"- When responding in Arabic, you MUST add full tashkeel (diacritics) to ALL Arabic words.\n"
" Example: مَرْحَبًا بِكُمْ فِي تَحْتَ شَجَرَةِ النَّخِيل\n"
" The tashkeel is essential for correct pronunciation by the text-to-speech system.\n"
"- When responding in English, use simple clear English suitable for language learners.\n\n"
"PROJECT:\n"
"- Name: 123 Let's Learn English Under The Palm Tree\n"
"- Founder: Thuraya Mohammed Ali Al-Naabia — Omani English Teacher & Educational Innovator\n"
"- Website: www.under-palm-tree.com\n"
"- Setting: Oman, 1973, Al-Qurawashiyah Village, Samail\n"
"- The project blends English learning with Omani heritage through interactive storytelling, "
"games, and cultural exploration.\n\n"
"MAIN CHARACTERS:\n"
"- Thuraya: Omani English teacher, black hijab, black abaya/blazer, story narrator. "
"Mature, natural, warm.\n"
"- John: British male teacher, tall, brown hair, light beard, beige shirt, brown trousers. "
"Professional, kind.\n"
"- Sophia: British female teacher, blonde hair/bun, green eyes, soft blouse, long skirt. "
"Friendly, gentle, curious.\n"
"- Malood: Small white baby goat, funny, mischievous. Eats Sophia's ring, chews notebooks.\n\n"
"LOCATIONS:\n"
"- Al-Qurawashiyah Village, Samail: Traditional Omani village with palm groves, "
"falaj irrigation, mud houses, old school.\n"
"- Seeb Airport (Muscat): Where John and Sophia first arrive.\n"
"- Dukkan Al-Hillah: The village shop.\n"
"- Samail Market (Souq): Local market visited via Uncle Nasser's pickup.\n"
"- Falaj: Traditional Omani water channels, UNESCO heritage.\n\n"
"CHAPTERS:\n"
"1. 'Thuraya's Book of Thoughts' — Turkey, 2026. Thuraya remembers: John reading the letter, "
"Sophia's hesitation, the flight, arrival in Oman.\n"
"2. 'The First Walk in the Village' — Oman, 1973. Sophia's first night in the clay house. "
"Morning walk: letj game, falaj, Sadoo's shop, Khamis, nahsher trees.\n"
"3. 'The First Day at School' — John writes 'HELLO' on chalkboard. Malood eats Sophia's ring "
"and chews notebooks.\n"
"4. 'The Morning Departure to the Souq' — Trip to Dukkan Al-Hillah, Uncle Nasser's pickup, "
"Samail market. Learning 'I want.' Meeting Habbabouh Saif.\n\n"
"GAMES:\n"
"- Palm Echo: Speaking and pronunciation practice. Listen, repeat, improve confidence.\n\n"
"SKILLS: Speaking, listening, reading, writing, vocabulary, grammar, pronunciation, spelling.\n\n"
"CULTURAL NOTES:\n"
"- Falaj: Traditional irrigation channels, UNESCO heritage.\n"
"- Oud & Luban: Fragrant incense (oud wood, frankincense).\n"
"- Letj: Traditional Omani children's game.\n"
"- 1973: Oman modernizing under Sultan Qaboos.\n\n"
"AUTHOR:\n"
"Thuraya Mohammed Ali Al-Naabia — Omani English teacher, educational innovator, storyteller.\n"
"Quote: 'Learning is not only about mastering a language; it is about discovering stories, "
"building connections, and creating new possibilities.'\n\n"
"WEBSITE PAGES: Home, Characters, Chapters, Games, Skills Practice, "
"Gallery, Music, Story World, Latifa AI. Guide users to pages when asked.\n\n"
"STORY RULES:\n"
"- Never invent story events or change character identities.\n"
"- Never change the era (always 1973) or add modern objects.\n"
"- If you don't know something, say: 'I don't know that part of the story yet.'\n\n"
"RESPONSE FORMATTING:\n"
"- Do NOT use emojis in your responses.\n"
"- Do NOT use markdown formatting (no **, ##, bullets with special chars).\n"
"- Write plain text only — the response will be spoken aloud by a voice system.\n"
"- Keep answers clear, natural, and conversational.\n"
"- For vocabulary: word → meaning in the other language → example sentence.\n"
"- For quizzes: ask one question at a time.\n"
"- Be culturally respectful and proud of Omani heritage.\n"
"- Maximum 3-4 sentences per response to keep it conversational."
)
# ============================================================
# 3. VOICE CONFIGURATION & LOADER
# ============================================================
VOICE_MAP = {
"en": {
"model": "en/en_GB/alba/medium/en_GB-alba-medium.onnx",
"config": "en/en_GB/alba/medium/en_GB-alba-medium.onnx.json",
},
"ar": {
"model": "ar/ar_JO/khalil/medium/ar_JO-khalil-medium.onnx",
"config": "ar/ar_JO/khalil/medium/ar_JO-khalil-medium.onnx.json",
},
}
@lru_cache(maxsize=4)
def load_piper_voice(model_file, config_file):
"""Download and cache a Piper voice model from Hugging Face."""
try:
mpath = hf_hub_download(
repo_id=REPO_ID, filename=model_file, repo_type="model"
)
cpath = hf_hub_download(
repo_id=REPO_ID, filename=config_file, repo_type="model"
)
return PiperVoice.load(mpath, cpath)
except Exception as e:
print(f"[Latifa] Voice load failed: {e}")
return None
def detect_lang(text):
"""Return 'ar' if text is predominantly Arabic, else 'en'."""
if not text:
return "en"
arabic_chars = 0
total_chars = 0
for c in text:
if "\u0600" <= c <= "\u06FF" or "\u0750" <= c <= "\u077F" or "\u064B" <= c <= "\u065F":
arabic_chars += 1
if c.isalpha():
total_chars += 1
if total_chars == 0:
return "en"
return "ar" if arabic_chars / total_chars > 0.3 else "en"
def clean_text_for_tts(text, lang):
"""Clean text before sending to Piper TTS."""
if not text:
return ""
text = re.sub(r'https?://\S+', '', text)
text = re.sub(r'\S+@\S+', '', text)
emoji_pattern = re.compile(
"["
"\U0001F600-\U0001F64F"
"\U0001F300-\U0001F5FF"
"\U0001F680-\U0001F6FF"
"\U0001F1E0-\U0001F1FF"
"\U00002702-\U000027B0"
"\U000024C2-\U0001F251"
"\U0001f926-\U0001f937"
"\U00010000-\U0010ffff"
"\u2640-\u2642"
"\u2600-\u2B55"
"\u200d"
"\u23cf"
"\u23e9"
"\u231a"
"\ufe0f"
"\u3030"
"]+",
flags=re.UNICODE,
)
text = emoji_pattern.sub('', text)
text = re.sub(r'\*+', '', text)
text = re.sub(r'#+\s*', '', text)
text = re.sub(r'`+', '', text)
text = re.sub(r'_{2,}', '', text)
text = re.sub(r'-{2,}', '', text)
text = re.sub(r'\|', '', text)
text = re.sub(r'[{}[\]<>()@#$%^&*=+~\\]', '', text)
if lang == "ar":
text = re.sub(
r'[^\u0600-\u06FF\u0750-\u077F\u064B-\u065F\u0670\s.,!?;:،؟!\n]',
' ',
text,
)
else:
text = re.sub(r'[^a-zA-Z\s.,!?;:\'"\-\n]', ' ', text)
text = re.sub(r'\s+', ' ', text).strip()
max_chars = 800
if len(text) > max_chars:
text = text[:max_chars].rsplit(' ', 1)[0]
return text
def speak(text, lang="en"):
"""Synthesize speech with Piper. Returns file path or None."""
clean = clean_text_for_tts(text, lang)
if not clean or len(clean) < 2:
return None
cfg = VOICE_MAP.get(lang, VOICE_MAP["en"])
voice = load_piper_voice(cfg["model"], cfg["config"])
if voice is None:
return None
try:
syn = SynthesisConfig(
length_scale=1.0,
noise_scale=0.667,
noise_w_scale=0.8,
)
tmp = tempfile.NamedTemporaryFile(suffix=".wav", delete=False)
tmp.close()
with wave.open(tmp.name, "wb") as wf:
voice.synthesize_wav(clean, wf, syn_config=syn)
return tmp.name
except Exception as e:
print(f"[Latifa] TTS error: {e}")
return None
# ============================================================
# 4. KNOWLEDGE BASE
# ============================================================
KB = {
"characters": {
"thuraya": (
"Thuraya — Omani English teacher, story narrator. Black hijab, "
"black abaya/blazer. Mature, natural, warm. Leads the story and "
"teaches English in Al-Qurawashiyah village."
),
"john": (
"John — British male teacher. Tall, brown hair, light beard. "
"Beige shirt, brown trousers. Professional and kind. Comes to "
"Oman to teach English."
),
"sophia": (
"Sophia — British female teacher. Blonde hair in a bun, green eyes. "
"Soft blouse, long skirt. Friendly, gentle, curious about Omani culture. "
"Her ring gets eaten by Malood!"
),
"malood": (
"Malood — Small white baby goat. Funny and mischievous. Famous for "
"eating Sophia's ring and chewing notebooks. A beloved chaos-maker."
),
},
"chapters": {
"1": (
"Chapter 1: 'Thuraya's Book of Thoughts' — Turkey, 2026. Thuraya "
"opens her notebook and remembers: John reading the letter in London, "
"Sophia's hesitation, the long flight, the heat of Oman's arrival, "
"and their first meeting at the airport."
),
"2": (
"Chapter 2: 'The First Walk in the Village' — Oman, 1973, late afternoon. "
"Sophia's first night in the clay house with oud and luban. Morning walk "
"through the village: letj game, falaj, Sadoo's shop, Khamis the "
"Thursday-named man, nahsher trees."
),
"3": (
"Chapter 3: 'The First Day at School' — Al-Qurawashiyah, 1973. John "
"writes 'HELLO' on the chalkboard and meets students. Malood the goat "
"eats Sophia's ring and chews the notebooks!"
),
"4": (
"Chapter 4: 'The Morning Departure to the Souq' — Trip to Dukkan "
"Al-Hillah, then Uncle Nasser's pickup to Samail market. Class learns "
"'I want.' Meet the unforgettable Habbabouh Saif."
),
},
"locations": {
"al-qurawashiyah": (
"Al-Qurawashiyah Village, Samail, Oman — Traditional Omani village "
"with palm groves, falaj irrigation, mud/clay houses, old school."
),
"seeb": "Seeb Airport (Muscat) — Where John and Sophia first arrive in 1973.",
"falaj": (
"Falaj — Traditional Omani irrigation channels carrying mountain water "
"to villages. UNESCO heritage."
),
"souq": (
"Samail Market (Souq) — Local market visited via Uncle Nasser's pickup."
),
"dukkan": "Dukkan Al-Hillah — The village shop in Al-Qurawashiyah.",
},
"games": {
"palm echo": (
"Palm Echo — Speaking and pronunciation practice game. Listen to words, "
"repeat them, build confidence. Skills: pronunciation, speaking, listening."
),
},
"skills": {
"speaking": "Speaking Practice — Conversations, repetition exercises, pronunciation drills. Try Palm Echo.",
"listening": "Listening Practice — Audio activities and story narration.",
"reading": "Reading Practice — Story chapters and interactive texts set in Oman.",
"writing": "Writing Practice — Guided exercises and creative prompts.",
"vocabulary": "Vocabulary — Contextual learning tied to Omani culture and daily life.",
"grammar": "Grammar — Rules learned through story examples.",
"pronunciation": "Pronunciation — Palm Echo game and repetition exercises.",
"spelling": "Spelling — Word games and activities.",
},
"cultural": {
"falaj": "Falaj: Traditional Omani irrigation — channels from mountains to villages. UNESCO heritage.",
"oud": "Oud: Fragrant wood incense, deeply valued in Omani homes.",
"luban": "Luban (Frankincense): Traditional Omani aromatic resin. Oman was the world's main source.",
"letj": "Letj: Traditional Omani children's game played in villages.",
"1973": (
"Oman 1973: Modernizing under Sultan Qaboos. Traditional village life "
"coexisting with development. Foreign teachers building the education system."
),
},
"author": {
"name": "Thuraya Mohammed Ali Al-Naabia",
"title": "Founder of Under the Palm Tree",
"role": "Omani English Teacher & Educational Innovator",
"bio": (
"An Omani English teacher dedicated to transforming language learning "
"through creativity and technology. Combines storytelling, cultural "
"heritage, digital learning, and AI."
),
"vision": "English learning as an immersive journey connecting language, culture, creativity.",
"philosophy": "The most effective learning happens when students are emotionally connected.",
"quote": (
"Learning is not only about mastering a language; it is about discovering "
"stories, building connections, and creating new possibilities."
),
},
"sitemap": {
"home": "https://www.under-palm-tree.com — Project introduction and mission",
"characters": "https://www.under-palm-tree.com/palm-characters — Story characters",
"chapters": "https://www.under-palm-tree.com/underthepalm — Read the story chapters",
"games": "https://www.under-palm-tree.com/palmgames — Interactive educational games",
"skills": "https://www.under-palm-tree.com/four-and-more-skills — Skills practice hub",
"gallery": "https://www.under-palm-tree.com/gallery-1 — Visual gallery",
"music": "https://www.under-palm-tree.com/songs — Music and audio",
},
}
# ============================================================
# 5. KNOWLEDGE SEARCH
# ============================================================
QUERY_KEYWORDS = {
"character": "characters", "who is": "characters",
"john": "characters", "sophia": "characters", "malood": "characters",
"chapter": "chapters", "story": "chapters", "episode": "chapters",
"game": "games", "play": "games", "echo": "games", "palm echo": "games",
"practice": "skills", "skill": "skills", "learn": "skills",
"speaking": "skills", "listening": "skills", "reading": "skills",
"writing": "skills", "vocab": "skills", "grammar": "skills",
"pronunciation": "skills", "spelling": "skills",
"author": "author", "founder": "author", "creator": "author",
"thuraya mohammed": "author",
"oman": "cultural", "culture": "cultural", "1973": "cultural",
"falaj": "cultural", "oud": "cultural", "luban": "cultural", "letj": "cultural",
"page": "sitemap", "website": "sitemap", "navigate": "sitemap",
"where": "sitemap", "link": "sitemap", "show me": "sitemap",
"village": "locations", "location": "locations", "samail": "locations",
"airport": "locations", "souq": "locations", "shop": "locations",
"ثريا": "characters", "صوفيا": "characters",
"معلود": "characters", "الماعز": "characters",
"شخصية": "characters", "شخصيات": "characters",
"فصل": "chapters", "قصة": "chapters", "حكاية": "chapters",
"لعبة": "games", "بالم ايكو": "games", "صدى النخلة": "games",
"تمرين": "skills", "تعلم": "skills", "ممارسة": "skills",
"كتابة": "skills", "قواعد": "skills", "تهجئة": "skills",
"مؤلف": "author", "المؤسسة": "author", "المعلمة": "author",
"ثريا محمد": "author",
"عمان": "cultural", "ثقافة": "cultural", "تراث": "cultural",
"فلج": "cultural", "عود": "cultural", "لبان": "cultural", "لتج": "cultural",
"صفحة": "sitemap", "موقع": "sitemap", "رابط": "sitemap",
"قرية": "locations", "سمائل": "locations", "مطار": "locations",
"سوق": "locations", "دكان": "locations",
"مرحبا": None, "هلا": None, "السلام": None,
}
def search_kb(query):
"""Return relevant knowledge-base entries as a context string."""
if not query:
return ""
q = query.lower()
cats = set()
for kw, cat in QUERY_KEYWORDS.items():
if kw in q and cat:
cats.add(cat)
if not cats:
return ""
hits = []
for cat in cats:
if cat == "author":
a = KB["author"]
hits.append(
f"Author: {a['name']}{a['title']}. {a['bio']} "
f"Philosophy: {a['philosophy']} Quote: \"{a['quote']}\""
)
elif cat in KB:
for val in KB[cat].values():
hits.append(val)
seen = set()
unique = []
for h in hits:
if h not in seen:
seen.add(h)
unique.append(h)
return "\n---\n".join(unique[:6])
# ============================================================
# 6. CHAT FUNCTIONS
# ============================================================
STATUS_READY = '<div id="status-bar">🟡 Ready</div>'
STATUS_SPEAKING = '<div id="status-bar">🔊 Speaking</div>'
STATUS_ERROR = '<div id="status-bar">❌ Error</div>'
def build_messages(history, user_msg):
"""Build Groq message list with knowledge-base context injected."""
system = LATIFA_PROMPT
kb = search_kb(user_msg)
if kb:
system += f"\n\nRELEVANT CONTEXT:\n{kb}"
msgs = [{"role": "system", "content": system}]
if history:
for m in history:
if isinstance(m, dict):
r, c = m.get("role"), m.get("content")
if r in ("user", "assistant") and c:
msgs.append({"role": r, "content": str(c)})
elif isinstance(m, (list, tuple)) and len(m) == 2:
u, b = m
if u:
msgs.append({"role": "user", "content": str(u)})
if b:
msgs.append({"role": "assistant", "content": str(b)})
msgs.append({"role": "user", "content": user_msg})
return msgs
def push(history, user_msg, bot_msg):
history.append({"role": "user", "content": user_msg})
history.append({"role": "assistant", "content": bot_msg})
return history
def latifa_respond(user_text, voice_file, history):
"""Main handler: text or voice → text reply + Piper audio."""
if history is None:
history = []
# Voice input → Whisper transcription
if voice_file and os.path.exists(voice_file):
try:
with open(voice_file, "rb") as af:
tr = client.audio.transcriptions.create(
model="whisper-large-v3", file=af
)
user_text = tr.text
except Exception as e:
history = push(history, "🎙️ Voice", f"Transcription failed: {e}")
return history, None, "", None, STATUS_ERROR
if not user_text or not user_text.strip():
return history, None, "", None, STATUS_READY
user_text = user_text.strip()
if not client:
history = push(
history, user_text,
"API key not set. Please add GROQ_API_KEY in Space settings.",
)
return history, None, "", None, STATUS_ERROR
messages = build_messages(history, user_text)
try:
resp = client.chat.completions.create(
model="llama-3.3-70b-versatile",
messages=messages,
temperature=0.6,
max_tokens=300,
)
reply = resp.choices[0].message.content
except Exception as e:
history = push(history, user_text, f"AI error: {e}")
return history, None, "", None, STATUS_ERROR
lang = detect_lang(reply)
audio = speak(reply, lang)
history = push(history, user_text, reply)
status = STATUS_SPEAKING if audio else STATUS_READY
return history, audio, "", None, status
def replay(history):
"""Re-synthesize the last assistant message."""
if not history:
return None, STATUS_READY
for m in reversed(history):
if isinstance(m, dict) and m.get("role") == "assistant":
txt = m.get("content", "")
if txt:
a = speak(txt, detect_lang(txt))
return a, (STATUS_SPEAKING if a else STATUS_READY)
return None, STATUS_READY
def clear_all():
return [], None, "", STATUS_READY
# ============================================================
# 7. CUSTOM THEME
# ============================================================
latifa_theme = gr.themes.Base(
primary_hue=gr.themes.colors.Color(
c50="#F5EDD8", c100="#EDE0C4", c200="#C9AA80",
c300="#8C6A3F", c400="#4A3520", c500="#360304",
c600="#360304", c700="#360304", c800="#360304",
c900="#360304", c950="#360304",
),
secondary_hue=gr.themes.colors.Color(
c50="#F5EDD8", c100="#EDE0C4", c200="#C9AA80",
c300="#8C6A3F", c400="#4A3520", c500="#360304",
c600="#360304", c700="#360304", c800="#360304",
c900="#360304", c950="#360304",
),
neutral_hue=gr.themes.colors.Color(
c50="#F5EDD8", c100="#EDE0C4", c200="#C9AA80",
c300="#8C6A3F", c400="#4A3520", c500="#4A3520",
c600="#4A3520", c700="#4A3520", c800="#4A3520",
c900="#4A3520", c950="#4A3520",
),
font=[
gr.themes.GoogleFont("Almarai"),
"ui-sans-serif",
"sans-serif",
],
font_mono=[
gr.themes.GoogleFont("Almarai"),
"ui-monospace",
"monospace",
],
)
# ============================================================
# 8. CSS
# ============================================================
CUSTOM_CSS = """
@import url('https://fonts.googleapis.com/css2?family=Ovo&family=Almarai:wght@300;400;700;800&display=swap');
:root {
--sand: #F5EDD8;
--linen: #EDE0C4;
--clay: #C9AA80;
--earth: #8C6A3F;
--soil: #4A3520;
--burgundy: #360304;
}
.gradio-container {
background: var(--sand) !important;
font-family: 'Almarai', sans-serif !important;
color: var(--soil) !important;
}
body,
.gradio-container,
.gradio-container *,
.gradio-container p,
.gradio-container span,
.gradio-container label,
.gradio-container div,
.prose,
.prose p,
.prose span {
color: var(--soil) !important;
font-family: 'Almarai', sans-serif !important;
}
#latifa-header {
background: linear-gradient(180deg, #FFFFFF 0%, var(--sand) 100%);
border: 1px solid var(--clay);
border-radius: 20px;
padding: 24px 28px 22px;
text-align: center;
margin-bottom: 16px;
position: relative;
overflow: hidden;
animation: fadeUp 0.6s ease-out;
}
#latifa-header * {
color: var(--soil) !important;
}
#latifa-header .logo-img {
height: 96px;
width: auto;
margin-bottom: 10px;
position: relative;
}
#latifa-header h1 {
font-family: 'Ovo', serif !important;
font-size: 1.7rem !important;
color: var(--burgundy) !important;
margin: 0 0 6px !important;
letter-spacing: 0.02em;
position: relative;
}
#latifa-header .tagline {
font-size: 0.95rem;
color: var(--earth) !important;
letter-spacing: 0.04em;
margin: 0;
position: relative;
}
#latifa-header .tagline-ar {
font-size: 0.88rem;
color: var(--earth) !important;
opacity: 0.85;
margin: 4px 0 0;
position: relative;
direction: rtl;
}
#status-bar {
text-align: center;
padding: 6px 18px;
border-radius: 16px;
font-size: 0.82rem;
font-weight: 700;
color: var(--soil) !important;
background: var(--linen) !important;
border: 1px solid var(--clay);
margin-bottom: 10px;
display: inline-block;
}
#chat-window,
#chat-window *,
#chat-window div,
#chat-window span,
#chat-window p,
#chat-window label {
border-radius: 16px !important;
}
#chat-window {
background: var(--linen) !important;
border: 1px solid var(--clay) !important;
box-shadow: 0 4px 24px rgba(74,53,32,0.08) !important;
animation: fadeUp 0.8s ease-out;
}
#chat-window .user,
#chat-window .message.user,
#chat-window [class*="user"],
div[data-testid*="user"] .message,
div[data-testid*="user"] p,
div[data-testid*="user"] span {
background: var(--burgundy) !important;
color: #F5EDD8 !important;
border-radius: 14px !important;
}
#chat-window .bot,
#chat-window .message.bot,
#chat-window [class*="bot"],
div[data-testid*="bot"] .message,
div[data-testid*="bot"] p,
div[data-testid*="bot"] span {
background: var(--sand) !important;
color: var(--soil) !important;
border: 1px solid var(--clay) !important;
border-radius: 14px !important;
}
.gradio-chatbot .message,
.gradio-chatbot p,
.gradio-chatbot span,
.gradio-chatbot div {
color: var(--soil) !important;
}
.gradio-chatbot .user p,
.gradio-chatbot .user span,
.gradio-chatbot .user div {
color: #F5EDD8 !important;
}
.gradio-chatbot .bot p,
.gradio-chatbot .bot span,
.gradio-chatbot .bot div {
color: var(--soil) !important;
}
.chip-btn {
border-radius: 20px !important;
background: var(--sand) !important;
border: 1.5px solid var(--clay) !important;
color: var(--soil) !important;
padding: 6px 18px !important;
font-size: 0.82rem !important;
font-weight: 700 !important;
cursor: pointer !important;
transition: all 0.25s ease !important;
white-space: nowrap !important;
}
.chip-btn:hover {
background: var(--earth) !important;
color: var(--sand) !important;
border-color: var(--earth) !important;
transform: translateY(-1px) !important;
box-shadow: 0 4px 12px rgba(74,53,32,0.15) !important;
}
.chip-btn:active {
transform: scale(0.97) !important;
}
#input-row textarea,
#input-row input {
background: var(--sand) !important;
border: 1.5px solid var(--clay) !important;
border-radius: 12px !important;
color: var(--soil) !important;
font-size: 0.95rem !important;
}
#input-row textarea:focus,
#input-row input:focus {
border-color: var(--earth) !important;
box-shadow: 0 0 0 2px rgba(140,106,63,0.2) !important;
}
#input-row textarea::placeholder,
#input-row input::placeholder {
color: var(--earth) !important;
opacity: 0.7 !important;
}
#send-btn {
background: var(--burgundy) !important;
color: var(--sand) !important;
border: none !important;
border-radius: 12px !important;
font-weight: 700 !important;
font-size: 0.95rem !important;
padding: 10px 24px !important;
transition: all 0.25s ease !important;
}
#send-btn:hover {
background: var(--soil) !important;
transform: translateY(-1px) !important;
}
#replay-btn,
#clear-btn {
border-radius: 12px !important;
font-weight: 700 !important;
border: 1.5px solid var(--clay) !important;
color: var(--soil) !important;
background: var(--sand) !important;
transition: all 0.25s ease !important;
}
#replay-btn:hover,
#clear-btn:hover {
background: var(--earth) !important;
color: var(--sand) !important;
}
#audio-input,
#audio-output {
border-radius: 12px !important;
background: var(--linen) !important;
border: 1px solid var(--clay) !important;
}
label,
.label-wrap span {
color: var(--soil) !important;
font-weight: 700 !important;
}
#footer-credit {
text-align: center;
padding: 18px 10px 8px;
font-size: 0.75rem;
color: var(--earth) !important;
line-height: 1.6;
}
#footer-credit a {
color: var(--earth) !important;
text-decoration: underline;
}
@keyframes fadeUp {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
@media (max-width: 640px) {
#latifa-header { padding: 24px 16px 20px; }
#latifa-header h1 { font-size: 1.8rem !important; }
.chip-btn { font-size: 0.72rem !important; padding: 5px 10px !important; }
}
::-webkit-scrollbar { width: 6px; }
::-webkit-scrollbar-track { background: var(--linen); }
::-webkit-scrollbar-thumb { background: var(--clay); border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: var(--earth); }
.gradio-accordion,
.gradio-group,
.gradio-box {
background: var(--linen) !important;
border-color: var(--clay) !important;
color: var(--soil) !important;
}
.gradio-container .prose h1,
.gradio-container .prose h2,
.gradio-container .prose h3,
.gradio-container .prose h4 {
color: var(--soil) !important;
}
.chips-label {
text-align: center;
margin: 8px 0 4px;
font-size: 0.8rem;
color: var(--earth) !important;
font-weight: 700;
}
#quick-actions-acc {
border: 1px solid var(--clay) !important;
border-radius: 14px !important;
background: var(--linen) !important;
margin-bottom: 10px !important;
}
#quick-actions-acc .label-wrap {
padding: 8px 14px !important;
}
#quick-actions-acc button.label-wrap,
#quick-actions-acc .label-wrap span {
color: var(--soil) !important;
font-weight: 700 !important;
font-size: 0.85rem !important;
}
"""
# ============================================================
# 9. GRADIO UI
# ============================================================
with gr.Blocks(
css=CUSTOM_CSS,
title="Latifa AI — Under The Palm Tree",
theme=latifa_theme,
) as demo:
# ---------- Header ----------
gr.HTML(
"""
<link href="https://fonts.googleapis.com/css2?family=Ovo&family=Almarai:wght@300;400;700;800&display=swap" rel="stylesheet">
<div id="latifa-header">
<img class="logo-img" src="data:image/png;base64,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" alt="Under The Palm Tree">
<h1>Latifa AI — لطيفة</h1>
<p class="tagline">Your Voice Guide Under The Palm Tree</p>
<p class="tagline-ar">دليلك الصوتي تحت شجرة النخيل</p>
</div>
"""
)
# ---------- Status ----------
status = gr.HTML(STATUS_READY)
# ---------- Chat ----------
chatbot = gr.Chatbot(
label="Conversation",
height=380,
type="messages",
elem_id="chat-window",
)
# ---------- Quick Action Chips (collapsed by default to reduce clutter) ----------
with gr.Accordion("Quick Actions | إجراءات سريعة", open=False, elem_id="quick-actions-acc"):
with gr.Row(equal_height=False):
chip_char = gr.Button("Characters | الشخصيات", elem_classes=["chip-btn"], size="sm")
chip_chap = gr.Button("Chapters | الفصول", elem_classes=["chip-btn"], size="sm")
chip_game = gr.Button("Games | الألعاب", elem_classes=["chip-btn"], size="sm")
with gr.Row(equal_height=False):
chip_vocab = gr.Button("Vocabulary | المفردات", elem_classes=["chip-btn"], size="sm")
chip_quiz = gr.Button("Quiz | اختبرني", elem_classes=["chip-btn"], size="sm")
chip_oman = gr.Button("Oman 1973", elem_classes=["chip-btn"], size="sm")
# ---------- Input ----------
with gr.Row(elem_id="input-row"):
user_input = gr.Textbox(
show_label=False,
placeholder="Ask Latifa anything... | اسأل لطيفة عن أي شيء…",
scale=4,
elem_id="text-input",
)
voice_input = gr.Audio(
sources=["microphone"],
type="filepath",
show_label=False,
scale=2,
elem_id="audio-input",
)
# ---------- Action Buttons ----------
with gr.Row():
send_btn = gr.Button(
"Send & Speak | أرسل ✨", variant="primary", elem_id="send-btn", scale=3
)
replay_btn = gr.Button("🔊 Replay | أعد", elem_id="replay-btn", scale=1)
clear_btn = gr.Button("🗑️ Clear | مسح", elem_id="clear-btn", scale=1)
# ---------- Audio Output ----------
audio_output = gr.Audio(
label="Voice Response | الرد الصوتي", autoplay=True, elem_id="audio-output"
)
# ---------- Footer ----------
gr.HTML(
"""
<div id="footer-credit">
Created by <strong>Thuraya Mohammed Ali Al-Naabia</strong>
— Founder of Under the Palm Tree<br>
<a href="https://www.under-palm-tree.com" target="_blank">
www.under-palm-tree.com
</a>
</div>
"""
)
# ========================================================
# 10. EVENT WIRING
# ========================================================
main_inputs = [user_input, voice_input, chatbot]
main_outputs = [chatbot, audio_output, user_input, voice_input, status]
send_btn.click(
fn=latifa_respond, inputs=main_inputs, outputs=main_outputs
)
user_input.submit(
fn=latifa_respond, inputs=main_inputs, outputs=main_outputs
)
replay_btn.click(
fn=replay, inputs=[chatbot], outputs=[audio_output, status]
)
clear_btn.click(
fn=clear_all, outputs=[chatbot, audio_output, user_input, status]
)
chip_presets = {
chip_char: "Tell me about the characters in Under the Palm Tree",
chip_chap: "Show me the story chapters",
chip_game: "What games can I play to practice English?",
chip_vocab: "Help me practice vocabulary from the story",
chip_quiz: "Quiz me on Under the Palm Tree",
chip_oman: "Tell me about Oman in 1973",
}
for btn, prompt in chip_presets.items():
btn.click(
fn=lambda h, p=prompt: latifa_respond(p, None, h),
inputs=[chatbot],
outputs=main_outputs,
)
# ============================================================
# 11. AVATAR BRIDGE — sends signals to parent website
# ============================================================
BRIDGE_JS = """
<script>
(function() {
function send(cmd) {
try { window.parent.postMessage({latifa: cmd}, '*'); } catch(e) {}
}
function watchAudio() {
var audioEls = document.querySelectorAll('audio');
for (var i = 0; i < audioEls.length; i++) {
var a = audioEls[i];
if (a._bridged) continue;
a._bridged = true;
a.addEventListener('playing', function() { send('talking'); });
a.addEventListener('ended', function() { send('stop'); });
a.addEventListener('pause', function() { send('stop'); });
}
}
function watchChat() {
var observer = new MutationObserver(function(mutations) {
for (var i = 0; i < mutations.length; i++) {
var nodes = mutations[i].addedNodes;
for (var j = 0; j < nodes.length; j++) {
var node = nodes[j];
if (node.nodeType !== 1) continue;
var isBot = false;
try {
isBot = (node.querySelector && node.querySelector('[data-testid*="bot"]'))
|| (node.classList && node.classList.contains('bot'));
} catch(e) {}
if (isBot) {
send('thinking');
setTimeout(function() { watchAudio(); }, 1000);
setTimeout(function() { send('stop'); }, 15000);
}
}
}
});
var chatbot = null;
try {
chatbot = document.querySelector('.gradio-chatbot')
|| document.querySelector('[data-testid="chatbot"]');
} catch(e) {}
if (chatbot) {
observer.observe(chatbot, { childList: true, subtree: true });
} else {
setTimeout(watchChat, 2000);
}
}
function watchMic() {
document.addEventListener('click', function(e) {
var el = e.target;
if (el.closest && (
el.closest('[data-testid="audio"]') ||
el.closest('.audio-container')
)) {
send('listening');
setTimeout(function() { send('stop'); }, 15000);
}
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
watchChat(); watchMic(); watchAudio();
});
} else {
watchChat(); watchMic(); watchAudio();
}
})();
</script>
"""
with demo:
gr.HTML(BRIDGE_JS, visible=False)
# ============================================================
# 12. LAUNCH
# ============================================================
if __name__ == "__main__":
demo.launch()