mindfulmate / app.py
mfahadkhan's picture
Update app.py
af92bb2 verified
raw
history blame
9.96 kB
import gradio as gr
from transformers import pipeline
import random
import requests
from groq import Groq
from datetime import datetime
# Initialize the sentiment analysis pipeline
pipe = pipeline("text-classification", model="bhadresh-savani/bert-base-uncased-emotion")
# Initialize Groq client
# Relaxing music files
relaxing_music = {
"Surah Ad-duha": "https://server11.mp3quran.net/yasser/093.mp3",
"Surah Rehman": "https://server7.mp3quran.net/basit/Almusshaf-Al-Mojawwad/055.mp3",
"Surah Insan": "https://server6.mp3quran.net/qtm/076.mp3",
"Surah Takweer": "https://server10.mp3quran.net/jleel/081.mp3",
"Surah Qasas": "https://server10.mp3quran.net/jleel/028.mp3"
}
# Static list of coping strategies
coping_strategies = [
"Practice deep breathing exercises for 5 minutes.",
"Take a short walk and focus on your surroundings.",
"Write down three things you're grateful for today.",
"Try a mindfulness meditation session for 10 minutes.",
"Listen to calming music or nature sounds.",
"Take a moment to celebrate! Reflect on what made you happy. ",
"Trust in Allah’s plan: 'And whoever puts their trust in Allah, He will be enough for them",
"Face your fears with courage. Remember: 'Fear not, for indeed, I am with you both; I hear and I see.",
]
# Function to return a random coping strategy
def coping_strategy():
return random.choice(coping_strategies)
# Function to fetch motivational quotes from ZenQuotes API
def daily_motivation():
url = "https://zenquotes.io/api/random"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
quote = data[0]['q']
author = data[0]['a']
return f"{quote} - {author}"
else:
return "Could not fetch a motivational quote at the moment."
# Track if a chat has started and detected mood
chat_started = False
detected_mood = None
# Function to analyze mood using sentiment analysis
def analyze_mood(text):
global chat_started, detected_mood
chat_started = True
result = pipe(text)[0]
detected_mood = result['label'].capitalize()
return f"I sense you're feeling {detected_mood.lower()}."
# Function to generate a response using Groq's LLaMA model
def groq_chat(text):
try:
chat_completion = client.chat.completions.create(
messages=[
{
"role": "system",
"content": "You’re a compassionate and knowledgeable medical health advisor..."
},
{"role": "user", "content": text}
],
model="llama3-8b-8192",
)
return chat_completion.choices[0].message.content
except Exception as e:
return f"Error: {str(e)}"
# Function to play relaxing music
def play_music(music_choice):
music_url = relaxing_music[music_choice]
return music_url
# Function to handle chat responses
def handle_chat(text):
bot_response = groq_chat(text)
return [(text, bot_response)]
# Function to interpret quiz results
def interpret_results(answers):
# Answer index:
# 0-3: Non-distress related (0 points each)
# 4-7: Distress related (points based on severity)
# Distress question answers
distress_answers = answers[4:8]
# Calculate distress score
distress_score = 0
for answer in distress_answers:
if answer == "More than two weeks":
distress_score += 3
elif answer == "More than a week":
distress_score += 2
elif answer == "A few days but less than a week":
distress_score += 1
# Percentage calculation
percentage = min(distress_score / 12 * 100, 100) # Assuming max score is 12
# Interpret current situation
if percentage > 70:
situation = "High distress level. Symptoms are significantly impacting your daily life."
elif percentage > 40:
situation = "Moderate distress level. Some symptoms are affecting your daily activities."
else:
situation = "Low distress level. You seem to be managing well, but stay mindful."
# Suggestions
if percentage > 70:
suggestions = "It may be beneficial to seek professional help. Consider talking to a mental health counselor or therapist."
elif percentage > 40:
suggestions = "Try incorporating stress management techniques into your routine. Reach out to support networks or consider self-help resources."
else:
suggestions = "Continue with your current coping strategies and maintain a healthy routine. Keep track of any changes in your mental state."
return f"**Percentage Level:** {percentage:.2f}%\n\n**Current Situation:** {situation}\n\n**Suggestions:** {suggestions}"
# Initialize a list to store journal entries
journal_entries = []
# Function to save the journal entry with a timestamp
def save_journal(entry):
if entry.strip():
# Get the current date and time
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# Append the entry to the list with the timestamp
journal_entries.append(f"{timestamp} - {entry}")
# Return all entries as a single string, each entry on a new line
return "\n\n".join(journal_entries)
else:
return "Please write something to save."
# Gradio UI components
with gr.Blocks() as demo:
gr.Markdown("# <div style='text-align:center;'>🧘MindfulMate</div>\n\n**<div style='text-align:center;'>Be present, be peaceful</div>**", elem_id="header")
with gr.Tabs():
# Tab 1: Chat with MindfulMate
with gr.Tab("Chat"):
with gr.Row():
# Sidebar for music, coping strategies, and motivation
with gr.Column(scale=1):
music_choice = gr.Dropdown(choices=list(relaxing_music.keys()), label="Choose the Peace")
play_music_btn = gr.Button("Play")
audio_output = gr.Audio(label="Now Playing", autoplay=True, interactive=False)
options = gr.Dropdown(["Get Coping Strategy", "Daily Motivation"], label="Choose an option")
mood_output = gr.Textbox(label="Result", interactive=False)
# Handle coping strategy and daily motivation
options.change(fn=lambda opt: coping_strategy() if opt == "Get Coping Strategy" else daily_motivation(),
inputs=options, outputs=mood_output)
play_music_btn.click(fn=play_music, inputs=music_choice, outputs=audio_output)
# Main Chat Area
with gr.Column(scale=4):
chatbot = gr.Chatbot(label="Chat with MindfulMate")
with gr.Row():
text_input = gr.Textbox(label="Feel free to share what's in your mind...", scale=3)
voice_input = gr.Audio(type="filepath", label="Speak", scale=1)
submit_btn = gr.Button("Submit")
# Corrected click function to return the correct format
submit_btn.click(fn=lambda text: (handle_chat(text), analyze_mood(text)),
inputs=text_input, outputs=[chatbot, mood_output])
# Tab 2: Journal
with gr.Tab("Journal"):
gr.Markdown("### Journaling Section")
journal_input = gr.Textbox(label="Write about your day", placeholder="How was your day?", lines=6)
save_journal_btn = gr.Button("Save Entry")
journal_output = gr.Textbox(label="Your Journal Entries", interactive=False)
# Connect the save button to the save_journal function
save_journal_btn.click(fn=save_journal, inputs=journal_input, outputs=journal_output)
# Tab 3: Take the Quiz
with gr.Tab("Take the Quiz"):
gr.Markdown("### Mental Health Quiz")
question_1 = gr.Dropdown(["Sadness", "Anger", "Fear", "Guilt"], label="Which difficult emotion do you struggle with the most?")
question_2 = gr.Dropdown(["0-1 hours", "2-3 hours", "4-5 hours", "More than 5 hours"], label="On an average weekday, how many hours do you spend alone?")
question_3 = gr.Dropdown(["Very well", "Somewhat well", "Not very well", "Not at all"], label="How well do you feel you manage your stress?")
question_4 = gr.Dropdown(["Introvert", "Extrovert"], label="Would you consider yourself an introvert or an extrovert?")
question_5 = gr.Dropdown(["Not at all", "A few days but less than a week", "More than a week", "More than two weeks"], label="Over the last 2 weeks, how often have you been feeling nervous or anxious?")
question_6 = gr.Dropdown(["Not at all", "A few days but less than a week", "More than a week", "More than two weeks"], label="Over the last 2 weeks, how often have you been bothered by not being able to control your thoughts or worries?")
question_7 = gr.Dropdown(["Not at all", "A few days but less than a week", "More than a week", "More than two weeks"], label="Over the last 2 weeks, how often have you felt little interest or pleasure in doing things that you normally enjoyed doing?")
question_8 = gr.Dropdown(["Not at all", "A few days but less than a week", "More than a week", "More than two weeks"], label="Over the last 2 weeks, how often have you felt down, depressed, or hopeless?")
quiz_submit = gr.Button("Submit Quiz")
quiz_results = gr.Textbox(label="Quiz Results", interactive=False)
# Handle quiz results
quiz_submit.click(fn=lambda *answers: interpret_results(list(answers)),
inputs=[question_1, question_2, question_3, question_4, question_5, question_6, question_7, question_8],
outputs=quiz_results)
demo.launch()