BeaconAI / app.py
hbhamzabaig's picture
Update app.py
6612dd0 verified
raw
history blame
4.86 kB
# 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 Disaster Safety Manual.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!")