File size: 5,585 Bytes
fd64912
5721af8
b4bd0de
b9dc3fd
d67bb32
5721af8
4ddc0d8
9216a0a
4ddc0d8
d6c911d
 
4ddc0d8
f1985ef
b9cae4e
 
b0faac5
 
b9cae4e
 
 
b0faac5
b9cae4e
 
 
 
 
 
 
 
 
b0faac5
4ddc0d8
 
 
5721af8
4ddc0d8
8f34be7
9216a0a
 
4ddc0d8
 
 
 
 
 
 
 
 
5721af8
4ddc0d8
 
 
b9cae4e
 
 
1f6d39f
4ddc0d8
 
d67bb32
4ddc0d8
 
 
 
d67bb32
4ddc0d8
 
b9cae4e
 
 
 
 
 
 
 
4ddc0d8
 
d67bb32
b9cae4e
4ddc0d8
 
 
 
 
 
 
d67bb32
4ddc0d8
d67bb32
4ddc0d8
 
 
d67bb32
5721af8
4ddc0d8
 
 
 
 
 
 
 
 
 
 
 
b9cae4e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d67bb32
4ddc0d8
 
 
5721af8
4ddc0d8
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import streamlit as st
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
from gtts import gTTS
from pytube import Search
import random
import os
import time

# Load pretrained models
tokenizer = AutoTokenizer.from_pretrained("microsoft/DialoGPT-medium")
model = AutoModelForCausalLM.from_pretrained("microsoft/DialoGPT-medium")
emotion_classifier = pipeline("text-classification", model="bhadresh-savani/distilbert-base-uncased-emotion", return_all_scores=True)

# Function to generate a comforting story using the pretrained model
def generate_story(theme):
    # A more detailed prompt for generating a story about courage
    story_prompt = f"Tell me a detailed, comforting, and heartwarming story about {theme}. The story should include a character facing a tough challenge, showing immense courage, and ultimately overcoming it with a positive resolution. Include specific moments of struggle and inspiration."
    input_ids = tokenizer.encode(story_prompt, return_tensors='pt')
    story_ids = model.generate(
        input_ids,
        max_length=500,  # Increase length for more detailed content
        temperature=0.9,  # Encourage creative storytelling
        repetition_penalty=1.1,
        num_return_sequences=1
    )
    # Decode the generated story text
    story = tokenizer.decode(story_ids[0], skip_special_tokens=True)
    return story



# Streamlit page configuration
st.set_page_config(page_title="Grief and Loss Support Bot 🌿", page_icon="🌿", layout="centered")
st.markdown("<style>.css-1d391kg { background-color: #F3F7F6; }</style>", unsafe_allow_html=True)

# Title and welcome text
st.title("Grief and Loss Support Bot 🌿")
st.subheader("Your compassionate companion in tough times πŸ’š")

# Sidebar for additional features
with st.sidebar:
    st.header("🧘 Guided Meditation")
    if st.button("Play Meditation"):
        meditation_audio = "meditation.mp3"
        if not os.path.exists(meditation_audio):
            tts = gTTS("Take a deep breath. Relax and let go of any tension...", lang='en')
            tts.save(meditation_audio)
        st.audio(meditation_audio, format="audio/mp3")
    
    st.header("πŸ“– Short Comforting Story")
    story_theme = st.selectbox("Choose a theme for your story:", ["courage", "healing", "hope"])
    if st.button("Generate Story"):
        with st.spinner("Generating your story..."):
            story = generate_story(story_theme)
        st.text_area("Here's your story:", story, height=300)

# User input section
user_input = st.text_input("Share what's on your mind...", placeholder="Type here...", max_chars=500)

if 'previous_responses' not in st.session_state:
    st.session_state.previous_responses = []
if 'badges' not in st.session_state:
    st.session_state.badges = []

def generate_response(user_input):
    input_ids = tokenizer.encode(user_input + tokenizer.eos_token, return_tensors='pt')
    chat_history_ids = model.generate(
        input_ids,
        max_length=350,  # Increase length for more detailed responses
        temperature=0.85,  # Adjust temperature for creative responses
        top_k=50,
        repetition_penalty=1.2,
        num_return_sequences=1
    )
    response = tokenizer.decode(chat_history_ids[:, input_ids.shape[-1]:][0], skip_special_tokens=True)
    return response


# Analyze user input for emotional tone
def get_emotion(user_input):
    emotions = emotion_classifier(user_input)
    emotions_sorted = sorted(emotions[0], key=lambda x: x['score'], reverse=True)
    return emotions_sorted[0]['label']

# Provide a response if user input is provided
if user_input:
    emotion = get_emotion(user_input)
    response = generate_response(user_input)
    
    # Display the bot's response
    st.session_state.previous_responses.append(response)
    st.text_area("Bot's Response:", response, height=250)
    
    # Assign motivational badges
    if emotion in ["joy", "optimism"]:
        badge = "🌟 Positivity Badge"
        if badge not in st.session_state.badges:
            st.session_state.badges.append(badge)
            st.success(f"Congratulations! You've earned a {badge}!")
    
    # Suggest coping activities
    st.info("🎨 Try a New Activity")
    activities = ["exercise", "yoga", "journaling", "painting", "meditation"]
    selected_activity = st.selectbox("Pick an activity:", activities)
    
def fetch_youtube_videos(activity):
    search = Search(f"{activity} for mental health relaxation")
    search_results = search.results[:3]
    videos = []
    for video in search_results:
        video_url = f"https://www.youtube.com/watch?v={video.video_id}"
        videos.append((video.title, video_url))
    return videos

if st.button("Find Videos"):
    videos = fetch_youtube_videos(selected_activity)
    if not videos:
        st.write(f"No results found for '{selected_activity}'.")
    else:
        for title, url in videos:
            st.write(f"[{title}]({url})")


# Crisis resources
if any(word in user_input.lower() for word in ["suicide", "help", "depressed"]):
    st.warning("Please reach out to a crisis hotline for immediate support.")
    st.write("[Find emergency resources here](https://www.helpguide.org/find-help.htm)")

# Generate audio response
if user_input:
    tts = gTTS(response, lang='en')
    audio_file = "response.mp3"
    tts.save(audio_file)
    st.audio(audio_file, format="audio/mp3")

# Display badges and achievements
if st.session_state.badges:
    st.sidebar.header("πŸ… Achievements")
    for badge in st.session_state.badges:
        st.sidebar.write(badge)