Spaces:
Sleeping
Sleeping
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)
|