File size: 4,563 Bytes
903d539
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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()