[Node.js] GoogleのCloud Translation API v3を触ってみる

  • このエントリーをはてなブックマークに追加
  • LINEで送る

自然言語の翻訳APIに興味が出てきたのでちょっと触ってみることにします。ここではすでにテキスト情報になっており、日本語から英語など別の言語に自動的に変換してくれる物を想定しています。

Google Cloud Translate

Google Cloud Translateサイトより

すでに様々なサービスが世に出ていますが、今回はGoogleの翻訳APIを試してみます。新しいバージョン3(以降v3)ではJava、Python、Node.jsから利用できますが、今回はNode.jsで利用します。

- Sponsored Link -

主要な開発者向け翻訳サービス

現在API形式で提供されており、個人でも触れる物は以下でしょうか。

  1. Google Cloud Translation API
  2. AWS Amazon Translate
  3. Microsoft Azure Translator Text
  4. IBM Watson Language Translator
  5. Yondex Translate API ※ロシアの検索ポータル

法人利用であれば次のような物もあります。

  1. みらい翻訳 Mirai Translator ※NTT系列が主要株主

Google Cloud Translation API概要

料金

詳しくは料金ページに記載してありますが、ざっくり言うとv2はすべて有料、無料枠を使いたいならβ版のv3を利用する必要があります。つまり人柱になれば無料ですw!←

バージョン機能料金
v2翻訳$20/100万文字
v3β翻訳50万文字まで無料、以降は$20/100 万文字

いずれも1ヶ月間の料金です。
100万文字に達しない場合、例えば10万文字使った場合は$2が請求されます。無料にはなりませんのでご注意を。つまり1文字あたりの単価は0.0022円(12月1日時点)となります。
注意点としてv3には翻訳モードがPBMT、NMT、AutoMLの3種類ありPBMTを利用する場合はv2と同様の課金がされます。

まぁ…v2とv3のどちらを使っても個人がお試しで使う分にはよほどヤンチャなことをしなければ無料の範囲内か、料金を支払う場合でもコーヒー1杯分にもならないでしょう。

v2とv3の違い

v3には様々な新機能が追加されているようです。

  1. 用語集」が追加。固有名詞などを予め登録しておくことが出来る。
  2. 一括リクエスト」が追加。大量の文章をバッチ処理で翻訳。
  3. AutoMLモデル」が追加。機械学習で独自に作成したモデルを利用可能に。
  4. 「API KEY」が廃止され「IAM役割」に変更

「IAM役割」はAWSでいうIAMとロールみたいな物ですね。呼び出し方が変わっていることを考えると、将来的に確実に移行する日がやってくるでしょうから、今回はv3で試してみたいと思います。下位互換してくれるなら良いのですがいずれかのタイミングで廃止でしょうかね。

Google Cloud Translation APIを試してみる

クイックスタートの内容に沿って実行してみます。

Googleアカウントを作成、GCPへの登録は事前に済ませています。今回はお試しですが、課金が行える状態にしておく必要があります。クレジットカード情報も事前に登録してあります。

またNode.jsを利用しますので、事前にインストールしておいてください。

プロジェクトの作成

GCPにお試し用のプロジェクトを作成します。
先ほどのクイックスタートのページにある「プロジェクトをセットアップする」ボタンをクリックします。(GCPのコンソールからでも行なえます)

プロジェクト選択画面になりますので、既存のプロジェクトを選択するか、新しいプロジェクト名を入力し「NEXT」ボタンをクリック。

課金の設定が必要だと言われました。文中のリンクをクリックすると新しいウィンドウが開き設定画面が表示されます。

されました。
今回はすでに設定済みだったので、ボタンを押すだけ。まだの方はこのタイミングで行ってください。完了したらウィンドウを閉じて先ほどの画面に戻ります。

先ほどのウィンドウです。「CONTINUE」ボタンをクリック。

このあと利用する「プライベートキー」が記載されたファイルをダウンロードするよう促されますので、ボタンをクリックして保存します。

環境変数の設定

GOOGLE_APPLICATION_CREDENTIALSという名前の環境変数を作成し、先ほどダウンロードしたファイルのパスを設定します。

今回は一時的に利用するだけなので、Terminalに直接コマンドを打ちました。今後も引き続き利用する場合には.bashrc.bash_profileなどに記載します。あ、ここでは横着しましたが基本的に絶対パスで書いてくださいね。

