写真から文字を認識して、それを翻訳するLINE botです。海外で看板の英文が読めなかったり、手渡された英文のドキュメントが読めない時に、役に立つと思います。くれぐれも英語のテストとかに悪用しないようにしてください。
LINE BOTの完成形の動作(動画)
動画では、英文を写真で撮って、LINE BOTに投稿すると翻訳して返信が来る様子を見ることができます。
今回はこのような動作をするLINE BOTを作成します。
文字認識の実力とは。。
どれくらいの精度があるのかと?と気になると思います。試しに、TOEICの問題集を写真に撮って、LINE botに送ってみました。
英文がわかりやすいものであれば、概ね内容が掴めるほどの精度を得ることができました。
サーバーやAPIを使用するための事前登録
PythonでLINEのBOTを作成するには、以下のように事前登録が必要になります。
①LINE Developerの登録
チャンネルアクセストークンとシークレットキーを入手し、Pythonプログラムからメッセージを送るためのAPIを使用できるようにします。
②Herokuの登録
サーバーはHerokuを使用します。Herokuサーバー上でFlaskのWebアプリケーション(Pythonプログラム)を動作させ、LINEからのメッセージが来た時に翻訳して返答します。
これらの登録方法の詳細については、以下の記事を参照して行ってください。
-
-
Pythonで作る竈門炭治郎のLINE BOT
こんな方におすすめ PythonでLINE BOTを作りたい LINEでメッセージに応じた自動応答をやってみたい LINE BOTの作り方についてです。まずはコピーして作成してみて、動いたら自分なりに ...
③Google Cloud Platformの登録
言語の翻訳には、Google Cloud Platformの Translate APIを使用します。以下のページで、Google text to speechのAPIの使い方を説明していますので、同様に、Translateも登録してみてください。従量課金制ですが、500,000文字までは、無料となってますので、しばらくは充分だと思います。
-
-
Google text to speech をPythonで実行!
こんな方におすすめ Google text to speechについて知りたい Google text to speechを使いたい Google text to speech をPythonで動かし ...
プログラムの内容(main.py)
Pythonのプログラムのソースコードの内容です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# インポートするライブラリ import os import re from flask import Flask, request, abort from google.cloud import translate_v2 as translate from linebot import ( LineBotApi, WebhookHandler ) from linebot.exceptions import ( InvalidSignatureError ) from linebot.models import ( MessageEvent, TextMessage, TextSendMessage, ImageMessage,ImageSendMessage ) from PIL import Image import sys import pyocr import pyocr.builders import pytesseract translate_client = translate.Client() # 軽量なウェブアプリケーションフレームワーク:Flask app = Flask(__name__) #環境変数からLINE Access Tokenを設定 LINE_CHANNEL_ACCESS_TOKEN = "xxxxxxxxxx" #環境変数からLINE Channel Secretを設定 LINE_CHANNEL_SECRET = "xxxxxxx" line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN) handler = WebhookHandler(LINE_CHANNEL_SECRET) @app.route("/callback", methods=['POST']) def callback(): # get X-Line-Signature header value signature = request.headers['X-Line-Signature'] # get request body as text body = request.get_data(as_text=True) app.logger.info("Request body: " + body) # handle webhook body try: handler.handle(body, signature) except InvalidSignatureError: abort(400) return 'OK' # MessageEvent @handler.add(MessageEvent, message=ImageMessage) def handle_image_message(event): message_content = line_bot_api.get_message_content(event.message.id) #staticフォルダの下にid名で画像データを保存します。 with open(f"static/{event.message.id}.jpg", "wb") as f: for chunk in message_content.iter_content(): f.write(chunk) #test_url = f"https://xxxxxxx(自分のherokuのアプリ名).herokuapp.com/static/" + event.message.id + ".jpg" im=Image.open(f'./static/{event.message.id}.jpg') im.save(f'./static/{event.message.id}.jpg') #pytesseractを用いて画像から文字を取り出し"t"という変数に入れます。 pytesseract.pytesseract.tesseract_cmd = '/app/.apt/usr/bin/tesseract' image=Image.open(f'./static/{event.message.id}.jpg') t = pytesseract.image_to_string(image) #tを日本語に翻訳します。 message_orig = translate_client.translate(t, target_language='ja') transmessage = message_orig['translatedText'] #翻訳した文をLINEに送ります。 line_bot_api.reply_message(event.reply_token, TextSendMessage(text=transmessage)) if __name__ == "__main__": port = int(os.getenv("PORT",5000)) app.run(host="0.0.0.0", port=port) |
設定ファイルの作り方
以下、4つの設定ファイルの作成が必要になります。これらは、main.pyと同じフォルダに置く必要があります。
- runtime.txt →Pythonのバージョンを記載を記載する
1 |
python-3.6.10 |
- requirements.txt →インストールするライブラリの記載する
1 2 3 4 5 6 |
Flask==0.12.2 line-bot-sdk==1.17.0 google-cloud-translate==2.0.1 pytesseract==0.3.6 pyocr==0.7.2 Pillow==7.2.0 |
- Procfile →プログラムの実行方法を定義する。(.txtなし)
1 |
web: python main.py |
- xxxxxxxx.json →Google Cloud PlatformのTranslate APIを使用するためのjsonファイルを同一フォルダにおきます。
- Aptfileを作成し、以下を記載します。
1 2 3 |
tesseract-ocr tesseract-ocr-eng tesseract-ocr\ntesseract-ocr-eng |
- xxxxxxxx.json →Google Cloud PlatformのTranslate APIを使用するためのjsonファイルを同一フォルダにおきます。
デプロイする
Herokuのビルドパックにheroku-buildpack-aptを追加します。
1 |
heroku buildpacks:add --index 1 https://github.com/heroku/heroku-buildpack-apt |
以下のコマンドをターミナルから順に実行します。
1 2 3 4 5 6 7 8 9 |
$ git init $ heroku git:remote -a (自分で決めたアプリ名) $ git add . $ git commit -m "inital commit" $ git push heroku master |
環境変数を設定します。LINEのMessaging APIのチャンネルアクセストークンとチャンネルシークレットキーを入れます。また、Google Cloud PlartformのTranlate APIを使用するための秘密ーも入力します。TESSDATA_PREFIXという名前のheroku構成変数を設定します。
1 2 3 4 |
$ heroku config:set LINE_CHANNEL_ACCESS_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXX $ heroku config:set LINE_CHANNEL_SECRET=XXXXXXXXXXXXXXXXXXXXX $ heroku config:set GOOGLE_APPLICATION_CREDENTIALS=xxxxxx.json $ heroku config:set TESSDATA_PREFIX=/app/.apt/usr/share/tesseract-ocr/4.00/tessdata |
以上でデプロイが完了します。
動作しないときの対処法
設定が完了したのに正しく動作しないようなときは、ターミナルから以下のコマンドを実行しエラーが出ていないか確認してください。エラーが出た場合は、そのエラーの指示に従って、プログラムを修正してください。
1 |
$ heroku logs --tail |
まとめ
画像から文字を認識し、翻訳してLINEに返信するBOTを作成しました。このBOTはOCRの文字認識、Google Plat formの翻訳機能、herokuのサーバーなどを利用しているため、多くのことを学ぶことができます。また英語から日本語だけではなく、多くの言語に応用してみるのも良いと思います。ぜひチャレンジしてくみてください。