画像から文字起こしができると、業務効率化など様々な場面に応用できて便利です。
幸いなことに、それを可能にするオープンツールがあります。しかもPythonで実行することができます。
ここでは各ツールを使って画像から文字起こしする具体的な方法とその手順についてまとめます。
まずはオープンツール(tesseract-OCR)の概要について
まず、画像から文字起こしする技術を光学文字認識(Optical Character Recognition)といいます。略してOCRです。
OCRを実施できるソフトウェアに、Googleが開発元の「テッセラクト(tesseract)」というものがあります。「tesseract-OCR」とも呼ばれます。
tesseract-OCRはオープンソースです。誰でも使うことができます。
さらに、tesseract-OCRは画像のアップロードが不要です。一旦、ソフトウェアをインストールすれば、あとは自分のPC内で処理を完結できます。
したがって、情報管理の厳しい会社の中でも使えますし、他人に見られたくない画像ファイルでも処理することができます。
tesseract-OCRをPythonで使えるようにするためのライブラリが「pyocr」です。いわゆるラッパー(特定のソフトを特定のプログラミング言語で使えるようにするもの)です。
以下、tesseract-OCRとpyocrで画像から文字起こしする具体的な手順です。
必要なものをインストールする
tesseract-OCRをインストール
まずはこちらのURLからtesseract-OCRをインストールします。
Windowsの場合は、URL中のTesseract at UB Mannheim. をクリックします。
「tesseract-ocr-w64-setup-v5.0.0-alpha.20190708.exe」をクリックしてダウンロードします。大体の人は64bitかと思います。
インストールが進行します。途中、手動でチェックを入れるような表示が出ますが、特に触らずに最後まで進めてください。
インストールが完了すると「tesseract-OCR」フォルダができます。これを、
C:¥Program Files
の中に移動します。
対象となる言語の教師データは、「tesseract-OCR」フォルダの中の「tessdata」フォルダに入ります。デフォルトで英語の教師データ(eng.traineddata)が入っています。
日本語の教師データをダウンロードして保存する
日本語など、英語以外の言語の教師データを追加する場合は、こちらのURLのうち「Updated Data Files for Version 4.00 (September 15, 2017)」と書かれたところを見てください。
通常のものに加え、精度を重視したbest版、速度を重視したfast版の3タイプがあり、それぞれのURLが記載されています。
好きなタイプのURLを開き、教師データのファイルを取得します。
日本語ですと、「jpn.traineddata」と縦書き用「jpn_vert.traineddata」の2ファイルをダウンロードします。
ダウンロードしたファイルは、「tessdata」フォルダに移してください。
tesseract-OCRフォルダにPath(パス)を通す
どこからでもtesseract-OCRを動かせるように、「tesseract-OCR」フォルダにPathを通します。
WindowsマークのボタンとPAUSE/BREAKのボタンを同時に押してステムの画面を立ち上げます。左側の「システムの詳細設定」をクリックし、「環境変数」をクリックします。
システム環境変数の中にPathという変数がありますのでクリックします。右上の「新規」をクリックし、「C:¥Program Files¥Tesseract-OCR」と記入します。OKをクリックします。
次に、「TESSDATA_PREFIX」という環境変数を新たに作ります。
システム環境変数の「新規」をクリックし、
変数名:TESSDATA_PREFIX
変数値:C:¥Program Files¥Tesseract-OCR¥tessdata
と入力てOKをクリックします。
終わったら、設定を反映させるためにパソコンを再起動してください。
pyocrをインストールする
コマンドプロンプトを立ち上げて、pyocrをインストールします。
pip install pyocr
インストールがうまくいかない場合はこちらが参考になるかもしれません。


