| import gradio as gr |
| import base64 |
| import io |
| from PIL import Image |
| import numpy as np |
| from zhipuai import ZhipuAI |
| import os |
|
|
| |
| API_KEY = os.getenv("ZHIPUAI_API_KEY", "d659608f7d5d42b1821a9303fc50b618.NesCuIytwpxjxpBJ") |
| client = ZhipuAI(api_key=API_KEY) |
|
|
| def extract_text(image): |
| if isinstance(image, np.ndarray): |
| image = Image.fromarray(image) |
|
|
|
|
| |
| buffered = io.BytesIO() |
| image.save(buffered, format="PNG") |
| image_base64 = base64.b64encode(buffered.getvalue()).decode("utf-8") |
|
|
| |
| response = client.chat.completions.create( |
| model="glm-4v-plus", |
| messages=[ |
| { |
| "role": "user", |
| "content": [ |
| {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{image_base64}"}}, |
| {"type": "text", "text": "Hãy trích xuất toàn bộ chữ viết tay trong ảnh, giữ nguyên dấu câu, giữ dấu của từng chữ, khoảng cách dòng, và chính tả như trong ảnh."} |
| ] |
| } |
| ] |
| ) |
|
|
| |
| if response and response.choices: |
| text = response.choices[0].message.content |
| output_text_file = "output.md" |
| with open(output_text_file, "w", encoding="utf-8") as f: |
| f.write(text) |
|
|
| output_image_file = "output_image.png" |
| image.save(output_image_file, format="PNG") |
| return text, output_text_file, output_image_file |
| else: |
| error_msg = f"Lỗi: {str(response)}" if response else "Lỗi: Không kết nối được API." |
| return error_msg, None, None |
|
|
| demo = gr.Interface( |
| fn=extract_text, |
| inputs="image", |
| outputs=[ |
| "text", |
| gr.File(label="Tải xuống file văn bản (output.md)"), |
| ], |
| title="Vietnamese Handwriting OCR", |
| description="Upload an image to extract handwritten text using ZhipuAI's GLM-4V model." |
| ) |
|
|
| if __name__ == "__main__": |
| demo.launch() |