File size: 1,266 Bytes
00a5799
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Image OCR + translation helper."""
from __future__ import annotations

import logging
from typing import Tuple

import numpy as np
from PIL import Image

from src.translator import translate

logger = logging.getLogger(__name__)

# Lazy EasyOCR loader
_ocr_reader = None


def _get_reader():
    global _ocr_reader
    if _ocr_reader is None:
        import easyocr
        logger.info("Initializing EasyOCR (ja, en)...")
        # Use CPU to avoid competing for GPU memory with the translation model.
        _ocr_reader = easyocr.Reader(["ja", "en"], gpu=False)
    return _ocr_reader


def ocr_image(image: Image.Image) -> Tuple[str, str]:
    """Run OCR on a PIL image and translate the result.

    Returns (detected_text, english_translation).
    """
    if image is None:
        return "", ""

    try:
        arr = np.array(image.convert("RGB"))
        reader = _get_reader()
        results = reader.readtext(arr)
        lines = [r[1] for r in results]
        detected = "\n".join(lines).strip()
        if not detected:
            return "(no text detected)", ""
        translated, _ = translate(detected)
        return detected, translated
    except Exception as e:
        logger.exception("OCR failed")
        return f"OCR error: {e}", ""