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' # Suppress warnings related to missing CUDA libraries os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # Ensure necessary NLTK resources are downloaded nltk.download('punkt') # Initialize the stemmer stemmer = LancasterStemmer() # Load intents.json for Well-Being Chatbot with open("intents.json") as file: data = json.load(file) # Load preprocessed data for Well-Being Chatbot with open("data.pickle", "rb") as f: words, labels, training, output = pickle.load(f) # Build the model structure for Well-Being Chatbot net = tflearn.input_data(shape=[None, len(training[0])], dtype=tf.float32) # Fix for dtype 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) # Load the trained model model = tflearn.DNN(net) model.load("MentalHealthChatBotmodel.tflearn") # Function to process user input into a bag-of-words format for Chatbot def bag_of_words(s, words): bag = [0 for _ in range(len(words))] s_words = word_tokenize(s) s_words = [stemmer.stem(word.lower()) for word in s_words if word.lower() in words] for se in s_words: for i, w in enumerate(words): if w == se: bag[i] = 1 return np.array(bag) # Chat function for Well-Being Chatbot def chatbot(message, history): history = history or [] message = message.lower() try: # Predict the tag results = model.predict([bag_of_words(message, words)]) results_index = np.argmax(results) tag = labels[results_index] # Match tag with intent and choose a random response for tg in data["intents"]: if tg['tag'] == tag: responses = tg['responses'] response = random.choice(responses) break else: response = "I'm sorry, I didn't understand that. Could you please rephrase?" except Exception as e: response = f"An error occurred: {str(e)}" # Convert the new message and response to the 'messages' format history.append({"role": "user", "content": message}) history.append({"role": "assistant", "content": response}) return history, history # Sentiment Analysis using Hugging Face model tokenizer_sentiment = AutoTokenizer.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment") model_sentiment = AutoModelForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment") def analyze_sentiment(user_input): inputs = tokenizer_sentiment(user_input, return_tensors="pt") with torch.no_grad(): outputs = model_sentiment(**inputs) predicted_class = torch.argmax(outputs.logits, dim=1).item() sentiment = ["Negative", "Neutral", "Positive"][predicted_class] # Assuming 3 classes return f"Predicted Sentiment: {sentiment}" # Emotion Detection using Hugging Face model tokenizer_emotion = AutoTokenizer.from_pretrained("j-hartmann/emotion-english-distilroberta-base") model_emotion = AutoModelForSequenceClassification.from_pretrained("j-hartmann/emotion-english-distilroberta-base") def detect_emotion(user_input): pipe = pipeline("text-classification", model=model_emotion, tokenizer=tokenizer_emotion) result = pipe(user_input) emotion = result[0]['label'] return f"Emotion Detected: {emotion}" # Initialize Google Maps API client securely gmaps = googlemaps.Client(key=os.getenv('GOOGLE_API_KEY')) # Function to search for health professionals def search_health_professionals(query, location, radius=10000): places_result = gmaps.places_nearby(location, radius=radius, type='doctor', keyword=query) return places_result.get('results', []) # Function to get directions and display on Gradio UI def get_health_professionals_and_map(current_location, health_professional_query): location = gmaps.geocode(current_location) if location: lat = location[0]["geometry"]["location"]["lat"] lng = location[0]["geometry"]["location"]["lng"] location = (lat, lng) professionals = search_health_professionals(health_professional_query, location) # Generate map map_center = location m = folium.Map(location=map_center, zoom_start=13) # Add markers to the map for place in professionals: folium.Marker( location=[place['geometry']['location']['lat'], place['geometry']['location']['lng']], popup=place['name'] ).add_to(m) # Convert map to HTML for Gradio display map_html = m._repr_html_() # Route information route_info = "\n".join([f"{place['name']} - {place['vicinity']}" for place in professionals]) return route_info, map_html else: return "Unable to find location.", "" # Function to generate suggestions based on the detected emotion def generate_suggestions(emotion): suggestions = { 'joy': [ {"Title": "Relaxation Techniques 🌿", "Subject": "Relaxation", "Link": 'Mindful Breathing Meditation'}, {"Title": "Dealing with Stress 💆", "Subject": "Stress Management", "Link": 'Tips for Dealing with Anxiety'}, {"Title": "Emotional Wellness Toolkit 💪", "Subject": "Wellness", "Link": 'Emotional Wellness Toolkit'}, {"Title": "Relaxation Video 🎥", "Subject": "Video", "Link": 'Watch Video'} ], 'anger': [ {"Title": "Emotional Wellness Toolkit 💡", "Subject": "Wellness", "Link": 'Emotional Wellness Toolkit'}, {"Title": "Managing Anger 🌿", "Subject": "Anger Management", "Link": 'HelpGuide on Anger Management'}, {"Title": "Relaxation Techniques 💆", "Subject": "Relaxation", "Link": 'Mindful Breathing Meditation'}, {"Title": "Dealing with Stress 💡", "Subject": "Stress Management", "Link": 'Tips for Dealing with Anxiety'} ], 'sadness': [ {"Title": "Overcoming Sadness 🌈", "Subject": "Well-being", "Link": 'Overcoming Sadness'}, {"Title": "Building Self-Esteem 💪", "Subject": "Confidence", "Link": 'Self-Confidence Guide'}, {"Title": "Breathing Exercises 🧘‍♀️", "Subject": "Breathing", "Link": 'Mindful Breathing Meditation'}, {"Title": "Relaxation Tips 🌿", "Subject": "Relaxation", "Link": 'Stress Relief Tips'} ] } # Return suggestions based on emotion return suggestions.get(emotion.lower(), []) # Gradio Interface with gr.Blocks() as demo: with gr.Row(): with gr.Column(): message_input = gr.Textbox(label="Your Message", placeholder="Type a message here...", lines=4) location_input = gr.Textbox(label="Your Location", placeholder="Enter your location (e.g., Pune, India)...", lines=2) health_query_input = gr.Textbox(label="Health Professional Search", placeholder="Type a health professional type (e.g., therapist, doctor)...", lines=1) history_output = gr.Chatbot(label="Chat History").style(height=500) sentiment_output = gr.Textbox(label="Sentiment Analysis") emotion_output = gr.Textbox(label="Emotion Detection") suggestions_output = gr.Dataframe(label="Suggestions", headers=["Title", "Subject", "Link"], interactive=True) map_output = gr.HTML(label="Map") route_info_output = gr.Textbox(label="Nearby Health Professionals Info") message_input.submit(chatbot, [message_input, history_output], [history_output, history_output]) message_input.submit(analyze_sentiment, message_input, sentiment_output) message_input.submit(detect_emotion, message_input, emotion_output) message_input.submit(generate_suggestions, emotion_output, suggestions_output) location_input.submit(get_health_professionals_and_map, [location_input, health_query_input], [route_info_output, map_output]) demo.launch()