File size: 3,180 Bytes
3e87c53
 
cf9a79a
 
3e87c53
 
 
 
 
 
e5b6ad2
3e87c53
e5b6ad2
 
 
1e83db4
a74f8b0
3e87c53
 
 
 
 
 
 
 
 
cf9a79a
 
3e87c53
 
cf9a79a
 
3e87c53
 
 
 
 
 
 
cf9a79a
 
3e87c53
 
 
 
 
 
 
 
 
 
 
 
 
cf9a79a
 
 
 
 
 
 
3e87c53
e5b6ad2
cf9a79a
3e87c53
e5b6ad2
3e87c53
 
 
 
 
 
 
e5b6ad2
3e87c53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e5b6ad2
3e87c53
 
 
 
 
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
from fastapi import FastAPI, UploadFile, File
import fitz  # PyMuPDF
import docx
import openpyxl
import pptx
from PIL import Image
import io

import gradio as gr
from transformers import pipeline

# Models
summarizer = pipeline("summarization", model="sshleifer/distilbart-cnn-12-6")
image_captioner = pipeline("image-to-text", model="nlpconnect/vit-gpt2-image-captioning")

app = FastAPI()

# -------------------------
# Document Extraction Utils
# -------------------------
def extract_text_from_pdf(file):
    text = ""
    with fitz.open(stream=file.read(), filetype="pdf") as doc:
        for page in doc:
            text += page.get_text()
    return text

def extract_text_from_docx(file):
    doc = docx.Document(io.BytesIO(file.read()))
    return "\n".join([para.text for para in doc.paragraphs if para.text.strip()])

def extract_text_from_pptx(file):
    text = []
    prs = pptx.Presentation(io.BytesIO(file.read()))
    for slide in prs.slides:
        for shape in slide.shapes:
            if hasattr(shape, "text"):
                text.append(shape.text)
    return "\n".join(text)

def extract_text_from_xlsx(file):
    wb = openpyxl.load_workbook(io.BytesIO(file.read()))
    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)

def summarize_document(file: UploadFile):
    ext = file.filename.split(".")[-1].lower()
    if ext == "pdf":
        text = extract_text_from_pdf(file)
    elif ext == "docx":
        text = extract_text_from_docx(file)
    elif ext == "pptx":
        text = extract_text_from_pptx(file)
    elif ext == "xlsx":
        text = extract_text_from_xlsx(file)
    else:
        return "Unsupported file format."

    if not text.strip():
        return "No extractable text."

    # Trim large docs
    text = text[:3000]
    try:
        summary = summarizer(text, max_length=150, min_length=30, do_sample=False)
        return summary[0]["summary_text"]
    except Exception as e:
        return f"Summarization error: {e}"

def interpret_image(image):
    if image is None:
        return "No image uploaded."
    try:
        return image_captioner(image)[0]["generated_text"]
    except Exception as e:
        return f"Image captioning error: {e}"

# -------------------------
# Gradio UI
# -------------------------
def run_interface():
    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 Interpreter"
    )

    gr.TabbedInterface([doc_summary, img_caption], ["Summarize Document", "Caption Image"]).launch()

# -------------------------
# Run from CLI or FastAPI
# -------------------------
@app.get("/")
def read_root():
    return {"message": "Gradio running at /docs or use CLI"}

if __name__ == "__main__":
    run_interface()