From acfe55bb348a4fb2c9c98bbc96377bb032ed685b Mon Sep 17 00:00:00 2001 From: AuroraWright Date: Sat, 3 Feb 2024 12:26:09 +0100 Subject: [PATCH] Improve screen reading filtering --- owocr/ocr.py | 4 ++-- owocr/run.py | 21 +++++++++++---------- requirements.txt | 1 + setup.py | 1 + 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/owocr/ocr.py b/owocr/ocr.py index 6c5cd2f..4e9b03d 100644 --- a/owocr/ocr.py +++ b/owocr/ocr.py @@ -186,6 +186,7 @@ class GoogleLens: elif 'requests' not in sys.modules: logger.warning('requests not available, Google Lens will not work!') else: + self.regex = re.compile(r">AF_initDataCallback\(({key: 'ds:1'.*?)\);") self.available = True logger.info('Google Lens ready') @@ -210,8 +211,7 @@ class GoogleLens: if res.status_code != 200: return (False, 'Unknown error!') - regex = re.compile(r">AF_initDataCallback\(({key: 'ds:1'.*?)\);") - match = regex.search(res.text) + match = self.regex.search(res.text) if match == None: return (False, 'Regex error!') diff --git a/owocr/run.py b/owocr/run.py index a02ba67..8ee24ee 100644 --- a/owocr/run.py +++ b/owocr/run.py @@ -13,13 +13,13 @@ import asyncio import websockets import queue import io -import re from PIL import Image from PIL import UnidentifiedImageError from loguru import logger from pynput import keyboard from notifypy import Notify +from pysbd import Segmenter import inspect from owocr.ocr import * @@ -253,16 +253,17 @@ def are_images_identical(img1, img2): return (img1.shape == img2.shape) and (img1 == img2).all() -def process_and_write_results(engine_instance, img_or_path, write_to, last_text): +def process_and_write_results(engine_instance, img_or_path, write_to, last_text, segmenter): t0 = time.time() res, text = engine_instance(img_or_path) t1 = time.time() + orig_text = '' engine_color = config.get_general('engine_color') if res: - orig_text = text if last_text != '': - text = ''.join(map(str, [block for block in re.split(r'[  ,!?.、。?!"「」\n\']', text) if block not in re.split(r'[  ,!?.、。?!"「」\n\']', last_text)])) + orig_text = segmenter.segment(text) + text = '\n'.join([block for block in orig_text if block not in last_text]) text = post_process(text) logger.opt(ansi=True).info(f'Text recognized in {t1 - t0:0.03f}s using <{engine_color}>{engine_instance.readable_name}: {text}') if config.get_general('notifications'): @@ -272,7 +273,6 @@ def process_and_write_results(engine_instance, img_or_path, write_to, last_text) notification.message = text notification.send(block=False) else: - orig_text = '' logger.opt(ansi=True).info(f'<{engine_color}>{engine_instance.readable_name} reported an error after {t1 - t0:0.03f}s: {text}') if write_to == 'websocket': @@ -431,7 +431,7 @@ def run(read_from=None, screencapture_window_mode = False screencapture_window_active = True screencapture_window_visible = True - last_text = '' + last_text = [] sct = mss.mss() mon = sct.monitors if len(mon) <= screen_capture_monitor: @@ -476,6 +476,7 @@ def run(read_from=None, global sct_params sct_params = {'top': coord_top, 'left': coord_left, 'width': coord_width, 'height': coord_height, 'mon': screen_capture_monitor} + segmenter = Segmenter(language="ja", clean=True) logger.opt(ansi=True).info(f"Reading with screen capture using <{engine_color}>{engine_instances[engine_index].readable_name}{' (paused)' if paused else ''}") else: @@ -511,7 +512,7 @@ def run(read_from=None, else: if not paused and not tmp_paused: img = Image.open(io.BytesIO(item)) - process_and_write_results(engine_instances[engine_index], img, write_to, '') + process_and_write_results(engine_instances[engine_index], img, write_to, '', None) elif read_from == 'clipboard': process_clipboard = False if windows_clipboard_polling: @@ -557,7 +558,7 @@ def run(read_from=None, process_clipboard = True if process_clipboard: - process_and_write_results(engine_instances[engine_index], img, write_to, '') + process_and_write_results(engine_instances[engine_index], img, write_to, '', None) just_unpaused = False @@ -574,7 +575,7 @@ def run(read_from=None, if take_screenshot and screencapture_window_visible: sct_img = sct.grab(sct_params) img = Image.frombytes('RGB', sct_img.size, sct_img.bgra, 'raw', 'BGRX') - res = process_and_write_results(engine_instances[engine_index], img, write_to, last_text) + res = process_and_write_results(engine_instances[engine_index], img, write_to, last_text, segmenter) if res != '': last_text = res delay = screen_capture_delay_secs @@ -597,7 +598,7 @@ def run(read_from=None, except (UnidentifiedImageError, OSError) as e: logger.warning(f'Error while reading file {path}: {e}') else: - process_and_write_results(engine_instances[engine_index], img, write_to, '') + process_and_write_results(engine_instances[engine_index], img, write_to, '', None) img.close() if delete_images: Path.unlink(path) diff --git a/requirements.txt b/requirements.txt index 92610de..c68bc8f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,5 +9,6 @@ websockets notify-py mss pywinctl +pysbd pywin32;platform_system=='Windows' pyobjc;platform_system=='Darwin' \ No newline at end of file diff --git a/setup.py b/setup.py index 1054db8..80aefb7 100644 --- a/setup.py +++ b/setup.py @@ -30,6 +30,7 @@ setup( "notify-py", "mss", "pywinctl", + "pysbd", "pywin32;platform_system=='Windows'", "pyobjc;platform_system=='Darwin'" ],