"""Exercise installed local OCR on synthetic Chinese text; no screen capture/network.""" import argparse import json import socket import sys import time from pathlib import Path from unittest import mock import numpy as np from PIL import Image, ImageDraw, ImageFont parser = argparse.ArgumentParser() parser.add_argument('project') parser.add_argument('output') args = parser.parse_args() sys.path.insert(0, str(Path(args.project).resolve())) sys.dont_write_bytecode = True from session_name import NameReader, normalize_name started = time.monotonic() cases = [] with mock.patch.object(socket.socket, 'connect', side_effect=RuntimeError('network blocked')): reader = NameReader() available = reader.available if available: for scale in (1, 2, 3): for theme in ('light', 'dark'): foreground, background = ((30, 245) if theme == 'light' else (240, 30)) font = ImageFont.truetype('C:/Windows/Fonts/msyh.ttc', 16 * scale) for text in ('客户甲@微信', '客户乙@微信', '高瑞@微信', '门店客服甲'): image = Image.new('RGB', (250*scale, 42*scale), (background,)*3) ImageDraw.Draw(image).text((10*scale, 8*scale), text, font=font, fill=(foreground,)*3) value, confidence = reader.read_raw(np.asarray(image)) cases.append({'scale': scale, 'theme': theme, 'expected': text, 'actual': value, 'confidence': confidence, 'exact': normalize_name(value) == normalize_name(text)}) report = {'project': str(Path(args.project).resolve()), 'engine_available': available, 'cases': cases, 'total': len(cases), 'exact_matches': sum(case['exact'] for case in cases), 'seconds': round(time.monotonic()-started, 3), 'scope': 'Real installed RapidOCR; synthetic Microsoft YaHei images; no screenshots/customer data/remote model.'} Path(args.output).write_text(json.dumps(report, ensure_ascii=False, indent=2), encoding='utf-8') print(json.dumps(report, ensure_ascii=False))