秒単位でのメール受信と"コン♬" "コン♬"と立て続けに聞こえてくるコミュニケーションツールの告知音。ダンバー数を超えたノティファイは、危惧すべき点がある。適切なセグメント化を構築することをしていないと、様々なアラートに埋もれてしまう。

仮にメール受信と同頻度でコミュニケーションツールが鳴るとすれば、AIの力も必要となるし、クリックする前にチャンネルの直近の履歴をオンカーソルで表示するような機能が無いと、対応できなくなるだろう。最終的にUIがメーラーと同じようになっていくようになる気もする。こうなってくると、次元を超えたメモ対応に備えねばなるまい。

OCRを活用する

ふと思いついたのは、OCRの活用だ。アプリ/ソフトが多様化してくるとコピー&ペーストがままならない、もしくは時間がかかるというシーンに遭遇することも増えてきている。本来コピー&ペーストが最速のメモであったがズバッとキャプチャしたほうが速そうな気がするのだ。

Windows11にはデフォルトでWin+Shift+Sで立ち上がるSnipping ToolにはOCR機能がある。これを呼び出し、関連しそうな画面をキャプチャしてテキスト化してメモにするというのは、考え得る方法だ。久しぶりに試してみたところ、日本語の間違いもほとんどないようだ。

ただ、呼び出して保存するまでに、すべてのテキストをコピー、テキストエディタを開いて「メモ.txt」などで保存など、どうも想定するアジャイルな動きに対しては実用的では無い。Snipping Toolをsnipと命名しPowerShellで呼び出すことは

function snip {
    snippingtool
}

で可能だ。これはこれで多少は早まるが、OCRでテキスト保存まではできない。ただ画像自体ををメモとしてその日の作業フォルダに保存しておくことは可能だ。現状では、OCR操作をデフォルトの環境で設定するのは難しいようだ。

OSSのOCR「Tesseract」を試してみる

OSSで開発されているOCRエンジン「Tesseract」(GitHub)は100以上の言語に対応し、Apache License 2.0で利用できる。リポジトリではWindows用にバイナリも提供しているので、環境が許せばインストール可能だ。

ここでは、Windows版をダウンロードしてバイナリをインストールしてみる。GitHubの公式リポジトリのインストール解説サイトの下の方にWindowsの項目があるがドイツのマンハイム大学UB Mannheim開発者チームが提供しているインストーラーを使う。

インストール時のオプションにLanguage dataの項目やScriptの項目があるが、ここにjapaneseと日本語に関係あるものにチェックをすべて入れておく。

  • japaneseと日本語に関係あるものにチェック

    japaneseと日本語に関係あるものにチェック

コマンドでtesseractを使えるようにしたい場合は、環境変数(設定→システム→バージョン情報→システムの詳細設定)にインストールパスを入れておくとよいだろう。それ以外は都度、インストールした絶対パスから呼び出す必要がある。

使い方は簡単で同一フォルダ/ディレクトリ内で以下ののように対象のin.pngを設置し、-l jpn txtで日本語のテキスト書き出しを指定する。

tesseract in.png output -l jpn txt
  • Web上の記事の日本語を「in.png」で保存する。もちろんファイル名は変えられる

    Web上の記事の日本語を「in.png」で保存する。もちろんファイル名は変えられる

  • output.txtが保存されるのでエディターeditで開いてみると

    output.txtが保存されるのでエディターeditで開いてみると

  • しっかりとOCRでテキスト保存されている

    しっかりとOCRでテキスト保存されている

クリップボードの画像を対象にする

毎回保存していては、WindowsデフォルトのOCRを使うのと変わらないのでクリップボードの画像を取得してtesseractでテキスト保存する関数をつくる。[System.Windows.Forms.Clipboard]::GetImage()で取得できるので、画像をキャプチャしたあとにこれをテキストで保存する。

function snipocr {
    Add-Type -AssemblyName System.Windows.Forms
    $img = [System.Windows.Forms.Clipboard]::GetImage()
    $tmp = Join-Path (Get-Location) "clip.png"
    $img.Save($tmp)
    tesseract $tmp "output" -l jpn txt
}
  • ユーザープロファイルにsnipocrで設定

    ユーザープロファイルにsnipocrで設定

  • 別の画像をsnippingtoolでキャプチャーし、右横のコピーボタンでクリップボード保存

    別の画像をsnippingtoolでキャプチャーし、右横のコピーボタンでクリップボード保存

  • 別ディレクトリからsnipocrをしても保存される

    別ディレクトリからsnipocrをしても保存される

  • しっかりテキストも確保できている

    しっかりテキストも確保できている

テキスト名が同じだと上書きされるので、毎回、ログのように西暦日時秒ファイル名にするよう$ts = (Get-Date -Format "yyyyMMdd_HHmmss")を使ってtesseractの引数に加える。

function snipocr {
    Add-Type -AssemblyName System.Windows.Forms
    $img = [System.Windows.Forms.Clipboard]::GetImage()
    $tmp = Join-Path (Get-Location) "clip.png"
    $img.Save($tmp)
    $ts = (Get-Date -Format "yyyyMMdd_HHmmss")
    tesseract $tmp $ts -l jpn txt
}
  • 毎回異なるテキストで保存されるので、どれだけ増やしても問題ない

    毎回異なるテキストで保存されるので、どれだけ増やしても問題ない

先に示したsnipだけの読み込みと併せて使ってみると、結構使える。クリップボードボタンを押し忘れると、空になりエラーになるのでここにはエラー処理を加えても良いかもしれない。