WellVerse / app.py
ishrat5e's picture
Update app.py
a7b5aa6 verified
Raw
History Blame Contribute Delete
7.37 kB
import gradio as gr
from huggingface_hub import InferenceClient
import numpy as np
from PIL import Image
import tensorflow as tf
tflite = tf.lite
import random
def get_quote():
quotes = [
"Believe you can and you're halfway there.",
"Every day is a new beginning.",
"Your potential is endless.",
"The secret of getting ahead is getting started."
]
return random.choice(quotes)
def update_quote():
quote = get_quote()
return f"""
<div style="
background-color: #FEFEFE;
border: 2px solid #D2E186;
padding: 20px;
border-radius: 15px;
text-align: center;
margin: 20px 0;
box-shadow: 2px 2px 10px rgba(65, 81, 17, 0.1);
">
<p style="color: #D2E186; font-size: 0.9rem; margin: 0; font-weight: bold;">✨ QUOTE OF THE DAY</p>
<p style="color: #415111; font-size: 1.2rem; font-style: italic; margin: 10px 0 0 0;">
"{quote}"
</p>
</div>
"""
interpreter = tflite.Interpreter(model_path="model_unquant.tflite")
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
with open("labels.txt", "r") as f:
labels = [line.strip().split(" ", 1)[-1] for line in f.readlines()]
def predict_asl(frame):
if frame is None:
return "–"
img = Image.fromarray(frame).resize((224, 224))
img_array = np.array(img, dtype=np.float32) / 255.0
img_array = np.expand_dims(img_array, axis=0)
interpreter.set_tensor(input_details[0]['index'], img_array)
interpreter.invoke()
predictions = interpreter.get_tensor(output_details[0]['index'])[0]
best_idx = int(np.argmax(predictions))
return labels[best_idx]
spotify_embed = """
<iframe data-testid="embed-iframe"
style="border-radius:12px"
src="https://open.spotify.com/embed/playlist/3fZeYquijfHzPFtIMXzzUY?utm_source=generator"
width="100%"
height="352"
frameBorder="0"
allowfullscreen=""
allow="autoplay;
clipboard-write;
encrypted-media;
fullscreen;
picture-in-picture"
loading="lazy"></iframe>
"""
theme = gr.themes.Soft().set(
body_background_fill="#e8ede8",
block_background_fill="#f5f7f4cc",
border_color_primary="#c8d4c8",
button_primary_background_fill="#8aaa94",
button_primary_background_fill_hover="#6a8a74",
button_primary_text_color="#ffffff",
button_secondary_background_fill="#d4c49a",
button_secondary_background_fill_hover="#b8a878",
button_secondary_text_color="#ffffff",
body_text_color="#4a5a50",
block_title_text_color="#6a8a74",
block_label_text_color="#8aaa94",
input_background_fill="#f5f7f4",
input_border_color="#c8d4c8",
link_text_color="#8aaa94"
)
with open("knowledge.txt", "r", encoding="utf-8") as f:
knowledge_base = f.read()
client = InferenceClient("Qwen/Qwen2.5-7B-Instruct")
SYSTEM_MESSAGES = {
"wellness": (
"You are a kind wellness chatbot. "
"Give practical, supportive advice."
),
"story": (
"You are a creative storytelling assistant. "
"Create engaging stories."
)
}
def respond(message, history, mode):
if mode is None:
yield "Please select a mode first.", mode
return
messages = [{
"role": "system",
"content": SYSTEM_MESSAGES[mode] + "\n\n" + knowledge_base
}]
if history:
messages.extend(history)
messages.append({"role": "user", "content": message})
response = ""
for chunk in client.chat_completion(
messages=messages,
max_tokens=1024,
temperature=0.7,
top_p=0.9,
stream=True,
):
delta = chunk.choices[0].delta
token = delta.content if delta and hasattr(delta, "content") else ""
response += token
yield response, mode
def add_letter(letter, word):
if letter and letter != "–":
return word + letter
return word
def add_space(word):
return word + " "
def clear_word():
return ""
def send_word(word):
return word, ""
with gr.Blocks(theme=theme) as demo:
mode_state = gr.State(None)
gr.Image("Website Banner.png", show_label=False, container=False)
gr.Markdown("# Your Wellness and Storytelling Companion")
quote_box = gr.Markdown()
demo.load(fn=update_quote, outputs=quote_box)
gr.HTML("""
<div style="text-align:center; color:#c77dff; font-size:0.8rem; margin-bottom:6px;">
How can I help you today?
</div>
""")
with gr.Row():
wellness_btn = gr.Button("🌿 Wellness", variant="primary")
story_btn = gr.Button("📖 Story", variant="secondary")
chatbot = gr.ChatInterface(
fn=respond,
additional_inputs=[mode_state],
additional_outputs=[mode_state]
)
wellness_btn.click(
fn=lambda: ([{"role": "assistant", "content": "Wellness mode"}], "wellness"),
outputs=[chatbot.chatbot, mode_state]
)
story_btn.click(
fn=lambda: ([{"role": "assistant", "content": "Story mode"}], "story"),
outputs=[chatbot.chatbot, mode_state]
)
gr.Markdown("### 🤟 ASL Input")
with gr.Group():
gr.Markdown("*Sign a letter in front of your camera, then click Add Letter to build a word and Send to chat.*")
with gr.Row():
with gr.Column(scale=1):
asl_cam = gr.Image(
sources=["webcam"],
streaming=True,
label="Camera",
height=300
)
with gr.Column(scale=1):
asl_detected = gr.Textbox(label="Detected Letter", interactive=False, value="–")
asl_word_box = gr.Textbox(label="Current Word", interactive=False, value="")
with gr.Row():
asl_add_btn = gr.Button("Add Letter", variant="primary")
asl_space_btn = gr.Button("Space", variant="secondary")
asl_clear_btn = gr.Button("Clear", variant="secondary")
asl_send_btn = gr.Button("Send to Chat ➤", variant="primary")
word_state = gr.State("")
asl_cam.stream(
fn=predict_asl,
inputs=[asl_cam],
outputs=[asl_detected]
)
asl_add_btn.click(fn=add_letter, inputs=[asl_detected, word_state], outputs=[word_state]).then(
fn=lambda w: w, inputs=[word_state], outputs=[asl_word_box]
)
asl_space_btn.click(fn=add_space, inputs=[word_state], outputs=[word_state]).then(
fn=lambda w: w, inputs=[word_state], outputs=[asl_word_box]
)
asl_clear_btn.click(fn=clear_word, outputs=[word_state]).then(
fn=lambda w: w, inputs=[word_state], outputs=[asl_word_box]
)
asl_send_btn.click(fn=send_word, inputs=[word_state], outputs=[chatbot.textbox, word_state]).then(
fn=lambda w: w, inputs=[word_state], outputs=[asl_word_box]
)
gr.HTML("""
<div style="display:flex;align-items:center;gap:10px;margin:16px 0 8px;">
<div style="flex:1;height:1px;background:linear-gradient(to right,transparent,#f3c4d7);"></div>
<span style="color:#c77dff;font-size:0.85rem;">🎵Music</span>
<div style="flex:1;height:1px;background:linear-gradient(to left,transparent,#f3c4d7);"></div>
</div>
""")
gr.HTML(spotify_embed)
demo.launch(debug=True, allowed_paths=["."])