[PHP]Google Cloud Vision APIを使用して画像のテキスト情報を抽出する方法
Google Cloud Vision APIは画像をAPIに処理させ、画像の中のテキストや画像にある物体の種類などをJSONなどで受け取ることができるサービス
ここではPHPを使用してGoogle Cloud Vision APIを使用して画像のテキスト情報を抽出する方法を記述する
目次
Composerでライブラリをインストール
composer require google/apiclient
を実行してライブラリをダウンロードする
実行した場所に/vendorというフォルダができるので、これらのライブラリを実行するPHPプログラムの近くに配置したほうがよい。
コマンドが変わる可能性があるので、公式を参照すること↓
https://cloud.google.com/vision/docs/libraries#client-libraries-install-php
Google Cloud Consoleでの作業
プロジェクトを作成する
https://console.cloud.google.com/projectselector2/home/dashboard
に移動し、プロジェクトを作成する。課金も有効にしておくこと
VISON APIを有効化する
https://console.cloud.google.com/flows/enableapi?apiid=vision.googleapis.com
に移動し、VISON APIを有効化する
サービスアカウントキーを生成・取得
https://console.cloud.google.com/apis/credentials/serviceaccountkey
を開くとサービスアカウントキー画面に移動する
*プロジェクトは作成済みとしている。
上図のように入力
- サービスアカウント=新しいサービスアカウント
- アカウント名=任意
- ロール=不要
- サービスアカウントID=自動で作成される
- キータイプ=JSON
で作成を押下する
ロールがないという警告メッセージが表示されるが問題なし。
作成するとJSONファイルがダウンロードされるのでサーバ上に配置する。PHPプログラムから参照しやすいところがよい。
サーバ上ではGOOGLE_APPLICATION_CREDENTIALS変数は設定しなくてよい
公式ページにはGOOGLE_APPLICATION_CREDENTIALS変数をサーバ上に設定するとよいと書かれているが、Google Cloud Vision APIではうまく動作せず
Fatal error: Uncaught DomainException: Could not load the default credentials.
というエラーが出てしまうので、プログラムの中でGOOGLE_APPLICATION_CREDENTIALS変数を設定するようにしている
PHPプログラムの作成
//authエラー回避に変数を書いておく putenv('GOOGLE_APPLICATION_CREDENTIALS='.__DIR__ . '/xxxxx.json'); require_once ( __DIR__ . '/vendor/autoload.php'); use Google\Cloud\Vision\V1\ImageAnnotatorClient; $imagePath = "画像のパス(URLでも可能)"; $imageAnnotator = new ImageAnnotatorClient(); $image = file_get_contents($imagePath); $response = $imageAnnotator->textDetection($image); $texts = $response->getTextAnnotations(); foreach ($texts as $text) { unset($result); $result = $text->getDescription(); //整形、日本語ではよく「〜」が半角チルダになっているので $result = trim($result); $result = preg_replace("/\~/", "ー", $result ); $result = str_replace(array("\r\n","\r","\n"), '', $result); $resultArr[] = $result; } //返り値が結構バラバラなので文字数が多い順に並び替え array_multisort( array_map( "strlen", $resultArr ), SORT_DESC, $resultArr ) ; $imageAnnotator->close(); //最も長い文字列だけを取得 echo $resultArr[0];
1つの画像でも複数の返り値が帰ってくるので、最も長い文字を選択するようにしている。
公式のサンプルコードはこちら
https://cloud.google.com/vision/docs/ocr
感想
なかなか細かく拾ってくれるが、縦読みが読めなかったりする
日本語よりも英語の識字率の方が高い。結構小さな文字も読み込んでくれていて以外な文章を発見してくれたりもする