# 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 base_url = "https://api.aimlapi.com/v1" api_key="0f33d8a8b7714460bc4b8335b66d217a" # 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!")