- macOSのショートカットアプリを使えば、別途有料サービスを使わずにローカルOCRショートカットを作成し、ターミナル/CLI/Pythonから画像のテキスト抽出を実行できる
- 中核となる構成は、Extract Text from ImageアクションにShortcut Inputを接続し、結果をクリップボードへコピーする流れ
- ショートカット名は
ocr-textやextract-textのように、スペースなしの小文字にしておくとCLIから呼び出しやすい。名前を入力した後はEnterを押して保存する必要がある
- ターミナルでは
shortcuts run ocr-text -i で実行し、抽出結果はクリップボードにコピーされるのでCommand-Vで確認できる
- Pythonでは
subprocess.check_output()で同じshortcuts runコマンドを呼び出し、OCRショートカットを再利用できる
ショートカットでOCRショートカットを作成する
- macOSのショートカットアプリを開き、
+ボタンで新しいショートカットを作成する
- 右側のサイドバーで
extract textを検索し、Extract Text from Imageアクションを左側の作業エリアへドラッグする
Extract text from ...アクションの青いImage入力をクリックし、Shortcut Inputを選択する
- 上部にReceiveアクションが表示されるので、そのままにしておけばよい
- 右側のサイドバーで
copyを検索し、Copy to ClipboardアクションをExtract Text from Imageの下に配置する
- 最後のアクションで
Copyの後ろがText from Imageになっていることを確認する必要がある
Copy to Clipboardアクションを下へドラッグする作業は、やや不便に感じる場合がある
- ショートカット名は
extract-textまたはocr-textのように、シンプルでスペースのない小文字が適している
- 名前を入力した後、Enterを押さないと名前が保存されない
CLIとPythonから実行する
- ターミナルでショートカットを実行するコマンドは次のとおり
shortcuts run ocr-text -i
- 実行後、Command-Vで貼り付けたときに抽出されたテキストが表示されれば、設定は正しくできている
- Pythonでは
subprocess.check_output()で同じコマンドを実行できる
import subprocess
file_path = '... some file path ...'
ocr_out = subprocess.check_output(
f'shortcuts run ocr-text -i "{file_path}"', shell=True
)
print(ocr_out)
- ショートカットの共有が期待どおりに動作しない場合があるため手動設定が必要で、ほとんどの作業は一度だけ行えばよい
1件のコメント
Hacker Newsのコメント
OPの記事はよかった。AppleのVisionフレームワークはかなり印象的で、スプレッドシートのスクリーンショット数万枚をOCRで読み取ってPostgreSQLデータベースに入れる個人プロジェクトで使ってみた。
macOSとNvidiaはまだ相性がよくないので、TesseractのようなCPUベースのOCRも試したが、結果があまりにも頻繁に間違っていた。Visionフレームワークは、自分が見た中で出力品質が最もよく、計算量も最も少なかった。
かなり不安定ではあったが、自分の実装ミスだった可能性もある。実際の実装にはRHetTbullのvision.py https://gist.github.com/RhetTbull/1c34fc07c95733642cffcd1ac5...を、実験にはocrmac https://github.com/straussmaximilian/ocrmacを併用し、i7 6700kのHackintoshでも性能は意外によかった。
自分をプログラマーとは呼ばないが、十分な時間があればたいてい問題は解決できた。ただ、その代わりかなり時間はかかった。
RAGフレームワークを見ても、複数の実装を使ったりサポートしたりする場合が多く、Tesseractはほぼ常にサポートされているが、たいてい理想的な選択肢ではない。Unstructured https://github.com/Unstructured-IO/unstructured-inferenceやDocTR https://github.com/mindee/doctrのようなプロジェクトのほうが好まれる。
これらはおおむね最新レベルのビジョンモデル https://github.com/mindee/doctr#models-architectures https://github.com/Unstructured-IO/unstructured-inference#mo...を活用しており、Tesseractを圧倒している。
Apple Visionフレームワークと直接比較したことはないが、Tesseractよりは確実に優れており、潜在的にはApple Visionより優れている可能性もある。複数の方式を組み合わせるアプローチもあるが、かなり複雑になる。
AWS Textractは表をCSVとして抽出するPythonサンプルコードを提供していて、それはうまく動作する。
Windowsで似たようなことを試しているうちに、すでにインストールしていたMicrosoftのプロジェクトであるPowerToysに、かなり優れたOCRツールが入っていることに気づいた。
Win+Shift+Tを押してスキャンする領域を選ぶと、テキストがクリップボードにコピーされる。
https://learn.microsoft.com/en-us/windows/powertoys/
https://learn.microsoft.com/en-us/windows/powertoys/text-ext...
CLIとそこそこ使いやすいUIの両方を提供するオープンソースツールを作った。無料だ。
https://trex.ameba.co
Safari、Preview、Notesを含む多くのMacアプリが、画像に対してOCRを自動で実行していることに気づいた。画像内のテキストを簡単に選択して、別の場所にコピー&ペーストできるのでかなりよい。
URLやドメインのテキスト、QRコードであれば、ポスターの写真や動画の中でも、長押しや長クリックで画像から直接リンクを開ける。
写真で選択してコピーし、Handoff機能を通じてスマートフォンやMacに貼り付けられる。
MacBookにbrewでインストールして使っている小さなOCRツールがとても気に入っている: https://github.com/schappim/macOCR
WindowsではPowerToysのText Extractorをおすすめする。
https://learn.microsoft.com/en-us/windows/powertoys/text-ext...
私の解決策も一つ付け加えるならこれです: https://skaplanofficial.github.io/PyXA/tutorial/images.html#...
PyXA は Vision フレームワークを使って、1つ以上の画像からテキストを抽出します。パッケージのごく一部なので一回限りの作業には大げさかもしれませんが、選択肢にはなります
ImageAnalyzer のほうが新しく、ずっと優れています。OP の shortcut も内部的には古い API を使っている可能性が高そうです
macOS Ventura 以降のバージョンでは、Image Capture の UI に標準の OCR 機能 が実際に統合されています
AirPrint 対応スキャナーで PDF スキャンをすると、右側のパネルに「OCR」チェックボックスが表示されます
ファイルに内容を書き込むには、こうできます。最も効率的だと言いたいわけではありませんが、動きます
OCRTHISFILE="ocr-test.jpg"
shortcuts run ocr-text -i "${OCRTHISFILE}"
pbpaste > ${OCRTHISFILE}.txt
または、出力を見ながらファイルにも書き込むなら:
OCRTHISFILE="ocr-test.jpg"
shortcuts run ocr-text -i "${OCRTHISFILE}"
pbpaste | tee ${OCRTHISFILE}.txt
Apple Vision の Copy Subject 機能にも似たような手法があるのか気になります。この機能にかなり頼るようになったのですが、アクセス方法があまりにも限定的に感じます
「Extract text」アクションを「Remove background」に変えてみればよさそうです。shortcut を実行するときに「-o」で出力画像ファイル名を指定すれば OK です
shortcuts run remove-background -i ~/Downloads/portrait-beard.avif -o beard.jpg