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 (as tuples)."""
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)} 💥"
# Append the message and response as a tuple
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
# Custom CSS for Visual Styling
custom_css = """
body {
background: linear-gradient(135deg, #000000, #ff5722);
color: white;
font-family: 'Arial', sans-serif;
}
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"] {
background: rgba(255, 255, 255, 0.1) !important;
color: white !important;
border: 2px solid #ff5722 !important;
padding: 12px !important;
border-radius: 8px !important;
font-size: 14px;
}
#components-container {
margin-top: 20px;
}
.gradio-container {
padding: 16px !important;
box-shadow: 0px 12px 24px rgba(0, 0, 0, 0.6);
}
"""
# Gradio Interface
with gr.Blocks(css=custom_css) as app:
gr.Markdown("# 🌟 Well-Being Companion")
gr.Markdown("Empowering Your Well-Being Journey 💚")
with gr.Row():
user_message = gr.Textbox(label="Your Message", placeholder="Enter your message...")
user_location = gr.Textbox(label="Your Location", placeholder="Enter your location...")
search_query = gr.Textbox(label="Query", placeholder="Search for professionals...")
submit_btn = gr.Button("Submit")
chatbot_box = gr.Chatbot(label="Chat History") # Corrected history format (list of tuples)
emotion_output = gr.Textbox(label="Detected Emotion")
sentiment_output = gr.Textbox(label="Detected Sentiment")
suggestions_output = gr.DataFrame(headers=["Title", "Links"], label="Suggestions")
map_output = gr.HTML(label="Nearby Professionals Map")
professional_display = gr.Textbox(label="Nearby Professionals", lines=5)
submit_btn.click(
app_function,
inputs=[user_message, user_location, search_query, chatbot_box],
outputs=[
chatbot_box, sentiment_output, emotion_output,
suggestions_output, professional_display, map_output,
],
)
app.launch()