Spaces:
Sleeping
Sleeping
# app.py | |
import streamlit as st | |
import random | |
import pandas as pd | |
import time | |
import speech_recognition as sr | |
from openai import OpenAI | |
from PyPDF2 import PdfReader | |
import langchain | |
from langchain.text_splitter import RecursiveCharacterTextSplitter | |
from langchain.vectorstores import FAISS | |
from langchain.embeddings.openai import OpenAIEmbeddings | |
from langchain.chains import RetrievalQA | |
from langchain.chat_models import ChatOpenAI | |
from langchain.embeddings import HuggingFaceEmbeddings | |
# Set DeepSeek API Key | |
api_key = "0f33d8a8b7714460bc4b8335b66d217a" | |
base_url = "https://api.aimlapi.com/v1" | |
# Initialize OpenAI client | |
api = OpenAI(api_key=api_key, base_url=base_url) | |
# Generate 300 Dummy Messages with Severity Levels | |
severities = ["High", "Medium", "Low"] | |
messages = [ | |
{"message": f"Disaster Alert {i}", "severity": random.choice(severities)} | |
for i in range(300) | |
] | |
df = pd.DataFrame(messages) | |
# Streamlit UI | |
st.set_page_config(page_title="BDRS", layout="wide") | |
st.title("π BeaconAi Disaster Response System") | |
st.write("Real-time disaster response with DeepSeek AI-powered chatbot & voice recognition.") | |
# Live-updating Disaster Message Dashboard | |
st.subheader("π Social Media Monitoring") | |
chart_placeholder = st.empty() | |
# Function to Randomly Pick 5 Messages | |
def get_random_messages(): | |
return df.sample(5) | |
# Placeholder for chart | |
chart_placeholder = st.empty() | |
# Define severity categories | |
severities = ["Low", "Medium", "High"] | |
# Function to update chart | |
def update_chart(): | |
selected_messages = get_random_messages() | |
severity_counts = selected_messages["severity"].value_counts().reindex(severities, fill_value=0) | |
# Create DataFrame | |
chart_data = pd.DataFrame({"Severity": severities, "Count": severity_counts.values}) | |
# Update the chart | |
chart_placeholder.bar_chart(chart_data, x="Severity", y="Count", use_container_width=True) | |
# Auto-refresh every second | |
st.button("Refresh Data", on_click=st.rerun) | |
update_chart() | |
# PDF Processing for Chatbot Context (Pre-Provided PDF) | |
pdf_path = "Natural%20Disaster%20Safety%20Manual.pdf" # Ensure this file is in the same directory as app.py | |
pdf_reader = PdfReader(pdf_path) | |
raw_text = "" | |
for page in pdf_reader.pages: | |
raw_text += page.extract_text() + "\n" | |
# Convert to Embeddings for Retrieval | |
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) | |
texts = text_splitter.split_text(raw_text) | |
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") | |
vector_db = FAISS.from_texts(texts, embeddings) | |
retriever = vector_db.as_retriever() | |
# LangGraph-Powered Q&A System | |
chat_model = ChatOpenAI(model="deepseek-chat", api_key=api_key, base_url=base_url) | |
qa = RetrievalQA.from_chain_type(llm=chat_model, chain_type="stuff", retriever=retriever) | |
# Chatbot UI | |
st.subheader("π€ AI-Powered Disaster Chatbot") | |
user_query = st.text_input("Ask the chatbot:") | |
if user_query: | |
response = qa.run(user_query) | |
st.write("**Chatbot Response:**", response) | |
# Voice Recognition for Non-English Users | |
st.subheader("ποΈ Voice Recognition (Speech-to-Text)") | |
if st.button("Start Recording"): | |
recognizer = sr.Recognizer() | |
with sr.Microphone() as source: | |
st.write("Listening...") | |
audio = recognizer.listen(source) | |
try: | |
recognized_text = recognizer.recognize_google(audio) | |
st.write("**Recognized Text:**", recognized_text) | |
except sr.UnknownValueError: | |
st.write("Sorry, could not understand.") | |
except sr.RequestError: | |
st.write("Could not request results. Check your internet connection.") | |
# Disaster Guide Dropdown | |
st.subheader("πͺοΈ Disaster Preparedness Guide") | |
disaster_options = { | |
"Wildfire": { | |
"steps": [ | |
"Evacuate if ordered.", | |
"Keep emergency supplies ready.", | |
"Close all doors and windows." | |
], | |
"video": "https://www.youtube.com/watch?v=OCjl6tp8dnw" | |
}, | |
"Earthquake": { | |
"steps": [ | |
"Drop, Cover, and Hold On.", | |
"Stay indoors until shaking stops.", | |
"Move away from windows." | |
], | |
"video": "https://www.youtube.com/watch?v=BLEPakj1YTY" | |
}, | |
"Flood": { | |
"steps": [ | |
"Move to higher ground.", | |
"Avoid walking or driving through floodwaters.", | |
"Stay tuned to emergency alerts." | |
], | |
"video": "https://www.youtube.com/watch?v=43M5mZuzHF8" | |
} | |
} | |
selected_disaster = st.selectbox("Select a disaster type:", list(disaster_options.keys())) | |
if selected_disaster: | |
st.write("### π Steps to Follow:") | |
for step in disaster_options[selected_disaster]["steps"]: | |
st.write(f"- {step}") | |
st.write("πΊ [Watch Video Guide]({})".format(disaster_options[selected_disaster]["video"])) | |
st.write("π Stay prepared and stay safe!") | |