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()