AndroidからGoogle翻訳APIを利用する


Google翻訳は、Googleが無料で提供している翻訳サービスです。
Google翻訳からはAPIが公開されており、開発者はこのAPIを利用することで簡単に翻訳機能をアプリケーションに組み込むことができます。
今回は、AndroidアプリケーションからこのGoogle翻訳APIを利用する方法について解説したいと思います。

翻訳APIは、特定のURLに対して決められたフォーマットでリクエストを送信することで利用できます。
翻訳APIを利用するポイントは以下の点です
・指定のURLに対してHTTPリクエスト(GET)を行う
・HTTPレスポンスを受け取る
・HTTPレスポンスの中身(JSON)を解析する

翻訳APIでは利用できる言語が限られており、利用できる言語を調べるためのAPIも用意されているので、それについても解説します。

また、今回はGoogleのAPIキーを必要とします。APIキーの取得方法については、以下の記事を参考にしてください。
Google App EngineでURL短縮サービスAPIを利用する

※2013/02/06 追記※
Google翻訳APIは有償に変更されました。
100万文字あたり20$の課金が必要です。ご注意ください。
https://developers.google.com/translate/v2/pricing?hl=ja

 

それでは続きから詳細をどうぞ

Google翻訳の概要

まずはGoogle翻訳の概要を、下図を参考に簡単に解説します。

冒頭でも述べましたが、Google翻訳APIは、特定のURLに対してHTTPリクエスト(GET)を送信することで利用できます。
①まず、端末にて指定のフォーマットでURLを生成します。
URLを生成するのに必要なものは以下の4点です。

  • 送信先URL(https://www.googleapis.com/language/translate/v2?)
  • APIキー(取得方法は後ほど解説)
  • 翻訳元(source)の言語(今回のサンプルでは日本語)
  • 翻訳先(target)の言語(今回のサンプルでは英語)

②URLを生成したら、HTTPリクエストを行うことでAPIにアクセスします。
HTTPメソッドにはGETを用いるようにします。
③翻訳自体はGoogle側のサーバーが行ってくれます。
④サーバーからHTTPレスポンスを受け取り、内容を取り出します。
レスポンスの内容はJSON形式になっているので、あとはそれを解析し、翻訳後の文字列だけを取り出します。

以上がAPI利用の簡単な流れになります。

翻訳APIで翻訳を行う

それでは早速ソースコードの方を見ていきます。

まずはAPIにアクセスするためのURLの生成を行っている部分を以下に示します。

TransrateActivity.java

	    String baseUrl = "https://www.googleapis.com/language/translate/v2?key=";
	    String srcLang = "&source=ja";
	    String targetLang = "&target=en";
	    String transChar = "&q=" + "私達は技術者集団Techboosterだ。";

	    String Url = baseUrl + srcLang + targetLang + transChar;

1行目のbaseUrlは、送信先のURLを定義しています。「Key=」の後にAPIキーを指定する必要があります。
2行目では翻訳元の言語(source)を定義しています。今回は日本語→英語と翻訳を行いたいので、sourceに「ja(日本語)」を指定します。
3行目では翻訳先の言語(target)を定義しています。今回は「en(英語)」を指定します。
4行目では翻訳したい文字列を定義しています。今回は「私達は技術者集団Techboosterだ。」を英語に翻訳してみたいと思います。
最後に6行目で定義したすべての文字列を合体して最終的にHTTPリクエストを行うURLを生成します。すると以下のようなURLができあがります。
https://www.googleapis.com/language/translate/v2?key=[APIキー]&source=ja&target=en&q=私達は技術者集団Techboosterだ。

さて、URLは生成できたので、あとはこのURLを利用してHTTPリクエストを行います。
HTTPのGETメソッドにてHTTPリクエストを行う方法については以下の記事を参考にしています。
DefaultHttpClientを使ってコンテンツを取得する
TransrateActivity.java

	    	String Url = baseUrl + srcLang + targetLang + transChar;

		HttpClient httpClient = new DefaultHttpClient();
		HttpGet request = new HttpGet(Url);

		HttpResponse httpResponse = null;
		try {
			httpResponse = httpClient.execute(request);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		int status = httpResponse.getStatusLine().getStatusCode();
		if (status == 200){
			// HTTPレスポンスから値を取り出す
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
	        	try {
				httpResponse.getEntity().writeTo(outputStream);
			} catch (IOException e) {
				e.printStackTrace();
			}

			tv.setText(outputStream.toString());
		}

まずは4行目で、HTTPでGETを行うためのHttpGetクラスのインスタンスを生成しています。
引数には、先ほど生成したAPIにアクセスするためのURLを指定しています。
6行目では、HTTPリクエストを送信してHTTPレスポンスを得るためのHttpResponseクラスのインスタンスを生成しています。
3行目で生成したHttpClientクラスのインスタンスからexecuteメソッドを実行することで、HTTPリクエストを行います。
4行目で生成したHttpGetクラスのインスタンスを引数に渡すことで、指定のURLに対してGETメソッドでのHTTPリクエストを行います。
8行目で、HttpClientクラスのexecuteメソッドを実行してHTTPレスポンスを取得しています。
15行目でHTTPResponseクラスのオブジェクトからステータスを取り出します。
16行目で、HTTPレスポンスのステータス判定を行い、ステータスが「200(OK)」だった場合には、HTTPレスポンスから値を取り出しています。
25行目で、取得した値をTextViewに表示しています。(※この辺りの詳しい解説はDefaultHttpClientを使ってコンテンツを取得するを参考にしてください)
すると下図のようなJSON形式の値が得られます。

{
	"data":{
	"translations":[
	 {
	  "translatedText":"Our technician is Techbooster population."
	 }
	 ]
  }
}

このままではわかりづらいので、JSONを解析して目的の翻訳後の文字列だけ取り出してみます。
まずは以下がそのソースコードになります。
TransrateActivity.java

	        // JSONの解析
	        try {
			JSONObject rootObj = new JSONObject(outputStream.toString());
			JSONObject value = rootObj.getJSONObject("data");
			JSONArray transArray = value.getJSONArray("translations");
			for (int i=0; i < transArray.length(); i++) {
		                JSONObject obj = transArray.getJSONObject(i);
		                translated = obj.getString("translatedText");
	        	}
	        } catch (JSONException e) {
	        	e.printStackTrace();
	        }
	        tv.setText(translated);

JSONの解析方法については、以下の記事を参考にしています。
JSONをパース(解析)する
先ほどのJSONを見ながら、目的の値を取り出す流れを見ていきましょう。
まず3行目で、JSONObjectクラスのインスタンスを取得します。このオブジェクトを辿って目的の値を探します。
4行目でJSONObjectクラスのgetJSONObjectメソッドを用いて、キー”data”に割り当てられたJSONObject型の値(value)を取得しています。
5行目で、JSONObjectクラスのgetJSONArrayメソッドを用いて、”value”からキー”translations”に割り当てられたJSONArray型の値(transArray)を取得しています。
6〜9行目でtransArrayを捜査し、キー”translatedText”に割り当てられた値を取得しています。
この“translatedText”のキーに割り当てられた値が、今回取得したい翻訳後の文字列になります。
最後に13行目で、得られた文字列をTextViewに表示することで、以下のように翻訳後の文字列だけが表示されます。

翻訳に使用できる言語情報を取得する

次に、Google翻訳で利用できる言語の一覧を取得してみたいと思います。
手順は先ほどとほとんど同様で、特定のURLにHTTPのGETメソッドでアクセスするだけです。
UsableLanguage.java

public class UsableLanguage extends Activity{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.access);
        super.onCreate(savedInstanceState);
		HttpClient httpClient = new DefaultHttpClient();
	 	String Url = "https://www.googleapis.com/language/translate/v2/languages?key=";
		String usableLang = "利用可能言語一覧" + "\n";
		HttpGet request = new HttpGet(Url);
(...前述のソースコードと同様のため省略...)
		if (status == 200){
	        // JSONの解析
	        try {
			JSONObject rootObj = new JSONObject(outputStream.toString());
			JSONObject value = rootObj.getJSONObject("data");
			JSONArray transArray = value.getJSONArray("languages");
			for (int i=0; i < transArray.length(); i++) {
		               JSONObject obj = transArray.getJSONObject(i);
		               usableLang += obj.getString("language") + "\n";
	        	}
	        } catch (JSONException e) {
	        	e.printStackTrace();
	        }
	        tv.setText(usableLang);
	    }
    }
}

