画像内の英文を和訳するPythonスクリプトを作りました

# はじめに
全く読めないわけではないのですが，英語を読むのが非常に遅いので，画像内英文の和訳を自動化したいなと思い，そのために，Pythonを用いることにしました．python2を使いましたが，python3でも動くと思います．入力画像はpng,jpgで動作確認しました．

また、本スクリプトをFlaskを用いてWebアプリにしたものが[こちら](ysuzuki.pythonanywhere.com)です。無料枠なので激重だし、ページもHTMLオンリーなので殺伐としています。

実行環境は以下です．

```plaintext
macOS Mojave 10.14.5
Python 2.7.16
tesseract 4.0.0 ($ tesseract --versionの出力)
PIL 6.0.0     (>>PIL.PILLOW.VERSIONの出力)
pyocr 0.5.0 (>>pyocr.VERSIONの出力)
googletrans 2.4.0 (>>googletrans.__version__の出力)
```

# 環境構築
Macの場合は以下で実行環境が整う．

```sh:setup.sh
brew install python
brew install tesseract
pip install Pillow
pip install pyocr
pip install googletrans
```

ubuntuの場合はこちら(多分)．

```sh:setup.sh
sudo apt install python
sudo apt install python-pip
sudo apt install tesseract
sudo pip install Pillow
sudo pip install pyocr
sudo pip install googletrans
```

# 完成したスクリプト
各公式ドキュメントのサンプルコードからスクリプトを持ってきて少し変更するだけでできた．

```py:picen2jp.py
# coding: utf-8
from PIL import Image
import sys
args = sys.argv
import pyocr
import pyocr.builders
from googletrans import Translator

tools = pyocr.get_available_tools()
if len(tools) == 0:
    sys.exit(1)
tool = tools[0]

langs = tool.get_available_languages()
lang = langs[0]

txt = tool.image_to_string(
    Image.open(args[1]),
    lang=lang,
    builder=pyocr.builders.TextBuilder()
)
translator = Translator()
translated = translator.translate(txt, src='en', dest='ja')

print('-------------------和訳-------------------------------------------')
print(translated.text)
print('------------------------------------------------------------------')
```

## 実行結果
あらかじめ英文を入力したファイルをスクリーンショットとして保存した．
<img width="569" alt="スクリーンショット 2019-06-09 3.11.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282145/c6e98b52-f984-d11e-eb53-3b218dbd7cf5.png">
この画像名を引数として先ほどのスクリプトを実行すると，
<img width="556" alt="スクリーンショット 2019-06-09 3.15.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282145/9d62ae8f-bcd8-4298-fafe-aecfa617884a.png">
のように英語を日本語に翻訳できた．
<font color="Red">こんにちは世界・・・</font>．

# 使用ライブラリ
それぞれのライブラリの公式ドキュメントの説明を，上で載せたスクリプトで和訳をしてみた．
## Pillow(Python Imaging Library)
[こちら](https://github.com/python-pillow/Pillow)の
<img width="706" alt="スクリーンショット 2019-06-09 0.33.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282145/cfd69109-fdd1-069e-2a8b-7e249bd5bacb.png">
によると，

```bash:Pillowの文章画像の和訳
$ python pic2jap.py スクリーンショット* 
-------------------和訳-------------------------------------------
エース

Pythonイメージングライブラリ（フォーク）

枕はアレックスクラークと貢献者によるフレンドリーなPILフォークです。 PILはFredrik LundhによるPython Imaging Libraryです。
貢献者2019年現在、枕の開発はTideliftによってサポートされています。
------------------------------------------------------------------
```

若干文章が崩れているが，英文も見つつなら読み取れる．`Pillow`が枕(pillow talkのpillow)になっているようだ．`エース`は謎である．

## pyocr(py optical character recognition)
[こちら](https://gitlab.gnome.org/World/OpenPaperwork/pyocr)
<img width="906" alt="スクリーンショット 2019-06-09 2.11.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282145/3367e9d9-cab9-ed36-293a-9e095162f795.png">
によると，

```py:pyocrの文章画像の和訳
$ python picen2jp.py スクリー*
-------------------和訳-------------------------------------------
AV、O1 0754

PyOCRはpython用の光学式文字認識（OCR）ツールラッパーです。つまり、PythonプログラムからさまざまなOCRツールを使用するのに役立ちます。

GNU / Linuxシステム上でのみテストされています。同様のシステム（* BSDなど）でも動作するはずです。 Windowsでは動作するかもしれませんし、しないかもしれません、
MacOSxなど
------------------------------------------------------------------
```
とのこと．pyocrを用いるとOCRツールを使えるようになる．

>It may or may not work on Windows, MacOSX, etc

とあり，Macで実行したが無事動作した．

## googletrans
[こちら](https://pypi.org/project/googletrans/)の
<img width="757" alt="スクリーンショット 2019-06-09 2.09.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282145/84018eb2-ffb7-8807-9442-9c940bbf82a5.png">
によると，

```bash:googletransの文章画像の和訳
$ python picen2jp.py スクリー*
-------------------和訳-------------------------------------------
Googletransは、Google Translate APIを実装した無料で無制限のpythonライブラリです。これは
Google Translate Ajax API。検出や変換などのメソッドを呼び出す。

Python 2.7以降および3.4​​以降と互換性があります。 （注：次のメジャーリリースではPython 2のサポートは中止される予定です。）

詳細はAPを参照してください。ドキュメンテーション。
------------------------------------------------------------------
```

とのこと．Google Translate APIをpythonで使えるようにするライブラリである．

>Note: Python 2 support will be dropped in the next major release.

Python3でやればよかった・・・

最後のAPIがAPになってしまっていた．

# 解説
`# coding: utf-8`によって，ターミナル出力で日本語を使えるようになる．

`args = sys.argv`でコマンドライン引数を取得できるようにする．

`txt`には画像から抽出した英文が入っているため，そちらを確認したい場合は，`print(txt)`とするとよい．

`translator.translate(txt, src='en', dest='ja')`で翻訳をする．ここで，`src`は入力言語，`dest`は出力言語とのこと．

`print(translated.text)`翻訳後のテキストを出力する．

# おわりに
スクリーンショットにする時点での改行によって少し文章が変になってしまっていますが，なかなか便利なスクリプトができたのではないでしょうか！

また，実際に自分で書いたのは少しだけなのにちゃんと動くものができるという事に感動するとともに，便利なライブラリを公開してくれている人に感謝しました．

ちなみに，スクリーンショットを撮ってすぐに翻訳して削除する場合は，

```py:追加
import os
...
os.system('rm ' + args[1].replace(' ', '\ '))
```

とすると良いです．<font color="Red">入力ファイル名を間違えると意図しないファイルが消えてしまうので，使用する場合は自己責任でお願いします</font>．

# 参考
- https://gitlab.gnome.org/World/OpenPaperwork/pyocr
    - pyocr(py optical character recognition)について・文字抽出のサンプルスクリプト
- https://pillow.readthedocs.io/en/latest/installation.html
    - Pillow(Python Imaging Library)について・導入方法
- https://pypi.org/project/googletrans/
    - googletransについて・導入方法・翻訳のサンプルスクリプト
- https://github.com/tesseract-ocr/tesseract
    - tesseractについて
- https://formulae.brew.sh/formula/tesseract
    - tesseract導入方法
- https://techacademy.jp/magazine/18784
    - 出力で日本語を用いる方法