|
import time |
|
import requests |
|
import gradio as gr |
|
|
|
def read_image_from_stream(image_path, subscription_key, endpoint): |
|
with open(image_path, 'rb') as image_file: |
|
image_data = image_file.read() |
|
|
|
headers = { |
|
'Ocp-Apim-Subscription-Key': subscription_key, |
|
'Content-Type': 'application/octet-stream' |
|
} |
|
|
|
response = requests.post(f"{endpoint}/vision/v3.2/read/analyze", headers=headers, data=image_data) |
|
|
|
if response.status_code == 202: |
|
read_response_headers = response.headers |
|
operation_location = read_response_headers["Operation-Location"] |
|
else: |
|
raise Exception(f"Unexpected response status: {response.status_code}") |
|
|
|
return operation_location |
|
|
|
def get_read_result(operation_location, subscription_key): |
|
headers = { |
|
'Ocp-Apim-Subscription-Key': subscription_key |
|
} |
|
|
|
while True: |
|
response = requests.get(operation_location, headers=headers) |
|
if response.status_code == 200: |
|
read_result = response.json() |
|
status = read_result['status'] |
|
if status == 'succeeded': |
|
break |
|
elif status in ['failed', 'notStarted', 'running']: |
|
time.sleep(1) |
|
else: |
|
raise Exception(f"Unexpected status: {status}") |
|
else: |
|
raise Exception(f"Unexpected response status: {response.status_code}") |
|
|
|
return read_result |
|
|
|
def process_image(image_path, subscription_key, endpoint): |
|
operation_location = read_image_from_stream(image_path, subscription_key, endpoint) |
|
operation_id = operation_location.split("/")[-1] |
|
operation_location = f"{endpoint}/vision/v3.2/read/analyzeResults/{operation_id}" |
|
|
|
read_result = get_read_result(operation_location, subscription_key) |
|
|
|
if read_result['status'] == 'succeeded': |
|
output = [] |
|
for text_result in read_result['analyzeResult']['readResults']: |
|
for line in text_result['lines']: |
|
output.append(line['text']) |
|
return " ".join(output).replace("\n", " ") |
|
else: |
|
return "Processing failed or did not succeed." |
|
|
|
def main(): |
|
interface = gr.Interface( |
|
fn=process_image, |
|
inputs=[ |
|
gr.Image(type="filepath", label="Upload Image"), |
|
gr.Textbox(label="Subscription Key"), |
|
gr.Textbox(label="Endpoint URL") |
|
], |
|
outputs=gr.Textbox(), |
|
title="Azure OCR with Gradio", |
|
description="Upload an image, provide your Azure subscription key and endpoint URL to perform OCR and get the text." |
|
) |
|
interface.launch() |
|
|
|
if __name__ == "__main__": |
|
main() |
|
|