SuryaOCR
# Intégration de VNTranslator OCR avec le moteur SuryaOCR
# Version : 1.0
# Auteur : Fazx - GarudaMods | https://www.patreon.com/vntranslator
"""
# ==================================================================
# Surya OCR : https://github.com/VikParuchuri/surya
# Requis : python 3.10+ et PyTorch
# Installer avec : pip install surya-ocr
# ==================================================================
# Exécutez ce script avec : python vntocr_suryaocr.py
# Dans VNTranslator utilisez le moteur personnalisé - HTTP POST avec la configuration :
# -- URL : http://127.0.0.1:5353
# -- Type de contenu : application/json
# -- En-têtes : {}
# -- Corps : {"image":"$IMAGE_BASE64", "langs": ["ja"]}
# -- Type de réponse : JSON
# -- Requête de réponse : fullText
# ==================================================================
# Langues (codes ISO à deux lettres) https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes
# -- Japonais = ja
# -- Anglais = en
# ==================================================================
"""
from flask import Flask, request, jsonify
from PIL import Image
from io import BytesIO
import base64
import re
import json
from surya.ocr import run_ocr
from surya.model.detection.model import load_model as load_det_model, load_processor as load_det_processor
from surya.model.recognition.model import load_model as load_rec_model
from surya.model.recognition.processor import load_processor as load_rec_processor
APP_HOST = "localhost"
APP_PORT = 5353
APP_DEBUG = True
def format_ocr_result(ocr_result):
full_text = ""
boxes = []
for result in ocr_result:
for box in result["text_boxes"]:
bbox = box["bbox"]
x, y = bbox[0], bbox[1]
w, h = bbox[2] - bbox[0], bbox[3] - bbox[1]
boxes.append({
"text": box["text"],
"w": w,
"h": h,
"x": x,
"y": y
})
boxes.sort(key=lambda box: (box["y"], box["x"]))
full_text = " ".join(box["text"] for box in boxes).strip()
return {
"fullText": full_text,
"boxes": boxes
}
def parse_ocr_result(ocr_result):
if not isinstance(ocr_result, list):
raise ValueError("ocr_result is not a list")
parsed_results = []
for result in ocr_result:
text_lines = []
for line in result.text_lines:
text_lines.append({
"polygon": line.polygon,
"confidence": line.confidence,
"text": line.text,
"bbox": line.bbox
})
parsed_results.append({
"text_boxes": text_lines,
"languages": result.languages,
"image_bbox": result.image_bbox
})
return format_ocr_result(parsed_results)
############################################################
app = Flask(__name__)
det_processor = load_det_processor()
det_model = load_det_model()
rec_model = load_rec_model()
rec_processor = load_rec_processor()
@app.route("/", methods=["POST"])
def ocr_endpoint():
try:
print("\n\n=== Requête OCR ===")
print(f"Méthode : {request.method}")
print(f"En-têtes : {dict(request.headers)}")
if not request.is_json:
print("La requête n'est pas au format JSON")
return jsonify({"error": "La requête doit être au format JSON"}), 400
data = request.get_json()
# journaliser la charge utile
print(f"Clés JSON de la requête : {list(data.keys())}")
# vérifier l'image
if "image" not in data:
print("Aucune donnée d'image")
return jsonify({"error": "Aucune donnée d'image"}), 400
# décoder l'image base64
try:
image_decode = base64.b64decode(data["image"])
image = Image.open(BytesIO(image_decode))
print("Image décodée avec succès depuis Base64")
except Exception as e:
print(f"Échec du décodage de l'image : {e}")
return jsonify({"error": f"Échec du décodage de l'image : {str(e)}"}), 400
# vérifier les langues
langs = data.get("langs", ["ja"])
print(f"langs : {langs}")
# vérifier le dessin des boîtes englobantes
draw_bounding_box = data.get("draw_bounding_box", False)
print(f"draw_bounding_box : {draw_bounding_box}")
# exécuter l'OCR
# https://github.com/VikParuchuri/surya?tab=readme-ov-file#from-python
result = run_ocr([image], [langs], det_model, det_processor, rec_model, rec_processor)
print(f"OCR terminé avec succès : {result}")
"""
[OCRResult(
text_lines=[
TextLine(polygon=[[0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0]], confidence=0.0, text='String', bbox=[0.0, 0.0, 0.0, 0.0]),
TextLine(polygon=[[0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0]], confidence=0.0, text='String', bbox=[0.0, 0.0, 0.0, 0.0]),
TextLine(polygon=[[0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0]], confidence=0.0, text='String', bbox=[0.0, 0.0, 0.0, 0.0])
],
languages=['ja'], image_bbox=[0.0, 0.0, 0.0, 0.0]
)]
"""
# analyser le résultat
parsed_result = parse_ocr_result(result)
parsed_result['draw_bounding_box'] = draw_bounding_box
json_result = json.dumps(parsed_result, indent=4, ensure_ascii=False)
return json_result
except Exception as e:
print(f"Erreur de la requête : {e}")
return jsonify({"error": str(e)}), 500
if __name__ == "__main__":
print(f"=== Démarrage du serveur OCR {APP_HOST} sur le port {APP_PORT} ===")
app.run(debug=APP_DEBUG, host=APP_HOST, port=APP_PORT)