From dd35140f763b6b161a170dacb25d3bd6630e5871 Mon Sep 17 00:00:00 2001 From: AuroraWright Date: Sun, 11 Feb 2024 18:32:43 +0100 Subject: [PATCH] Jumped the gun about this too soon (yay undocumented APIs) --- README.md | 8 +- livetexthelper | Bin 243920 -> 0 bytes livetexthelper_src/LICENSE | 21 -- livetexthelper_src/LiTeX/LiveTextCLI.swift | 58 ---- .../litex.xcodeproj/project.pbxproj | 293 ------------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcschemes/LiveTextPlayground.xcscheme | 85 ----- .../xcshareddata/xcschemes/Release.xcscheme | 85 ----- owocr/ocr.py | 83 +++-- 10 files changed, 61 insertions(+), 587 deletions(-) delete mode 100755 livetexthelper delete mode 100644 livetexthelper_src/LICENSE delete mode 100644 livetexthelper_src/LiTeX/LiveTextCLI.swift delete mode 100644 livetexthelper_src/litex.xcodeproj/project.pbxproj delete mode 100644 livetexthelper_src/litex.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 livetexthelper_src/litex.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 livetexthelper_src/litex.xcodeproj/xcshareddata/xcschemes/LiveTextPlayground.xcscheme delete mode 100644 livetexthelper_src/litex.xcodeproj/xcshareddata/xcschemes/Release.xcscheme diff --git a/README.md b/README.md index 0bd439b..c6ea846 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ This has been tested with Python 3.11. Newer/older versions might work. It can b - [EasyOCR](https://github.com/JaidedAI/EasyOCR): refer to the readme for installation ("e" key) - [RapidOCR](https://github.com/RapidAI/RapidOCR): refer to the readme for installation ("r" key) - Apple Vision framework: this will work on macOS Ventura or later. In my experience, the best of the local providers for horizontal text ("a" key) -- Apple Live Text (VisionKit framework): this will work on macOS Ventura or later. It should be the same as Vision except that in Sonoma Apple added vertical text reading, on the other hand it's a bit slower/requires a small Swift helper tool to be downloaded (source code is in this repo, it's a stripped down version of LiTeX). ("d" key) +- Apple Live Text (VisionKit framework): this will work on macOS Ventura or later. It should be the same as Vision except that in Sonoma Apple added vertical text reading ("d" key) - WinRT OCR: this will work on Windows 10 or later if winocr (`pip install winocr`) is installed. It can also be used by installing winocr on a Windows virtual machine and running the server (`winocr_serve`), installing requests (`pip install requests`) and specifying the IP address of the Windows VM/machine in the config file (see below) ("w" key) ## Cloud providers @@ -40,9 +40,9 @@ However: # Acknowledgments This uses code from/references these projects: -- Viola for working on the Google Lens implementation and helping with the (shelved) pyobjc VisionKit code! +- Viola for working on the Google Lens implementation and helping with the pyobjc VisionKit code! +- @ronaldoussoren for helping with the pyobjc VisionKit code - [Manga OCR](https://github.com/kha-white/manga-ocr) - [ocrmac](https://github.com/straussmaximilian/ocrmac) for the Apple Vision framework API - [NadeOCR](https://github.com/Natsume-197/NadeOCR) for the Google Vision API -- [ccylin2000_lipboard_monitor](https://github.com/vaimalaviya1233/ccylin2000_lipboard_monitor) for the Windows clipboard polling code -- [LiTeX](https://github.com/Shakshi3104/LiTeX) for the Swift Live Text helper \ No newline at end of file +- [ccylin2000_lipboard_monitor](https://github.com/vaimalaviya1233/ccylin2000_lipboard_monitor) for the Windows clipboard polling code \ No newline at end of file diff --git a/livetexthelper b/livetexthelper deleted file mode 100755 index 6ff53cdfcf247d221cd84a36f5721205c64acc58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243920 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 NjE;;9XTJDx zEu(7=Xq@EojFbl^OgsoTdicu{M%oGhL0%>diM&kd3xq^e;Bk&@lu^D5w3HcA*5?mX z$e2&R+rl?!i6=gv2D`{JS~WC9^));4(WFs@TYtIdv9JGJ^w=K@_boC_-r4UT%m2~q z(QC&?{ZaOq<-U>oUt8Vj&_7Rk9{Y7)W`|FTCWjw-=DOO#x_P_(f4(((`6`>Sa?E?L z?N~Rt&Ahs+F3fzrPzxN;26Y4^fxW@ zt$+$!FWW?CuTJ>9+myuP#jjXy-PggZ6dBn>|3mf&nMq-$F!LBwL|Al0I22qc6rDLr zgkiHxOYb!IG8;-4FaRGE)!&+l0qN+>kPJR?MtvX4q303_kk6D_=OsMpE0r zHVu}lxfA9@vH=4F>X#b|BQZ4vqpWqq>D3tnWA%|wcAEI%rI+=6#8Q zhTV~)t}C5>D(ldh__hlUEc-d~+6Uh%T77%^!@op*T=d{G%hsBHoKiC0|LT~xR(<|; z$AR~bAMFiF|8(VZPnWp2Oz&5?+;aMvgs*F#nDeiP58gaxd#1k6%8=K-JF0)Md*6a* z7Yynccwpu5{)e+Fw@tEs`t@t&AH8ro%>U;7gAaPfmU>_EH7z{YZsVdYsn0$7Pbb%c zx-q6@x^Poqz1Gv28XHZ`+9&z44ua8?X-YSZlCep5XMfr9ffn#6Y@bDoGTm8Wqw!9W z$y}dYxN~r;HkL$W3P*GHm9=OWfR1qTB0S)2n#;=YMuAlksHoNwVV4&*XfVmc;*Ig z@uT0ekYD;HzCI+q`;Cs|VCT>`+|l1$Iy(Q$(8+6W8QY`Z%2$2v+x=lXoAoQdHw&k4 z82st$_Z?XO;qu!njx9NNX#dmCzx3SJk$2tqM8C~PckTOZlA4=c;Rkfx1?or>y zMOVJ*etA{&j(Ly%d9>;ur*D4s-51^;xV_@0+Xt~5K1|;{_pv^QM+e?}`j709OFM;s zVI4Kve82bG^FyEe_0}%SoRuFI7T*@yb52g|`iJ{}_Rwd3>+kQ}%Y7=u`>c7H{$7}% zcSCTdrFZ`i>1eE{o0&Tl3-Z!s!hYyzd5ImMH@B?^{(`A@JqYkMcMuhPsM&17APj?o z4{3_+@FgUtg`t+WEuMbH5E9Xd252GBN{n z<`AfghP{C+pk5{nZ=e^<%Y>e=qq_dz+a=1xr{1%jp86de2Yq1|+d=_j=_8^P@LCI} zg{8Zuq)v&OA2}=3GbS~3YP=_+FluJ}wUjP|Cmf4sD^$ zu4d>~r4AvzEV4*3n7#8=)#=@isiuu+&0IX&Iplh=2bsysVS!n|FFmm)DI?)zg#I)s zBV_FX9kX_j_L=yZ&A8Kttf#cC{YKHW^pLn6(7N9?mS0yM?e!h+#OLl&W*YhJ@A*pDH&r)#Ed#!S z9Lckg+sbO|a$bxoPYg;iwa%2A6>TINqFV3Sm56Zdu - - - - diff --git a/livetexthelper_src/litex.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/livetexthelper_src/litex.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/livetexthelper_src/litex.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/livetexthelper_src/litex.xcodeproj/xcshareddata/xcschemes/LiveTextPlayground.xcscheme b/livetexthelper_src/litex.xcodeproj/xcshareddata/xcschemes/LiveTextPlayground.xcscheme deleted file mode 100644 index 1bc6fda..0000000 --- a/livetexthelper_src/litex.xcodeproj/xcshareddata/xcschemes/LiveTextPlayground.xcscheme +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/livetexthelper_src/litex.xcodeproj/xcshareddata/xcschemes/Release.xcscheme b/livetexthelper_src/litex.xcodeproj/xcshareddata/xcschemes/Release.xcscheme deleted file mode 100644 index e2c46ec..0000000 --- a/livetexthelper_src/litex.xcodeproj/xcshareddata/xcschemes/Release.xcscheme +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/owocr/ocr.py b/owocr/ocr.py index 243dff4..5db54b5 100644 --- a/owocr/ocr.py +++ b/owocr/ocr.py @@ -22,7 +22,8 @@ except ImportError: try: import Vision import objc - from subprocess import Popen, PIPE, STDOUT + from AppKit import NSData, NSImage, NSBundle + from PyObjCTools.AppHelper import runConsoleEventLoop, stopEventLoop except ImportError: pass @@ -280,12 +281,10 @@ class AppleVision: if success[0]: for result in req.results(): res += result.text() + '\n' - req.dealloc() x = (True, res) else: x = (False, 'Unknown error!') - handler.dealloc() return x def _preprocess(self, img): @@ -300,24 +299,41 @@ class AppleLiveText: def __init__(self): if sys.platform != 'darwin': - logger.warning('Apple Vision is not supported on non-macOS platforms!') + logger.warning('Apple Live Text is not supported on non-macOS platforms!') elif int(platform.mac_ver()[0].split('.')[0]) < 13: - logger.warning('Apple Vision is not supported on macOS older than Ventura/13.0!') + logger.warning('Apple Live Text is not supported on macOS older than Ventura/13.0!') else: - self.helper_executable = os.path.join(os.path.expanduser('~'),'.cache','livetexthelper') - if not os.path.isfile(self.helper_executable): - logger.info('Downloading helper executable ' + self.helper_executable) - try: - cache_folder = os.path.join(os.path.expanduser('~'),'.cache') - if not os.path.isdir(cache_folder): - os.makedirs(cache_folder) - urllib.request.urlretrieve('https://github.com/AuroraWright/owocr/raw/master/livetexthelper', self.helper_executable) - mode = os.stat(self.helper_executable).st_mode - mode |= (mode & 0o444) >> 2 - os.chmod(self.helper_executable, mode) - except: - logger.warning('Download failed. Apple Live Text will not work!') - return + objc.loadBundle('VisionKit', globals(), '/System/Library/Frameworks/VisionKit.framework') + objc.registerMetaDataForSelector( + b'VKCImageAnalyzer', + b'processRequest:progressHandler:completionHandler:', + { + 'arguments': { + 3: { + 'callable': { + 'retval': {'type': b'v'}, + 'arguments': { + 0: {'type': b'^v'}, + 1: {'type': b'd'}, + } + } + }, + 4: { + 'callable': { + 'retval': {'type': b'v'}, + 'arguments': { + 0: {'type': b'^v'}, + 1: {'type': b'@'}, + 2: {'type': b'@'}, + } + } + } + } + } + ) + app_info = NSBundle.mainBundle().infoDictionary() + app_info['LSBackgroundOnly'] = '1' + self.analyzer = VKCImageAnalyzer.alloc().init() self.available = True logger.info('Apple Live Text ready') @@ -329,15 +345,30 @@ class AppleLiveText: else: raise ValueError(f'img_or_path must be a path or PIL.Image, instead got: {img_or_path}') - process = Popen([self.helper_executable], stdout=PIPE, stdin=PIPE, stderr=PIPE) - stdout, stderr = process.communicate(input=self._preprocess(img)) - stdout = stdout.decode().rstrip() - if stdout == '': - return (False, stderr.decode().rstrip()) - return (True, stdout) + req = VKCImageAnalyzerRequest.alloc().initWithImage_requestType_(self._preprocess(img), 1) + req.setLocales_(['ja','en']) + self.result = None + self.analyzer.processRequest_progressHandler_completionHandler_(req, lambda progress: None, self._process) + runConsoleEventLoop() + + if not self.result: + return (False, 'Unknown error!') + return (True, self.result) + + def _process(self, analysis, error): + res = '' + lines = analysis.allLines() + if lines: + for line in lines: + res += line.string() + '\n' + self.result = res + stopEventLoop() def _preprocess(self, img): - return pil_image_to_bytes(img, 'tiff') + image_bytes = pil_image_to_bytes(img, 'tiff') + ns_data = NSData.dataWithBytes_length_(image_bytes, len(image_bytes)) + ns_image = NSImage.alloc().initWithData_(ns_data) + return ns_image class WinRTOCR: