Spaces:
Running
Running
import streamlit as st | |
import wikipediaapi | |
import datetime | |
from reportlab.lib.pagesizes import letter | |
from reportlab.pdfgen import canvas | |
import tempfile | |
from gtts import gTTS | |
import speech_recognition as sr | |
def get_wikipedia_summary(query, lang_code, char_limit, summary_level): | |
user_agent = "Mozilla/5.0" | |
wiki = wikipediaapi.Wikipedia(language=lang_code, extract_format=wikipediaapi.ExtractFormat.WIKI, user_agent=user_agent) | |
page = wiki.page(query) | |
if not page.exists(): | |
return "Page not found." | |
if summary_level == "Brief": | |
return page.summary[:char_limit] | |
elif summary_level == "Detailed": | |
return page.summary | |
elif summary_level == "Bullet Points": | |
points = page.summary.split('. ') | |
return '\n'.join(f"- {p.strip()}" for p in points if p)[:char_limit] | |
def save_chat_history_as_pdf(chat_history, file_name): | |
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") | |
with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_file: | |
pdf = canvas.Canvas(tmp_file.name, pagesize=letter) | |
pdf.setTitle(file_name) | |
pdf.drawString(30, 750, f"{file_name} - Saved on {timestamp}") | |
y_position = 720 | |
for query, response in chat_history: | |
pdf.drawString(30, y_position, f"User: {query}") | |
y_position -= 20 | |
pdf.drawString(30, y_position, f"Bot: {response}") | |
y_position -= 40 | |
if y_position < 40: | |
pdf.showPage() | |
y_position = 750 | |
pdf.save() | |
return tmp_file.name | |
def text_to_speech(text, filename, lang="en"): | |
tts = gTTS(text=text, lang=lang) | |
tts.save(filename) | |
return filename | |
def voice_search(lang_code): | |
recognizer = sr.Recognizer() | |
with sr.Microphone() as source: | |
st.write("Listening...") | |
audio = recognizer.listen(source) | |
try: | |
query = recognizer.recognize_google(audio, language=lang_code) | |
st.success(f"You said: {query}") | |
return query | |
except sr.UnknownValueError: | |
st.error("Could not understand the audio.") | |
return None | |
except sr.RequestError as e: | |
st.error(f"Could not request results; {e}") | |
return None | |
def main(): | |
st.title("Wikipedia Summary & Text-to-Speech") | |
lang_map = { | |
"English": "en", | |
"Spanish": "es", | |
"Chinese": "zh", | |
"Hindi": "hi", | |
"Telugu": "te" | |
} | |
selected_lang = st.sidebar.selectbox("Wikipedia Language", list(lang_map.keys()), key="language_selector") | |
summary_levels = ["Brief", "Detailed", "Bullet Points"] | |
summary_level = st.sidebar.selectbox("Summarization Level", summary_levels) | |
char_limit = st.sidebar.slider("Character Limit", min_value=100, max_value=2000, value=500, step=100) | |
if "chat_history" not in st.session_state: | |
st.session_state.chat_history = [] | |
if "favorites" not in st.session_state: | |
st.session_state.favorites = [] | |
query = st.text_input("Enter a topic to search on Wikipedia:") | |
if st.button("Voice Search"): | |
lang_code = lang_map[selected_lang] | |
voice_query = voice_search(lang_code) | |
if voice_query: | |
query = voice_query | |
if query: | |
lang_code = lang_map[selected_lang] | |
summary = get_wikipedia_summary(query, lang_code, char_limit, summary_level) | |
st.markdown(f"### Summary for: {query}") | |
st.write(summary) | |
st.session_state.chat_history.append((query, summary)) | |
if st.button("Add to Favorites"): | |
st.session_state.favorites.append((query, summary)) | |
st.success("Added to favorites!") | |
tts_filename = f"{query}_speech.mp3" | |
if st.button("Play Text-to-Speech"): | |
text_to_speech(summary, tts_filename, lang=lang_code) | |
st.audio(tts_filename, format="audio/mp3") | |
file_name = st.sidebar.text_input("File Name to Save Chat", value="chat_history") | |
if st.sidebar.button("Save Chat as PDF"): | |
pdf_path = save_chat_history_as_pdf(st.session_state.chat_history, file_name) | |
with open(pdf_path, "rb") as pdf_file: | |
st.sidebar.download_button("Download PDF", pdf_file, file_name=f"{file_name}.pdf", mime="application/pdf") | |
st.sidebar.write("### Favorites") | |
for i, (fav_query, fav_summary) in enumerate(st.session_state.favorites, 1): | |
st.sidebar.write(f"**{i}. {fav_query}**") | |
st.sidebar.write(fav_summary[:100] + "...") | |
if __name__ == "__main__": | |
main() | |