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 | |
| 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 = "/home/user/app/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!") | |