File size: 2,672 Bytes
6baad66
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import torch
from transformers import BertTokenizerFast, BertForQuestionAnswering, pipeline
import torch.nn.functional as F
import speech_recognition as sr

# Load QA Model
tokenizer = BertTokenizerFast.from_pretrained("bert-base-uncased")
model = BertForQuestionAnswering.from_pretrained("bert-base-uncased")
model.load_state_dict(torch.load("lexpilot_trained_model.pt", map_location=torch.device("cpu")))
model.eval()

# Load Summarizer
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")

def answer_with_confidence(question, context):
    inputs = tokenizer.encode_plus(question, context, return_tensors="pt")
    with torch.no_grad():
        outputs = model(**inputs)
        start_logits = outputs.start_logits
        end_logits = outputs.end_logits
        start_probs = F.softmax(start_logits, dim=1)
        end_probs = F.softmax(end_logits, dim=1)
        start = torch.argmax(start_probs)
        end = torch.argmax(end_probs) + 1
        confidence = (start_probs[0][start] * end_probs[0][end - 1]).item()
        tokens = inputs["input_ids"][0][start:end]
        answer = tokenizer.decode(tokens)
    return answer.strip(), round(confidence, 2)

def summarize_text(text):
    summary = summarizer(text, max_length=100, min_length=30, do_sample=False)
    return summary[0]["summary_text"]

def voice_to_text(audio):
    recognizer = sr.Recognizer()
    with sr.AudioFile(audio) as source:
        audio_data = recognizer.record(source)
    try:
        return recognizer.recognize_google(audio_data)
    except Exception as e:
        return f"Error: {str(e)}"

def qa_interface(context, question):
    answer, confidence = answer_with_confidence(question, context)
    summary = summarize_text(context)
    return answer, confidence, summary

with gr.Blocks() as app:
    gr.Markdown("## πŸ€– LexPilot: QA + Summarization + Voice Input")

    with gr.Row():
        context_input = gr.Textbox(lines=6, label="πŸ“˜ Context")
        question_input = gr.Textbox(lines=1, label="❓ Question")

    with gr.Row():
        answer_output = gr.Textbox(label="🧠 Answer")
        confidence_output = gr.Number(label="πŸ“Š Confidence")
        summary_output = gr.Textbox(label="πŸ“ Summary")

    with gr.Row():
        submit_btn = gr.Button("πŸ” Get Answer & Summary")
        audio_input = gr.Audio(type="filepath", label="πŸŽ™οΈ Upload Voice Question")

    submit_btn.click(fn=qa_interface, inputs=[context_input, question_input],
                     outputs=[answer_output, confidence_output, summary_output])

    audio_input.change(fn=voice_to_text, inputs=audio_input, outputs=question_input)

app.launch()