Spaces:
Sleeping
Sleeping
| """ | |
| ocr.py — OCR helper for Teacher AI v3. | |
| Uses PaddleOCR (already in requirements.txt) to extract text from images. | |
| """ | |
| import logging | |
| from pathlib import Path | |
| logger = logging.getLogger(__name__) | |
| # Lazy-load so startup is fast; PaddleOCR downloads models on first use. | |
| _ocr_engine = None | |
| def _get_engine(): | |
| global _ocr_engine | |
| if _ocr_engine is None: | |
| try: | |
| from paddleocr import PaddleOCR | |
| # use_angle_cls=True handles rotated text; lang="en" for English. | |
| # Set show_log=False to silence PaddlePaddle verbose output. | |
| _ocr_engine = PaddleOCR(use_angle_cls=True, lang="en", show_log=False) | |
| logger.info("PaddleOCR engine initialised.") | |
| except ImportError as exc: | |
| raise RuntimeError( | |
| "paddleocr is not installed. Add 'paddleocr' to requirements.txt." | |
| ) from exc | |
| return _ocr_engine | |
| def extract_text(image_path: str) -> str: | |
| """ | |
| Extract text from *image_path* and return it as a single string. | |
| Raises | |
| ------ | |
| FileNotFoundError | |
| If *image_path* does not exist. | |
| ValueError | |
| If PaddleOCR returns no results at all. | |
| """ | |
| path = Path(image_path) | |
| if not path.exists(): | |
| raise FileNotFoundError(f"Image not found: {image_path}") | |
| engine = _get_engine() | |
| result = engine.ocr(str(path), cls=True) | |
| if not result or result == [None]: | |
| raise ValueError("OCR returned no results for the provided image.") | |
| lines = [] | |
| for page in result: | |
| if page is None: | |
| continue | |
| for item in page: | |
| # item = [[box], [text, confidence]] | |
| try: | |
| text, confidence = item[1] | |
| if confidence >= 0.5: # discard low-confidence fragments | |
| lines.append(text.strip()) | |
| except (IndexError, TypeError): | |
| continue | |
| return "\n".join(lines) | |