[PHP]Google Cloud Vision APIを使用して画像のラベルを取得し日本語に翻訳する方法
Google Cloud Vision APIを使用することで画像がどのような画像なのかというラベルを取得することができる。残念ながら返り値が英語なのでGoogle Cloud Translate APIで日本語化する
目次
Composerでライブラリをインストール
composer require google/apiclient composer require google/cloud-translate
を実行してライブラリをダウンロードする
実行した場所に/vendorというフォルダができるので、これらのライブラリを実行するPHPプログラムの近くに配置したほうがよい。
コマンドが変わる可能性があるので、公式を参照すること↓
VISION API↓
https://cloud.google.com/vision/docs/libraries#client-libraries-install-php
Translate API↓
https://cloud.google.com/translate/docs/setup
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を有効化する
Translate APIを有効化する
https://console.cloud.google.com/flows/enableapi?apiid=translate.googleapis.com
に移動し、Translate APIを有効化する
サービスアカウントキーを生成・取得
https://console.cloud.google.com/apis/credentials/serviceaccountkey
を開くとサービスアカウントキー画面に移動する
*プロジェクトは作成済みとしている。
上図のように入力
- サービスアカウント=新しいサービスアカウント
- アカウント名=任意
- ロール=不要
- サービスアカウントID=自動で作成される
- キータイプ=JSON
で作成を押下する
ロールがないという警告メッセージが表示されるが問題なし。
作成するとJSONファイルがダウンロードされるのでサーバ上に配置する。PHPプログラムから参照しやすいところがよい。
サーバ上ではGOOGLE_APPLICATION_CREDENTIALS変数は設定しなくてよい
VISON APIの公式ページには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; use Google\Cloud\Translate\TranslateClient; $imagePath = "画像のパス(URLでも可)"; $translate = new TranslateClient(); $targetLanguage = "ja"; //日本語に翻訳 $imageAnnotator = new ImageAnnotatorClient(); $fileName = $imagePath; $image = file_get_contents($fileName); $response = $imageAnnotator->labelDetection($image); $labels = $response->getLabelAnnotations(); if ($labels) { foreach ($labels as $label) { //ラベルを逐次翻訳 $translated = $translate->translate($label->getDescription(), [ 'target' => $targetLanguage, ]); //文字列がほしかったので「、」をつけて追加していっている $result .= $translated['text']."、"; } } else { $result = "ラベルなし"; } echo $result;
公式のサンプルコードはこちら
https://cloud.google.com/vision/docs/ocr
感想
ラベルは拾ってくれるは拾ってくれるが、なかなかこちらが想定している細かいラベリングではないので、使用を断念している。