from flask import Flask, render_template, request, jsonify from transformers import PegasusTokenizer, PegasusForConditionalGeneration import torch import re app = Flask(__name__) device = "cuda" if torch.cuda.is_available() else "cpu" MODEL_PATH = "TheMarvellousOne/pegasus-meeting-summarizer" tokenizer = None model = None def load_model(): global tokenizer, model if model is None: print("Loading model...") tokenizer = PegasusTokenizer.from_pretrained("google/pegasus-xsum") model = PegasusForConditionalGeneration.from_pretrained( MODEL_PATH, subfolder="pegasus_mixed_finetuned" ).to(device) model.eval() print("Model loaded.") def clean_transcript(text): """Remove extra whitespace from transcript""" text = str(text) text = re.sub(r"\s+", " ", text) return text.strip() def summarize_pegasus(text, tokenizer, model, device="cuda"): text = clean_transcript(text) inputs = tokenizer( text, return_tensors="pt", max_length=512, truncation=True ).to(device) generate_kwargs = { "max_length": 256, "min_length": 50, "num_beams": 8, "length_penalty": 1.5, "repetition_penalty": 1.5, "no_repeat_ngram_size": 3, "early_stopping": True, "do_sample": True, "temperature": 0.7, "top_p": 0.9, } with torch.no_grad(): summary_ids = model.generate( **inputs, **generate_kwargs ) return tokenizer.decode(summary_ids[0], skip_special_tokens=True) @app.route("/") def home(): load_model() return render_template("index.html") @app.route("/summarize", methods=["POST"]) def summarize(): load_model() transcript = request.json["text"] summary = summarize_pegasus( transcript, tokenizer, model, device ) return jsonify({ "summary": summary }) if __name__ == "__main__": app.run(host="0.0.0.0", port=7860)