ソースコード自体は先ほどとほとんど同じですので解説は省略しますが、注目すべきは7行目で定義した以下のURLです。
“https://www.googleapis.com/language/translate/v2/languages?key=[APIキー]”
このURLに対して、先ほどと同様、GETメソッドを用いたHTTPリクエストを行うと、以下のようなJSON形式のレスポンスが得られます。

{
	"data":{
	"languages":[
     {
    	 "language":"af"
     },
     {
    	 "language":"ar"
     },
     {
    	 "language":"be"
     },
     (...省略...)
     {
    	 "language":"zh"
     },
     {
     	 "language":"zh-TW"
     }
     ]
	}
}

これを先ほどと同様の手順で8〜14行目で示すようにJSON解析を行うと、以下のような言語コードの一覧が得られます。

これら言語コードに含まれる言語であれば、Google翻訳APIを用いて翻訳を行うことができます。

Google翻訳APIを有効にする

最後に、Google翻訳APIを有効にする方法について触れておきます。
Google翻訳APIは、APIs Consoleから有効にできます。(APIs ConsoleについてはGoogle App EngineでURL短縮サービスAPIを利用する参照)
下図のように、「Translate API」をONにしてください。OFFのままHTTPリクエストを行っても、ネットワークエラーがJSONで返ってくるだけで、翻訳は行ってくれません。





Google翻訳の利用方法についての解説は以上です。おつかれさまでした。