2023-12-29 12:18:00+09:00

Pythonで画像OCRを読んで文字起こし

tesseract、pytesseract、pyocr、ImageGrab

意外に画像から文字起こししたい需要があるのだった。 OCRできるソフトに Tesseract というのがあってこれを使うとしたい。

1. tesseract

tesseractはhomebrewで入る( $ brew install tesseract )。

2. pytesseractとpyocr

pythonからはwrapper経由で呼び出すが二種類あった。

どちらもpipで入る( $ pip install pytesseract $ pip install pyocr )。

英語の画像から

まず英文の画像ファイルを文字起こししてみる。

どちらも問題なし。

日本語対応 - tesseractから

tesseractがそのままでは日本語に対応しない。

確認する。

$ python
>>> import pytesseract
>>> pytesseract.get_languages()
['eng', 'osd', 'snum']
>>>

tesseract-ocr-jpnをbrewでインストールできるらしいがうまくいかない。

$ brew install tesseract-ocn-jpn
==> Downloading https://formulae.brew.sh/api/formula.jws.json
==> Downloading https://formulae.brew.sh/api/cask.jws.json
Warning: No available formula with the name "tesseract-ocn-jpn". Did you mean tesseract?

といわれてしまう。 学習データがインストールされてないらしい。 ので手動インストール試行。

学習データは" Best (most accurate) trained LSTM models. "となってて、ここから日本語対応のデータをダウンロードする。jpn.traineddataとjpn_vert.traineddataが必要、ということは用意すれば縦書きにも対応するかな?

$ brew list tesseract で確認するとtessdataは、 /usr/local/Cellar/tesseract/5.3.3/share/tessdata/ にあるようなので、 ここにファイルを置く。

pythonで再確認すると追加された模様。

$ python
>>> import pytesseract
>>> pytesseract.get_languages()
['eng', 'jpn', 'jpn_vert', 'osd', 'snum']
>>> 

日本語文の画像を用意して試してみる。

どちらも日本語の認識はしてくれた。 pyocrの縦書きがおかしいので、当面pytesseractをベースにする。

入出力をクリップボード経由で

使い方を考えてクリップボードから読み込んだデータを文字起こしした後、 テキストをクリップボードに書き出すことにする。

言語を示すパラメータを引数で渡す。

クリップボードからの入力はPIL.ImageGrab、出力はpyperclipを使用。

完璧。

3. 参考