Google Docs API & Google Drive APIで文字認識

## はじめに

手書きで書いた文章やテキストデータが埋め込まれていない謎のpdfをテキストデータにして保存しておきたいなぁと思ったことはありませんか？
Google Docsには光学文字認識(OCR)機能があり、画像をGoogle docsとして開くと自動で画像中の文字を認識して、docs内に埋め込んでくれます。

![drive.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268516/3a2e4b55-27be-6d38-7ba6-8dba8683a395.jpeg)
![docs.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268516/f6ffee7f-ed6d-d6ac-e071-f5ce43dd4b73.jpeg)


かなり精度も高く便利ではあるのですが、テキストを読み出すためにいちいちGoogle Driveにファイルを上げてGoogle Docsで開いて……とするのは面倒です。
[Google Vision API](https://cloud.google.com/vision/?hl=ja&utm_source=google&utm_medium=cpc&utm_campaign=japac-JP-all-ja-dr-bkws-all-all-trial-e-dr-1009882&utm_content=text-ad-none-none-DEV_c-CRE_540693676944-ADGP_Hybrid%20%7C%20BKWS%20-%20EXA%20%7C%20Txt%20~%20AI%20%26%20ML%20~%20Vision%20AI_Vision-OCR-en-KWID_43700035494672011-aud-970366092687%3Akwd-316837066534&userloc_1009487-network_g&utm_term=KW_google%20vision%20api%20ocr&gclid=Cj0KCQiAzMGNBhCyARIsANpUkzMqNDk_chTQGW2U8IqID52111_C0-lStsvjZhBQ-5vrmfSim08faVUaAuwcEALw_wcB&gclsrc=aw.ds)の方ではOCR機能が提供されているのですが、こちらは有料らしいのであまり使いたくないです。
なのでこれら一連の操作をラップしたクラスを作りました。

https://github.com/ugis70194/GoogleAPI.py

## 使い方

```py
from googleAPI import GoogleAPI

googleAPI = GoogleAPI(drive_token_path='./auth_keys/drive/token.json', docs_token_path='./auth_keys/docs/token.json',
                drive_credentials_path='./auth_keys/drive/credentials.json', docs_credentials_path='./auth_keys/docs/credentials.json')
print(googleAPI.OCR("./text.jpg"))

```
基本的には`OCR()`に読み込みたいファイルのパスを渡すだけです。結果が返ってくるまでにはちょっと時間がかかります。

ここで、tokenはAPIへのアクセストークンでcredentialsはOAuth2.0クライアントIDです。
取得方法については[README](https://github.com/ugis70194/GoogleAPI.py/blob/main/README.md)にサラっと書いておいたのでそちらを参照頂けると幸いです。

## 使用例
例のテキストには外郎売の冒頭を使用しました。

### 1. 綺麗なテキスト

![puretext.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268516/926bc40e-170c-2b9a-909e-e0f70af84649.jpeg)

#### 結果
```
拙者親方と申すは、御立会の内に御存知の御方も御座りましょうが、御江戸を発って二十里上方、相州小田原一色町を御過ぎなされて、青物町を上りへ御出でなさるれば、欄干橋虎屋藤右衛門、只今では剃髪致して圓斎と名乗りまする。
puretext error: 0
```
誤認識0です。かなり精度がいいですね。

### 2. ぼやけたテキスト

![blur.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268516/0dae1380-2247-6b94-3216-d55fc8cea0a7.jpeg)
ちょっとぼやけていますが、人間なら問題なく読める範囲です。

#### 結果
```
拙者親方と申すは、御立会の内に御存知の御方も御座りましょうが、御江戸を発って二十里上方、相州小田原一色町を御過ぎなされて、青物町を上りへ御出でなさるれば、欄干橋虎屋藤右衛門、只今では剃髪致してこ斎と名乗りまする。
blur error: 1
```
`圓`が`こ`と誤認識されてしまっています。
欄`の方が読みにくいと思いますが、旧字体はデータが少ないとかあるんでしょうか？

### 3. 拡大してノイズが乗ったテキスト

![coarse.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268516/82e70cec-76d9-686d-a8ae-4f1b05ad0541.jpeg)
こういう画像は結構多そうです。

#### 結果
```
者親方と申すは、御立会の内に御存知の御方も御座りましょうが、御江戸を発って二十里上方、相州小田原一色町を御過ぎなされて、青物町を上りへ御出でなさるれば、欄干橋虎屋藤右衛門、只今では剃髪致して画家と名乗りまする。
coarse error: 2
```

`圓斎`が`画家`と誤認識されてしまっています。そうはならんやろ。

### 4. pdf

![pdf.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268516/b74deebe-c03e-85dd-afcd-2069c80dd5bb.jpeg)
pdfは張れなかったのでスクショです。

#### 結果
```
拙者親方と申すは、御立会の内に御存知の御方も御座りましょうが、御江戸を発って二十里上方、相州小田原一色町を御過ぎなされて、青物町を上りへ御出でなさるれば、欄干橋虎屋藤右衛門、只今では剃髪致して圓斎と名乗りまする。
pdf error: 0
```
完璧です。

### 5. 手書き文字

![hand.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268516/f4c5b7d0-7350-fb61-d91c-8bdde65e2a42.jpeg)


#### 結果
```
手書手文字美女车
```
手書き文字の認識精度はあまり高くないみたいです。ひらがなが読み取られていないあたり、中国語として認識されていそうな気がします。

### おわりに
手書き文字の認識精度はあまり高くないようですが、テキスト画像は高い精度で認識できるようです。
また、今回は試していませんが、プリントをスキャンしたpdfなんかもそこそこの精度で認識できると思います。良ければ使ってみてください。