import streamlit as st from transformers import pipeline, AutoModelForSeq2SeqLM, AutoTokenizer from TTS.api import TTS from tempfile import NamedTemporaryFile import os # Initialize models @st.cache_resource def load_models(): summarizer_model = AutoModelForSeq2SeqLM.from_pretrained("google/flan-t5-base") summarizer_tokenizer = AutoTokenizer.from_pretrained("google/flan-t5-base") question_generator = pipeline("text2text-generation", model="valhalla/t5-small-qg-hl") qa_model = pipeline("question-answering", model="deepset/roberta-base-squad2") tts = TTS(model_name="tts_models/en/ljspeech/tacotron2-DDC", progress_bar=False, gpu=False) return summarizer_model, summarizer_tokenizer, question_generator, qa_model, tts summarizer_model, summarizer_tokenizer, question_generator, qa_model, tts = load_models() def summarize_document(text): input_ids = summarizer_tokenizer.encode(text, return_tensors="pt", max_length=512, truncation=True) summary_ids = summarizer_model.generate(input_ids, max_length=150, min_length=30, length_penalty=2.0, num_beams=4, early_stopping=True) return summarizer_tokenizer.decode(summary_ids[0], skip_special_tokens=True) def generate_questions(summary): questions = question_generator(summary) return [q["generated_text"] for q in questions] def generate_audio(text, voice_gender): voice = "ljspeech" # Use default LJSpeech voice for both genders audio_file = NamedTemporaryFile(delete=False, suffix=".wav") tts.tts_to_file(text=text, file_path=audio_file.name) return audio_file.name def app(): st.title("Interactive Document Summarizer") uploaded_file = st.file_uploader("Upload a document", type=["txt", "pdf", "docx"]) if uploaded_file: raw_text = uploaded_file.read().decode("utf-8") st.write("Processing document...") # Summarize summary = summarize_document(raw_text) st.write("Summary Generated:") st.write(summary) # Generate dialogue questions = generate_questions(summary) dialogue = [] for idx, question in enumerate(questions): dialogue.append({"persona": "male" if idx % 2 == 0 else "female", "text": question}) # Interactive simulation st.write("Simulating Conversation:") for item in dialogue: st.write(f"{item['persona'].capitalize()} says: {item['text']}") audio_path = generate_audio(item["text"], item["persona"]) st.audio(audio_path, format="audio/wav") if __name__ == "__main__": app()