$ export GOOGLE_APPLICATION_CREDENTIALS=~/test-translate-katsube.json

printenvなどで念の為確認を。

$ printenv | grep GOOGLE
GOOGLE_APPLICATION_CREDENTIALS=/Users/katsube/test-translate-katsube.json

Node側を準備

まずはプロジェクトの準備をします。ひとまずnpm initの選択肢はすべてエンターでOKです。package.jsonが生成されたか確認をしておきます。

$ mkdir trans && cd trans
$ npm init
$ ls
package.json

では最後にCloud Translateのモジュールをインストールします。

$ npm install --save @google-cloud/translate

サンプルコードを試してみる…がエラーになる

掲載されていたサンプルほぼそのままです。これで日本語で入力された内容を英語で返してくれるハズ。

//-----------------------------------------------
// 設定
//-----------------------------------------------
const projectId = 'test-translate-k';
const location  = 'global'; // 現在は"global"か"us-central1"のみ
const text      = 'こんにちは!今日も良い天気ですね。';

// いじるのはここまで。以降はサンプルコードのままで動作します。

//-----------------------------------------------
// 実際の処理
//-----------------------------------------------
const {TranslationServiceClient} = require('@google-cloud/translate').v3beta1;

// Instantiates a client
const translationClient = new TranslationServiceClient();
async function translateText() {
  // Construct request
  const request = {
    parent: translationClient.locationPath(projectId, location),
    contents: [text],
    mimeType: 'text/plain', // mime types: text/plain, text/html
    sourceLanguageCode: 'ja-JP',
    targetLanguageCode: 'en-US',
  };

  // Run request
  const [response] = await translationClient.translateText(request);

  for (const translation of response.translations) {
    console.log(`Translation: ${translation.translatedText}`);
  }
}

translateText();

適当なファイルに保存して実行すると、見事にエラーになりました\(^o^)/

$ node index.js
(node:23271) UnhandledPromiseRejectionWarning: Error: 7 PERMISSION_DENIED: Cloud IAM permission 'cloudtranslate.generalModels.predict' denied.
    at Object.callErrorFromStatus (/Users/katsube/Desktop/trans/node_modules/@grpc/grpc-js/build/src/call.js:30:26)
    at Http2CallStream.<anonymous> (/Users/katsube/Desktop/trans/node_modules/@grpc/grpc-js/build/src/client.js:96:33)
    at Http2CallStream.emit (events.js:208:15)
    at /Users/katsube/Desktop/trans/node_modules/@grpc/grpc-js/build/src/call-stream.js:75:22
    at processTicksAndRejections (internal/process/task_queues.js:75:11)
(node:23271) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:23271) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

クイックスタートには掲載されてないのですが、エラー内容から鑑みるにIAMの設定が必要みたいですねw

サービスアカウントにIAM役割を付与する

プロジェクトを作成した際に「サービスアカウント」と呼ばれるプログラムをGCP上で動作させる専用のアカウントが自動的に作成されています。JSONファイルをダウンロードしたと思いますが、あの中身はこのサービスアカウントの認証情報というわけです。で、デフォルトだとこのサービスアカウントに権限が一切付与されていないため、先ほど実行したら弾かれてしまったということのようです。

はい、というわけでドキュメントの内容に従って、サービスアカウントさんに権限を付与していきます。今回はWebの管理画面(コンソール)からサクッといきます。

GCPのコンソールにログインし、プロジェクトを選択したら左側のメニューから「IAMと管理」→「アービスアカウント」とたどります。

サービスアカウントの一覧が表示されるので「メールアドレス」の部分をクリップボードへコピーします。このメールアドレスはGoogleが機械的に作成した物です。

左メニューの「IAM」をクリックし、ユーザー一覧を表示します。上部にある「追加」ボタンをクリック。

先ほどのサービスアカウントのメールアドレスをペーストし、権限(役割)を選択します。ここでは「CloudTranslationAPIユーザー」を選択。最後に「保存」ボタンをクリック。

先ほどのユーザー一覧にサービスアカウントが加わっていれば成功です。

再び実行する

・::・:┣¨キ(゚Д゚)┣¨キ:・::・

$ node index.js
Translation: Hello! It ’s good weather today.

キタ━(゚∀゚)━!

参考ページ

- Sponsored Link -

ご質問やリクエストなどお気軽に。メールアドレスの入力は任意です。書き込みが反映されるまで時間がかかります。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください