Cloud Translation API

GCPのCloud Translation APIをPHPで動かしてみる

TranslationAPI-アイキャッチ

こんにちは!ゆーたろうです。

先日、輸入物販をしている知り合いから、日本住所の変換アプリを作ってほしいとお話をいただいたので、Google翻訳のAPIを使って動かしてみることにしました。

今回もいろいろ手探りで進めたので、備忘録を兼ねて紹介していこうと思います。

日本住所の英語変換サイトはすでにいくつかある

今回、アプリ作成に伴って、いくつかのサイトで調べてみました。

どのサイトもかなり実用的で使いやすいですね。

恐らくご存知だとは思いますが、以下に載せておきます。

エキサイト翻訳のAPIはうまく使えず住所変換できなかった

個人的には、なるべく無料で開発したかったので、エキサイト翻訳がいいなと思い、調べてみました。

これらを使ってPHPやCURLでできないかトライしてみたのですが、うまく行きませんでした。

具体的には、CURLリクエストを出してみると「ページが見つかりません」となったりしました。

リクエストを出してみたCURL:

https://www.excite.co.jp/world/english/parameters=&before=hello&wb_lp=JAEN

https://www.excite.co.jp/world/english/before=hello&wb_lp=ENJA

結果:

エキサイト翻訳-ページが見つかりません

追記:通常の翻訳APIだったらリクエストURLを作ることができた

いろいろいじっていたら、「?」をつけることでうまく行きました。

リクエストURL:

https://www.excite.co.jp/world/english/?before=hello&wb_lp=ENJA

結果:

エキサイト翻訳-API-通常-成功

後はPHPで言えば、file_get_contents()で必要な個所をピックアップしていけば、翻訳結果だけを抽出する処理はできますね。

しかし、通常の翻訳では、住所変換がうまく行かず、住所変換用APIも作ることができませんでした。

そのため、Google Cloud PlatformのCloud Translation APIを使うことにしました。

Cloud Translation APIの料金

※Cloud Translation APIとは何か?は他のサイトでたくさんあるのでそちらをご確認ください。

さて、GoogleのAPIを使うことにしたのですが、懸念点が一つ。

料金体制です。

― CATEGORY ―Vision API

でもGoogleAPIを使ったプログラミングをしましたが、やはりいくら使ったらいくら掛かるのは、とても気になります。

調べたら、1文字0.0022円ということでした。

参考:GoogleのCloud Translation API v3を触ってみる

依頼主の稼働環境でかかる料金を、一応計算してみました。

1日50リクエスト×1回100文字×1か月=約15万文字

V2バージョンのプランで言えば、220円/10万文字なので、この式から言えば約330円/月ですね。

全然負担ではなさそうですので、このAPIで開発を進めようと思います。

PHPで実装:失敗-Gitのプログラムが動かない

Vision APIとは違い、公式にPHPのサンプルプログラムが見当たらなかったでGitから持ってきました。

Google Cloud Translate API Samples

これを回答してサーバに置きます。

Composerを入れ、php-docs-samples-master/translate/src/translate.phpを動かしたところ、このようなエラーが出ました。

失敗1:公式GitにあるソースコードにはAPIキー設定個所がなかった

■ソースコード

<?php
// Include Google Cloud dependendencies using Composer
require_once __DIR__ . '/../vendor/autoload.php';


// [START translate_translate_text]
use Google\Cloud\Translate\TranslateClient;

/** Uncomment and populate these variables in your code */
 $text = 'The text to translate.';
 $targetLanguage = 'ja';  // Language to translate to


try{
	$translate = new TranslateClient();
	$result = $translate->translate($text, [
    'target' => $targetLanguage
	]);
}catch (Exception $e){
	echo $e;
}


print("Source language: $result\n");
print("Translation: $result\n");
// [END translate_translate_text]

■エラー内容

Google\Cloud\Core\Exception\ServiceException:
{ “error”:
 { “code”: 403,
  ”message”: “The request is missing a valid API key.”,
  ”errors”:
   [
    { “message”: “The request is missing a valid API key.”,
    ”domain”: “global”,
    ”reason”: “forbidden”
    }
    ],
   “status”: “PERMISSION_DENIED”
 }

これは、APIキーが設定されていなかったためのようですね。

PHP(Laravel5.x)でGoogle Cloud Translation APIを実行する(単文・複数文)

こちらを参考にして、APIキーが足りないことが分かったので、入れてみました。

失敗2:APIキーがどれか分からなかった

■ソースコード

<?php
// Include Google Cloud dependendencies using Composer
require_once __DIR__ . '/../vendor/autoload.php';

// [START translate_translate_text]
use Google\Cloud\Translate\TranslateClient;

/** Uncomment and populate these variables in your code */
 $text = 'The text to translate.';
 $targetLanguage = 'ja';  // Language to translate to

$api_key = 'xxxxxx';

try{
	$translate = new TranslateClient(['key' => $api_key]);
	$result = $translate->translate($text, [
	    'target' => $targetLanguage
	]);
}catch (Exception $e){
	echo $e;
}


print("Source language: $result\n");
print("Translation: $result\n");
// [END translate_translate_text]

■エラー内容

Google\Cloud\Core\Exception\BadRequestException:
{ “error”:
 {
  ”code”: 400,
  ”message”: “API key not valid. Please pass a valid API key.”,
  ”errors”:
  [
  { “message”: “API key not valid. Please pass a valid API key.”,
   ”domain”: “global”,
   ”reason”: “badRequest”
  }
  ],
  ”status”: “INVALID_ARGUMENT”
 }

今度は、APIキーが違うといわれました。

一応、GCPのCloud Translation APIからダウンロードされたcredential.jsonに書かれているキーを全通り設定してみたのですが、400エラーが解決できませんでした。。なんと。。

どうするのが正解なのかと探していたら、こんなサイトを見つけました。

Translation API でテキストを翻訳する

すごくいいサイトではないですか!

ポチポチ操作していくだけで、リクエストURLが作れるなんて素晴らしいです。

早速やってみました。

Translation API でテキストを翻訳する

基本的には、Translation API でテキストを翻訳するのサイトを見ながら進めるだけでいけますが、せっかくなので補足を残していきます。

1章と2章はサイトの説明通りに進められたので特記事項はありません。

3. Translation API を有効にする項目で、機能を有効にする必要があります。

「三」を押して「APIとサービス」>「ダッシュボード」に進みます。

GCPダッシュボード画面

※ログインしている状態であれば、以下のリンクから飛べます。

https://console.cloud.google.com/apis/dashboard?hl=ja&project=cloud-translation-transaddress&show=all

次に、「Cloud Translation API」と検索して、「APIを有効にする」を押します。

※下記画像は「すでに有効にした後」の表示ですので、ご注意ください。

GCP-Translation有効

次は「4. Cloud Shell をアクティブ化する」項目です。

ヘッダー バーの右にある [Google Cloud Shell を有効にする] アイコンをクリックして、Cloud Shell を起動します。

とあったのですが、場所が分からなかったので、補足しておきます。

GCP-シェルターミナル画面

この流れで、shell ターミナルを出すことができました。

次に「5. API キーを作成する」です。

下記の順で進むと、APIキー作成画面に遷移できました。

GCP-APIキー作成画面

最後に、下記のような画面が出て、黒枠にAPIキーが表示されるので、完成です。

GCP-APIキー作成完了

URLでリクエストを出す際には必ずこのキーが必要になるので、忘れないように、かつ、漏洩しないように注意してください。

リクエストURLで、翻訳してみる

URL形式でリクエストを出す際のフォーマットは以下の通りです。

https://translation.googleapis.com/language/translate/v2?target={①}&key={②}&q={③}

  • ①:変換先の言語を指定します。日本語なら「ja」英語なら「en」を指定します。
  • ②:上の項目で設定したAPIキーを指定します。
  • ③「UTF-8」でエンコードした文字列を指定します。(日本語原文ではないので注意してください。)

③のエンコードには、下記のサイトを使うと便利です。

URL エンコード(符号化)/デコード(復号)ツール= UTF-8 =

例えば、「吾輩は猫である。猫は可愛い。故に、吾輩は可愛い。」を英語変換する場合は、このようになります。

google-cloud-platform-example-translate

これをURLリクエスト形式にすると、以下のようになります。

※APIキーは各自のものに置き換えることを忘れずに。

https://translation.googleapis.com/language/translate/v2?target=en&key={APIキー}&q=%E5%90%BE%E8%BC%A9%E3%81%AF%E7%8C%AB%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E7%8C%AB%E3%81%AF%E5%8F%AF%E6%84%9B%E3%81%84%E3%80%82%E6%95%85%E3%81%AB%E3%80%81%E5%90%BE%E8%BC%A9%E3%81%AF%E5%8F%AF%E6%84%9B%E3%81%84%E3%80%82

実行結果

取得結果がこちらです。

{
  "data": {
    "translations": [
      {
        "translatedText": "I am a cat. Cats are cute. Therefore, I am cute.",
        "detectedSourceLanguage": "ja"
      }
    ]
  }
}

ちゃんと翻訳されていますね。

ちょっとここで、Google翻訳サイトとの差異を見たくなったので、比較してみました。

Google翻訳サイトで翻訳した結果

まぁ当然っちゃあ当然でしょうが、同じ結果だったので、よかったです。

まとめ

いかがだったでしょうか。

最初の設定こそ、慣れないと手こずる部分も多いですが、慣れてしまえば、単にリクエスト構文を整えてURLにアクセスするだけなので、とっても簡単に実装まで漕ぎ着けられます。

Google Cloud Platform(=GCP)で提供されているAPIはまだまだ他にもたくさんあるので、いろいろ試しながら自身のアプリケーションに取り入れていきたいですね。

GUもVision APIを使ってコーデアプリをリリースしていたり、デンソーの部品生産管理システムもこのGCPが使われていたりと、Translation API以外でも益々Google社のツールは浸透していきそうですね。