import gradio as gr
import numpy as np
import urllib.parse
import traceback
from ocr_engine import ocr_items, ocr_text
from keyword_engine import build_focus_text, extract_keywords_from_focus
def build_link(keywords, full_text):
if keywords:
query = " ".join(keywords)
shown = keywords
else:
query = (full_text or "")[:120]
shown = ["(dùng văn bản gốc)"]
url = "https://www.google.com/search?q=" + urllib.parse.quote(query)
html = f"""
"""
return html, ", ".join(shown)
def process(image):
if image is None:
return "Chưa có ảnh đầu vào.", "", ""
try:
if not isinstance(image, np.ndarray):
return "Định dạng ảnh không hợp lệ.", "", ""
full_text = ocr_text(image)
if not full_text:
return "Không trích xuất được nội dung.", "", ""
items = ocr_items(image)
focus_text = build_focus_text(items, img_h=image.shape[0], top_ratio=0.35, max_lines=30)
if not focus_text:
focus_text = full_text
keywords = extract_keywords_from_focus(focus_text, top_n=5)
html_link, keywords_str = build_link(keywords, full_text)
return full_text, keywords_str, html_link
except Exception as e:
return f"Lỗi hệ thống:\n{e}\n{traceback.format_exc()}", "", ""
with gr.Blocks(title="OCR & Tra cứu thông minh") as app:
gr.Markdown("# OCR – PaddleOCR + KeyBERT")
with gr.Row():
with gr.Column(scale=1):
input_image = gr.Image(label="Tải ảnh", type="numpy")
btn_submit = gr.Button("Bắt đầu trích xuất", variant="primary")
with gr.Column(scale=1):
output_link = gr.HTML(label="Link tra cứu")
output_text = gr.Textbox(label="Văn bản OCR", lines=10)
output_keywords = gr.Textbox(label="Từ khóa", lines=5)
btn_submit.click(
fn=process,
inputs=input_image,
outputs=[output_text, output_keywords, output_link],
)
if __name__ == "__main__":
app.launch()