import os
import gradio as gr
import nltk
import numpy as np
import tensorflow as tf
import tflearn
import random
import json
import pickle
from nltk.tokenize import word_tokenize
from nltk.stem.lancaster import LancasterStemmer
from transformers import AutoTokenizer, AutoModelForSequenceClassification, pipeline
import googlemaps
import folium
import torch
# Disable GPU usage for TensorFlow
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
# Ensure necessary NLTK resources are downloaded
nltk.download("punkt")
# Initialize stemmer
stemmer = LancasterStemmer()
# Load intents.json and training data for chatbot
with open("intents.json") as file:
intents_data = json.load(file)
with open("data.pickle", "rb") as f:
words, labels, training, output = pickle.load(f)
# Build Chatbot Model
net = tflearn.input_data(shape=[None, len(training[0])])
net = tflearn.fully_connected(net, 8)
net = tflearn.fully_connected(net, 8)
net = tflearn.fully_connected(net, len(output[0]), activation="softmax")
net = tflearn.regression(net)
chatbot_model = tflearn.DNN(net)
chatbot_model.load("MentalHealthChatBotmodel.tflearn")
# Sentiment Analysis Model (Hugging Face)
tokenizer_sentiment = AutoTokenizer.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment")
model_sentiment = AutoModelForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment")
# Emotion Detection Model
tokenizer_emotion = AutoTokenizer.from_pretrained("j-hartmann/emotion-english-distilroberta-base")
model_emotion = AutoModelForSequenceClassification.from_pretrained("j-hartmann/emotion-english-distilroberta-base")
# Google Maps API Client
gmaps = googlemaps.Client(key=os.getenv('GOOGLE_API_KEY'))
# Process Text Input for Chatbot
def bag_of_words(s, words):
bag = [0] * len(words)
s_words = word_tokenize(s)
s_words = [stemmer.stem(word.lower()) for word in s_words if word.isalnum()]
for se in s_words:
for i, w in enumerate(words):
if w == se:
bag[i] = 1
return np.array(bag)
# Chatbot Functionality
def chatbot(message, history):
history = history or []
try:
results = chatbot_model.predict([bag_of_words(message, words)])
tag = labels[np.argmax(results)]
response = "I'm not sure how to respond to that. 🤔"
for intent in intents_data["intents"]:
if intent["tag"] == tag:
response = random.choice(intent["responses"])
break
except Exception as e:
response = f"Error: {str(e)} 💥"
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": response})
return history, response
# Detect Sentiment
def analyze_sentiment(user_input):
inputs = tokenizer_sentiment(user_input, return_tensors="pt")
with torch.no_grad():
outputs = model_sentiment(**inputs)
sentiment_class = torch.argmax(outputs.logits, dim=1).item()
sentiment_map = ["Negative 😔", "Neutral 😐", "Positive 😊"]
return sentiment_map[sentiment_class]
# Detect Emotion
def detect_emotion(user_input):
pipe = pipeline("text-classification", model=model_emotion, tokenizer=tokenizer_emotion)
result = pipe(user_input)
emotion = result[0]["label"]
emotion_map = {
"joy": "😊 Joy",
"anger": "😠 Anger",
"sadness": "😢 Sadness",
"fear": "😨 Fear",
"surprise": "😲 Surprise",
"neutral": "😐 Neutral",
}
return emotion_map.get(emotion, "Unknown Emotion 🤔")
# Generate Suggestions for Detected Emotion
def generate_suggestions(emotion):
resources = {
"😊 Joy": [
["Relaxation Techniques", "Relaxation", 'Visit'],
["Dealing with Stress", "Stress Management", 'Visit'],
["Emotional Wellness Toolkit", "Wellness", 'Visit'],
["Relaxation Videos", "Video", 'Watch']
],
"😢 Sadness": [
["Emotional Wellness Toolkit", "Wellness", 'Visit'],
["Dealing with Anxiety", "Anxiety Management", 'Visit'],
["Relaxation Videos", "Video", 'Watch']
],
"😨 Fear": [
["Mindfulness Practices", "Mindfulness", 'Visit'],
["Coping with Anxiety", "Anxiety Management", 'Visit'],
["Emotional Wellness Toolkit", "Wellness", 'Visit'],
["Relaxation Videos", "Video", 'Watch']
]
}
return resources.get(emotion.split(" ")[1], [["No specific suggestions available", "", ""]])
# Search Professionals and Generate Map
def get_health_professionals_and_map(location, query):
try:
geo_location = gmaps.geocode(location)
if geo_location:
lat, lng = geo_location[0]["geometry"]["location"].values()
places_result = gmaps.places_nearby(
location=(lat, lng), radius=10000, type="doctor", keyword=query
)["results"]
map_ = folium.Map(location=(lat, lng), zoom_start=13)
professionals = []
for place in places_result:
professionals.append(f"{place['name']} - {place.get('vicinity', '')}")
lat, lng = place["geometry"]["location"]["lat"], place["geometry"]["location"]["lng"]
folium.Marker([lat, lng], popup=place["name"]).add_to(map_)
return professionals, map_._repr_html_()
return ["No professionals found"], ""
except Exception as e:
return [f"Error: {e}"], ""
# Gradio App Function
def app_function(message, location, query, history):
chatbot_history, _ = chatbot(message, history)
sentiment = analyze_sentiment(message)
emotion = detect_emotion(message)
suggestions = generate_suggestions(emotion)
professionals_info, map_html = get_health_professionals_and_map(location, query)
return chatbot_history, sentiment, emotion, suggestions, professionals_info, map_html
# Gradio Interface
with gr.Blocks() as demo:
gr.Markdown("# 🌟 Well-Being Companion")
gr.Markdown("Empowering your mental health journey 💚")
with gr.Row():
user_input = gr.Textbox(label="Your Message")
location_input = gr.Textbox(label="Your Location")
query_input = gr.Textbox(label="Search Query")
submit_button = gr.Button("Submit")
chatbot_output = gr.Chatbot(label="Chat History", type="messages")
sentiment_output = gr.Textbox(label="Sentiment Detected")
emotion_output = gr.Textbox(label="Emotion Detected")
suggestions_output = gr.DataFrame(label="Suggestions", headers=["Title", "Subject", "Link"])
professionals_output = gr.Textbox(label="Nearby Professionals", lines=5)
map_output = gr.HTML(label="Map of Nearby Professionals")
submit_button.click(
app_function,
inputs=[user_input, location_input, query_input, chatbot_output],
outputs=[
chatbot_output, sentiment_output, emotion_output,
suggestions_output, professionals_output, map_output
],
)
demo.launch()