import os import gradio as gr import nltk import numpy as np 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' # Download NLTK resources nltk.download("punkt") # Initialize Lancaster Stemmer stemmer = LancasterStemmer() # Load chatbot intents and training data 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 the chatbot's neural network 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") # Model for sentiment detection tokenizer_sentiment = AutoTokenizer.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment") model_sentiment = AutoModelForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment") # Model for emotion detection 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')) # Chatbot logic 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) def chatbot(message, history): """Generate chatbot response and append to 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((message, response)) return history, response # Sentiment analysis 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] # Emotion detection def detect_emotion(user_input): pipe = pipeline("text-classification", model=model_emotion, tokenizer=tokenizer_emotion) result = pipe(user_input) emotion = result[0]["label"] return emotion # Generate suggestions based on detected emotion def generate_suggestions(emotion): suggestions = { "joy": [ ["Relaxation Techniques", 'Visit'], ["Dealing with Stress", 'Visit'], ["Emotional Wellness Toolkit", 'Visit'], ["Relaxation Video", 'Watch'], ], "anger": [ ["Emotional Wellness Toolkit", 'Visit'], ["Stress Management Tips", 'Visit'], ["Dealing with Anger", 'Visit'], ["Relaxation Video", 'Watch'], ], } return suggestions.get(emotion, [["No 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, 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', '')}") folium.Marker([place["geometry"]["location"]["lat"], place["geometry"]["location"]["lng"]], popup=place["name"]).add_to(map_) return professionals, map_._repr_html_() return ["No professionals found"], "" except Exception as e: return [f"Error: {e}"], "" # Main app function def app_function(message, location, query, history): chatbot_history, _ = chatbot(message, history) # Generate chatbot response sentiment = analyze_sentiment(message) # Detect sentiment emotion = detect_emotion(message.lower()) # Detect emotion suggestions = generate_suggestions(emotion) # Generate suggestions professionals, map_html = get_health_professionals_and_map(location, query) # Find professionals & map return chatbot_history, sentiment, emotion, suggestions, professionals, map_html # Enhanced CSS for Black-Themed Interface custom_css = """ @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap'); body { background: linear-gradient(135deg, #000000, #ff5722); color: white; font-family: 'Roboto', sans-serif; text-align: center; } button { background-color: #ff5722 !important; border: none !important; color: white !important; padding: 12px 20px; font-size: 16px; border-radius: 8px; cursor: pointer; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); } button:hover { background-color: #e64a19 !important; } textarea, input[type="text"], .gr-chatbot { background: #000000 !important; color: white !important; border: 2px solid #ff5722 !important; padding: 12px !important; border-radius: 8px !important; font-size: 14px; } .gr-textbox { box-shadow: 0 4px 6px rgba(0, 0, 0, 0.5); } .output-container, .gr-html, .gr-textbox, .gr-dataframe { background: #000000 !important; color: white !important; border: 2px solid #ff5722 !important; border-radius: 8px !important; padding: 10px; } .gr-dataframe { font-size: 14px; height: 350px; /* Make the suggestions box larger */ overflow-y: scroll; /* Add scroll if the table doesn't fit */ } h1 { font-size: 3.5rem; /* Bigger and bold heading */ font-weight: bold; margin-bottom: 10px; color: white; text-shadow: 2px 2px 8px rgba(0, 0, 0, 0.6); } h2 { font-weight: 400; font-size: 1.8rem; color: white; text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.4); } """ # Gradio Interface with gr.Blocks(css=custom_css) as app: gr.HTML("