[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

 

感想

ラベルは拾ってくれるは拾ってくれるが、なかなかこちらが想定している細かいラベリングではないので、使用を断念している。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です