import streamlit as st from transformers import pipeline, GPT2LMHeadModel, GPT2Tokenizer from gtts import gTTS from pytube import Search import os import random # Initialize GPT-2 model and tokenizer from Hugging Face tokenizer = GPT2Tokenizer.from_pretrained("gpt2") model = GPT2LMHeadModel.from_pretrained("gpt2") # Create a text generation pipeline using GPT-2 generator = pipeline("text-generation", model=model, tokenizer=tokenizer) # Set up Streamlit page st.set_page_config(page_title="Grief and Loss Support Bot", page_icon="🌿", layout="centered") st.markdown(""" """, unsafe_allow_html=True) # Title st.title("Grief and Loss Support Bot 🌿") st.subheader("Your compassionate companion in tough times 💚") # Get user input user_input = st.text_input("Share what's on your mind...", placeholder="Type here...", max_chars=500) # Store previous responses to check for repetition if 'previous_responses' not in st.session_state: st.session_state.previous_responses = [] # Check if user has entered text if user_input: # Refined prompt for better empathetic responses prompt = f"The user is expressing their feelings of grief, loss, or overwhelm. Respond with empathy and support. User's input: {user_input}" # Run the text generation model to generate a response based on user input generated_responses = generator(prompt, max_length=250, num_return_sequences=3, temperature=0.7) # Filter out any responses that are too similar to previous responses or user input new_responses = [response['generated_text'] for response in generated_responses] new_responses = [resp for resp in new_responses if resp.lower() not in [prev.lower() for prev in st.session_state.previous_responses] and resp.lower() != user_input.lower()] # If there are valid new responses, pick one, otherwise fallback if new_responses: selected_response = random.choice(new_responses) else: # If no new response, fallback to a more generic empathetic message fallback_responses = [ "I understand how you're feeling. You're not alone in this. I'm here to listen and help.", "I'm really sorry you're going through this. Let's take one step at a time. I'm here for you.", "It sounds really tough right now. It's okay to feel overwhelmed. You're doing your best, and that's enough." ] selected_response = random.choice(fallback_responses) # Add extra empathetic phrases to the response extra_empathy = [ "It’s completely normal to feel this way when things get tough. You're doing great by reaching out.", "I know it can feel like a lot right now, but one step at a time. You're not alone in this.", "Even in the toughest times, remember that there’s always support around you." ] selected_response += " " + random.choice(extra_empathy) # Store the new response for future checks st.session_state.previous_responses.append(selected_response) # Display response st.text_area("Bot's Response:", selected_response, height=250) # Text-to-speech output tts = gTTS(selected_response, lang='en') audio_file = "response.mp3" tts.save(audio_file) st.audio(audio_file, format="audio/mp3") # Suggest a productive activity based on detected keywords if any(keyword in user_input.lower() for keyword in ["lonely", "lost", "sad", "overwhelmed", "academic", "exam"]): st.info("Here's a suggestion to help you cope:") # Providing a variety of activities based on user mood and needs activities = { "journaling": "Express your feelings in writing. Journaling is a great way to process emotions.", "yoga": "Yoga helps you relax and refocus. Try some deep breathing exercises or light stretching.", "painting": "Creative expression through painting or drawing can be soothing and help you release pent-up emotions.", "meditation": "Take a moment to calm your mind. Guided meditation can help reduce stress and anxiety.", "exercise": "Physical activity can lift your mood. Even a short walk in nature can make a big difference." } # Randomly select an activity category to suggest activity = random.choice(list(activities.keys())) st.write(f"How about {activity}? {activities[activity]}") # Search YouTube for videos related to the selected activity search = Search(activity) search_results = search.results[:3] # limit results to 3 videos for video in search_results: st.write(f"[{video.title}]({video.watch_url})") # Crisis resources crisis_keywords = ["help", "suicide", "depressed", "emergency", "hurt", "lost"] if any(keyword in user_input.lower() for keyword in crisis_keywords): st.warning("It seems like you might be in distress. Please reach out to a crisis hotline or a trusted individual.") st.write("[Find emergency resources here](https://www.helpguide.org/find-help.htm)")