今回はpythonを使って、画像から文字起こしをしたいと思います。
「【AI】文字起こしBOT作ってみた」で文字起こしをしてくれるBOTを制作しましたが、pythonでも同じことができるのではないかと思い調べてみました。
するとOCR( 光学的文字認識 )という技術を使って同じようなことが実現できるようなのでやってみることにしました。
思ったほど難しくはなかったので、ぜひやってみてください。
やること
OCRをpythonで行うためには
- tesseractのインストール
- 日本語データのダウンロード
- pyocrのインストール
が必要になったので順に説明していきたいと思います。
必要なもの
- Anaconda
GitHubからインストーラーをダウンロードしてやる方法もありましたが、うまくできなかったのでAnacondaからすべて行いました。
Anacondaのインストール方法は「【python】AnacondaでDjangoを使うには」を参考にしてください。
下準備
tesseractのインストール
tesseractはORCを使うツールです。
AnacondaNavigatorをひらき、
- 「environments」を開く
- 「base(root)」の▶をクリック
- 「Open Terminal」をクリック

でコマンドプロンプトを開きます。
そしてそのまま以下のコードを打ち込みます。
conda install -c conda-forge tesseract
これでtesseractはインストールできました。
conda listで確認してみましょう。
日本語データのダウンロード
さて、これで tesseract をインストールできましたが、まだ日本語データがダウンロードできていないので、日本語が認識できません。
日本語データは GitHubから ダウンロードできます。

下の方に行くと、写真のような日本語データがダウンロードできるリンクがあるのでクリックしてダウンロードしましょう。「jpn.traineddata」というファイルがダウンロードできると思います。
ダウンロード出来たらそのファイルを PCのCドライブの中にある
C:\ユーザー\(your-name)\Anaconda3\Library\bin\tessdata
の中に持ってきましょう。
(Windowsの話です。MacなどほかのOSはすみませんわかりません。)
こうすることで日本語データを認識することができます。
pyocrのインストール
では最後にpyocrをインストールします。これはpythonでOCRを使うことができるようにするためのモジュールです。
これは簡単でAnacondaPromptで
pip install pyocr
とすればインストールできます。
OCRを試してみる
では実際にできるかどうか試してみましょう。
OCRツールが機能しているか確認する
今回はjupyternotebookで操作していきます。
まず、OCRツールが機能しているか確かめます。
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) # The tools are returned in the recommended order of usage tool = tools[0] print("Will use tool '%s'" % (tool.get_name())) # Ex: Will use tool 'libtesseract' 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, osd Will use lang 'eng'
とかえってくれば問題ないかと思います。
「Available languages」にjpnが入っていれば日本語はしっかりと認識してくれます。
画像データを読み込んでテキスト化
今回はWikipediaにあるpythonの説明をテキスト化したいと思います。

これを「python-ja.png」として保存します。
そして、jupyternotebookで以下のコードを打ち込みます。
txt = tool.image_to_string( Image.open('python-ja.png'), lang="jpn", builder=pyocr.builders.TextBuilder(tesseract_layout=6) ) print( txt )
すると、以下のように出力されると思います。
Python チ ュ ー ト リ ア ル Python は 強 力 で 、 学 び や す い プ ロ グ ラ ミ ン グ 言 語 で す 。 効 率 的 な 高 レ ベ ル デ ー タ 橙 造 と 、 シ ン ブ ル で 効 果 的 な オ ブ ジェ ク ト 指 向 プ ロ グ ラ ミ ン グ 機 橙 を 備 え て い ま す 。 Python は 、 洗 練 さ れ た 文 法 ・ 動 的 な デ ー タ 型 付 け ・ イ ン タ ー プ リ タ で あ る こ ご と な ど か ら 、 ス ク リ プ テ ィ ン グ や 高 速 ア プ リ ケ ー シ ョ ン 開 発 (Rapid Application Development: RAD) に 理 想 的 な プ ロ グ ラ ミ ン グ 言 語 と な っ て い ま す 。 Python Web サ イ ト (https:/www python_org) は 、 Python イ ン タ ー プ リ タ と 標 準 ラ イ ブ ラ リ の ソ ー ス コ ー ド と 、 主 要 プ ラ ッ ト フ ォ ー ム ご と に コ ン パ イ ル 済 み の バ イ ナ リ フ ァ イ ル を 無 料 で 配 布 し て い ま す 。 ま た 、Python Web サ イ ト に は 、 無 料 の サ ー ド バ ー テ デ テ ィ モ ジ ュ ー ル や プ ロ グ ラ ム 、 ツ ー ル 、 ド キ ュ メ ン ト な ど も 紹 介 し て い ま す 。 Python イ ン タ プ リ タ は 、 簡 単 に C/C++ 言 語 な ど で 実 装 さ れ た 関 数 や デ ー タ 型 を 組 み 込 み 、 拡 張 で き ま す 。 ま た 、 ア プ リ ケ ー シ ョ ン の カ ス タ マ イ ズ を 行 う 、 拡 張 言 語 と し て も 適 し て い ま す 。 ご こ の チ ュ ー ト リ ア ル は 、Python 言 語 の 基 本 的 な 概 念 と 機 能 を 、 形 式 ば ら ず に 紹 介 し ま す 。 読 む だ け で は な く 、 Python イ ン タ ー プ リ タ で 実 際 に サ ン プ ル を 実 行 す る と 理 解 が 深 ま り ま す が 、 サ ン プ ル は そ れ ぞ れ 独 立 し て い ま す の で 、 た だ 読 む だ け で も 良 い で し ょ う 。 標 準 オ ブ ジ エ ェ ク ト や モ ジ ュ ー ル の 詳 細 は 、 Python 標 準 ラ イ ブ ラ リ を 参 照 し て く だ さ い 。 ま た 、 正 式 な 言 語 定 義 は 、 Python 言 語 リ フ ァ レ ン ス に あ り ま す 。 C 言 語 や C++ 言 語 で 拡 張 モ ジ ュ ー ル を 書 く な ら 、 Python イ ン タ プ リ タ の 拡 張 と 埋 め 込 み や Python/C APIL リ フ ァ レ ン ス マ ニ ュ ア ル を 参 照 し て く だ さ い 。Python の 解 説 書 ち 販 売 さ れ て い ま す 。
そこそこの精度で文字起こしできていますね!!
この技術を使ってこんなものも作ってみました。
参考


コメント
[…] これを 前回の「画像をテキストに変換する方法」と合わせることで、 […]