文字起こししたい画像を準備する
続いて、文字起こししたい画像を準備します。
ここでは、Wikipediaの下記画面をalt+プリントスクリーンでコピーし、ペイントに貼り付けます。
そして、「test.png」という名前でデスクトップに保存します。
引用:Wikipedia(https://ja.wikipedia.org/wiki/データサイエンス)
Pythonでコードを書く
Pythonでコードを書き、実行ファイルを作ります。私はAtomで作成しました。
ひとまず、pyocrのこちらに貼っているコードをコピペします。まずは、「Usage」の「Initialization」のところに記載されているコードをコピペします。なお、コメントアウトの部分は省きました。
from PIL import Image
import sys
import pyocr
import pyocr.builders
tools = pyocr.get_available_tools()
if len(tools) == 0:
print("No OCR tool found")
sys.exit(1)
tool = tools[0]
print("Will use tool '%s'" % (tool.get_name()))
langs = tool.get_available_languages()
print("Available languages: %s" % ", ".join(langs))
lang = langs[0]
print("Will use lang '%s'" % (lang))
Will use tool ‘Tesseract (sh)’
Available languages: eng, jpn, jpn_vert, osd
Will use lang ‘eng’
これを実行すると、上記のようにAvailable languages(使用できる言語):eng, jpn, jpn_vert, osdとなり、そのうち1番目のeng(英語)が選択されてしまいます。
これをjpn(日本語(横書き))にするために、最後から2行目を次のように変えてください。
lang_num=1
lang = langs[lang_num]
Will use tool ‘Tesseract (sh)’
Available languages: eng, jpn, jpn_vert, osd
Will use lang ‘jpn’
これでOKです。
次に、「Image to text」ところに記載されているコードの最初の数行を書き、最後にテキストを表示するprint文を入れます。
txt = tool.image_to_string(
Image.open('test.png'),
lang=lang,
builder=pyocr.builders.TextBuilder()
print(txt)
最後に、ファイル名を「sample.py」としてデスクトップに保存します。
このプログラムは、sample.pyと同じ場所に置いているtest.pngの画像を文字起こしし、テキストとして返すというものです。
PIL(pillow)が未導入の方は、pipやcondaでインストールしておく必要があります。
プログラムを実行してみる
早速、実行してみます。
コマンドプロンプトを開き、次のように打ってデスクトップに移動します。
cd desktop
次に、このように打ってエンターキーを押します。
python sample.py
少し時間が経過したのち、文字起こししたテキストがコマンドプロンプトに表示されるのが分かります。
初めて文字起こしできた瞬間は感動モノです!!

処理できる画像の拡張子
tesseract-OCRで処理できる画像ファイルの拡張子は今回のpngの他、jpeg、bmpなどです。
使い勝手の良いコードに改良する
使い勝手の良いコードに改良します。改良点は3点です。
1)input()関数を入れて、画像ファイルの場所、ファイル名を指定できるようにする。
2)不自然にできてしまう文字間のスペースをなくす。改行もなくす。
3)文字認識の「tesseract_layout」の番号を変えてみる。
1)は書いてあるとおりです。
2)は、こちらのQiitaの記事を参考にしました。正規表現を用いて文字間スペースや改行をなくせるもので、そのまま活用させていただきました。
3)の「tesseract_layout」とは、文字認識のパターン、バリエーションのことで、0〜13まであります。builder=pyocr.builders.TextBuilder(tesseract_layout=〇〇)として指定できます。
何も指定しない場合のデフォルトは3です。画像にもよりますが、6に変えるとうまくいく場合もあります。今回は3が一番良かったので3にしています。
詳しくはこちらのURLの「OPTIONS」の「–psm N」を見てください。
改良を加えたコードはこのようになります。
from PIL import Image
import sys
import pyocr
import pyocr.builders
tools = pyocr.get_available_tools()
if len(tools) == 0:
print("No OCR tool found")
sys.exit(1)
tool = tools[0]
print("Will use tool '%s'" % (tool.get_name()))
langs = tool.get_available_languages()
print("Available languages: %s" % ", ".join(langs))
lang_num=1
lang = langs[lang_num]
print("Will use lang '%s'" % (lang))
input_file = input('ファイルのパスを入力してください。')
txt = tool.image_to_string(
Image.open(input_file),
lang=lang,
builder=pyocr.builders.TextBuilder(tesseract_layout=3)
import re
txt = re.sub('([あ-んア-ン一-龥ー])\s+((?=[あ-んア-ン一-龥ー]))',
r'\1\2', txt)
print( txt )

非常に見やすくなりました。
英文の場合
言語を指定を変更し(lang_num=0)、reを使った正規表現処理のコードを削除すればOKです。
from PIL import Image
import sys
import pyocr
import pyocr.builders
tools = pyocr.get_available_tools()
if len(tools) == 0:
print("No OCR tool found")
sys.exit(1)
tool = tools[0]
print("Will use tool '%s'" % (tool.get_name()))
langs = tool.get_available_languages()
print("Available languages: %s" % ", ".join(langs))
lang_num=0
lang = langs[lang_num]
print("Will use lang '%s'" % (lang))
input_file = input('ファイルのパスを入力してください。')
txt = tool.image_to_string(
Image.open(input_file),
lang=lang,
builder=pyocr.builders.TextBuilder(tesseract_layout=3)
print( txt )
応用編
文字ではなく数字や記号を認識したい場合
先ほどのコードで認識できます。ただし、「2)不自然にできてしまう文字間のスペースをなくす。改行もなくす。」に関するコードは消しておいたほうがいいです。
一例を載せておきます。
<画像>

<テキスト変換後>

画像ファイルだけでなく、pdfファイルからも文字起こししたい場合
自分のメモや文献をスキャナでpdfファイルにして保存している方、多いと思います。
こういったpdfファイルから文字起こしできると、いろいろ便利だと思います。
pdfファイルからも文字起こしできるようにしたい場合はこちらの記事をぜひご覧ください。
.png?resize=320%2C180&ssl=1)
注意点
今回のようにデジタル表示の文字や数字であれば高い精度でテキスト変換できますが、手書きの文字や数字だと認識率が悪くなります。
また、文字や数字が小さいと認識率が悪くなります。
色々と試していただければと思います。
最後に、こんなものもあります。こちらも便利ですのでぜひご活用下さい。
