from fastapi import FastAPI from fastapi.responses import RedirectResponse import fitz # PyMuPDF import docx import pptx import openpyxl import io from PIL import Image import gradio as gr from transformers import pipeline # Load models summarizer = pipeline("summarization", model="sshleifer/distilbart-cnn-12-6") image_captioner = pipeline("image-to-text", model="nlpconnect/vit-gpt2-image-captioning") app = FastAPI() # ------------------------- # File Text Extractors # ------------------------- def extract_text_from_pdf(file): try: file.seek(0) data = file.read() with fitz.open(stream=data, filetype="pdf") as doc: return "\n".join([page.get_text() for page in doc]) except Exception as e: return f"❌ PDF error: {e}" def extract_text_from_docx(file): try: file.seek(0) data = file.read() doc = docx.Document(io.BytesIO(data)) return "\n".join(p.text for p in doc.paragraphs if p.text.strip()) except Exception as e: return f"❌ DOCX error: {e}" def extract_text_from_pptx(file): try: file.seek(0) data = file.read() prs = pptx.Presentation(io.BytesIO(data)) text = [] for slide in prs.slides: for shape in slide.shapes: if hasattr(shape, "text"): text.append(shape.text) return "\n".join(text) except Exception as e: return f"❌ PPTX error: {e}" def extract_text_from_xlsx(file): try: file.seek(0) data = file.read() wb = openpyxl.load_workbook(io.BytesIO(data)) text = [] for sheet in wb.sheetnames: ws = wb[sheet] for row in ws.iter_rows(values_only=True): line = " ".join(str(cell) for cell in row if cell) text.append(line) return "\n".join(text) except Exception as e: return f"❌ XLSX error: {e}" # ------------------------- # Main Logic # ------------------------- def summarize_document(file): filename = file.name.lower() if filename.endswith(".pdf"): text = extract_text_from_pdf(file) elif filename.endswith(".docx"): text = extract_text_from_docx(file) elif filename.endswith(".pptx"): text = extract_text_from_pptx(file) elif filename.endswith(".xlsx"): text = extract_text_from_xlsx(file) else: return "❌ Unsupported file format." if not text.strip(): return "❗ No extractable text." try: summary = summarizer(text[:3000], max_length=150, min_length=30, do_sample=False) return f"📄 Summary:\n{summary[0]['summary_text']}" except Exception as e: return f"⚠️ Summarization error: {e}" def interpret_image(image): try: return f"🖼️ Caption:\n{image_captioner(image)[0]['generated_text']}" except Exception as e: return f"⚠️ Image captioning error: {e}" # ------------------------- # Gradio Interfaces # ------------------------- doc_summary = gr.Interface( fn=summarize_document, inputs=gr.File(label="Upload a Document"), outputs="text", title="📄 Document Summarizer" ) img_caption = gr.Interface( fn=interpret_image, inputs=gr.Image(type="pil", label="Upload an Image"), outputs="text", title="🖼️ Image Captioning" ) # ------------------------- # Launch via FastAPI # ------------------------- demo = gr.TabbedInterface([doc_summary, img_caption], ["Document Summary", "Image Captioning"]) app = gr.mount_gradio_app(app, demo, path="/") @app.get("/") def root(): return RedirectResponse(url="/")