1年前ぐらいからMicrosoft Translator APIにはお世話になりっぱなしなのですが、Bing AppIDを使ったAPI利用が2012年8月までとなり、それ以降もAPIを使い続けるには少しプログラムを修正しないといけないようです。では、どのような変更を行わないといけないか、新規にアプリケーションを登録するところからみてみます。
はじめに Windows Azure Marketplace と Access Token
Microsoft Translator APIは翻訳を提供するサービスです。このサービスを利用すると自分のアプリケーションで翻訳機能を利用することができます。このサービスはWebサービスとして提供されていてHTTP通信が可能なプラットフォームであれば利用することができます。もちろんWebアプリ(サーバサイド、クライアントサイド)やLinux、Windows、iOSなどでも利用できます。利用するにはWindows Azure MarketplaceでLiveIDの登録とアプリケーションの登録を行います。
今まではBing APIからAppIDを取得して、そのAppIDをAPI呼び出しに使用していましたが、Azure DataMarketから取得した Access Token を使ったAPI呼び出しに変更されました。では、Windows Azure Marketplaceへの登録から始めてみましょう。
1. Azure Marketplace で Microsoft Translator の利用登録
Windows Azure Marketplace(以下のURL)でMicrosoft Translator APIのサブスクリプション登録を行います。Bing AppIDを利用していたころは、翻訳文字数による制限は書かれていませんでしたが、Windows Azure Marketでは翻訳文字数によって料金がかかるようです。今回はお金のかからないプラン「2,000,000文字/月」を選択してみます。
https://datamarket.azure.com/dataset/1899a118-d202-492c-aa16-ba21c33c06cb
2. Azure DataMarketにアプリケーションを登録
つぎに、Azure DataMarket(以下のURL)に自分が作成しているアプリケーションの登録を行います。この登録はAPIを利用するために重要な作業です。この登録で取得する「顧客の秘密」(英語だとClient Secret)と、「クライアントID」(英語だとClient ID)はAPIで使用します。
https://datamarket.azure.com/developer/applications
項目名から何を記入したらよいのかわからないと思いますので、以下に記入内容を書いておきます。
クライアントID | Azure DataMarketで管理するユニークなアプリケーションのID。アプリケーションのログインIDみたいな感じですね。 | 例:kentaapplication |
名前 | 人間がわかりやすいアプリケーションの名前です。 | 例: Kenta’s Application |
顧客の秘密 | 自動で生成されますので、書き換えないでください。Client Secretとなり、Access Tokenを取得する際に使います。 | 例: A90eqOP776O2fmjOrVog8f90I6jc9uAL1UAp0twj278= |
リダイレクトURL | Microsoft Translator APIでは使用しませんが、必修フィールドとなっていますので、適当なURLを記入します。 | 例: https://kentablog.cluscore.com |
説明 | アプリケーションの説明を書きます。記入しなくてもよいです。 | 例: It’s my application |
3.アプリケーションでの利用方法 その1Access Tokenを取得する
アプリケーションから Microsoft Translator API を利用する方法です。Microsoft Translatorは、AJAX向けインタフェース、HTTP向けインタフェース、SOAP向けインタフェースを持ちます。HTTPとSOAPでアクセスするにはAccess Tokenが必要になりますので、先にトークンサービスからAccess Tokenを取得する方法を紹介します。
Access Token はDataMarket のトークンサービスに HTTP POST リクエストを送信することにより取得します。
トークンサービスURL
https://datamarket.accesscontrol.windows.net/v2/OAuth2-13
トークン要求入力パラメータ―
client_id | Azure DataMarketに登録した、クライアントID |
client_secret | Azure DataMarketで得られた、顧客の秘密 |
scope | Microsoft Translator APIを使用するので、値を http://api.microsofttranslator.com にする |
grant_type | Microsoft Translator APIで使用する場合は、値を“client_credentials”にする |
トークン要求出力パラメータ―
access_token | Microsoft Translator APIにアクセスするためのAccess Token |
token_type | Access Tokenのフォーマット |
expires_in | Access Tokenが有効な秒数 |
scope | このトークンが有効なドメインスコープ。Microsoft Translatorの場合は、http://api.microsofttranslator.com |
上記に従ったHTTP POSTリクエストを作成すればよいのですが、お手本があるのでそちらを参照します。以下のMSDNのC#サンプロコードから、 AdmAccessToken クラスと AdmAuthentication クラスをコピーして、AdmAuthentication.cs に保存して利用します。
http://msdn.microsoft.com/en-us/library/hh454950.aspx
[DataContract]
public class AdmAccessToken
{
....
}
public class AdmAuthentication
{
....
public AdmAuthentication(string clientId, string clientSecret)
{
....
}
public AdmAccessToken GetAccessToken()
{
....
}
private AdmAccessToken HttpPost(string DatamarketAccessUri, string requestDetails)
{
....
}
}
Access Tokenを取得した後は、APIに渡すためにAuthentication Headerを作成します。Authrization Headerは、トークンサービスから取得したAccess Token文字列の前に”Bearer “を追加した文字列になります。
string authorizationHeader = “Bearer“ + “ “ + accessToken;
上記のコードを使うと以下のようになります。
var admAuth = new AdmAuthentication("kentaapplication", "A90eqOP776O2fmjOrVog8f90I6jc9uAL1UAp0twj278=");
admToken = admAuth.GetAccessToken();
authenticationHeaderValue = "Bearer " + admToken.access_token;
Access Tokenは10分間有効なので定期的に新しいAccess Tokenを取得する必要があります。
アプリケーションでの利用 その2Microsoft Translator APIを使ってみる
Access Token を取得できるようになったので、いよいよ Microsoft Translator API を使ってみます。API は AJAX、SOAP、HTTP の3つのインタフェースを持ちますが、ここでは SOAP と HTTP インターフェースを紹介します。
SOAPインタフェース
VisualStudio2010 で.NETを利用したアプリケーションを書いている人にとっては、すごく便利なインタフェースです。手順としては、「ソリューションエクスプローラー」の「プロジェクト」のコンテキストメニューより、「サービス参照の追加」を選択します。「アドレス」に以下のURLを記入して「移動」ボタンをクリックするとMicrosoft Translator API を Webサービスから取得してきますので、「名前空間」に自分の好きなクラス名を入力して「OK」をクリックするだけでMicrosoft Translator のクラスが作成されます。
APIを使うときは、以下のようにメソッドを呼び出すだけです。第一引数AppIDにAccess Tokenを取得した時に作成したAuthentication Headerを入力します・
var translator = new MyTranslator.LanguageServiceClient();
var url = translator.Speak(authenticationHeaderValue , "こんにちは", "ja", "audio/wma", "MinSize");
HTTPインタフェース
HTTPのインタフェースは多くのプラットフォームで利用できる便利なインタフェースです。libcurlとかを使えばCでも利用することができると思いますし、PHPやJavaなどのでHTTPを使った方が便利だと思います。だけど今回はC#で。
string uri = "http://api.microsofttranslator.com/v2/Http.svc/Speak";
uri = uri + string.Format("?text={0}&language={1}&format={2}&option={3}",
HttpUtility.UrlEncode("こんにちは"),
"ja",
HttpUtility.UrlEncode("audio/wav"),
"MinSize");
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
httpWebRequest.Headers.Add("Authorization", authenticationHeaderValue);
WebResponse response = null;
try
{
response = httpWebRequest.GetResponse();
using (Stream stream = response.GetResponseStream())
{
using (SoundPlayer player = new SoundPlayer(stream))
{
player.PlaySync();
}
}
}
SOAPの時はURLが出力されましたが、HTTPの場合は音声データを取得できます。
まとめ
Microsoft Translator APIは、Bing AppIDを必要とするとき同じAPI引数となっていますが、Windows Azure DataMarketでは、AppIDではなくAccess Tokenが含まれたAuthenticator HeaderによりAPIの利用が可能となります。Bing AppIDを利用している他のAPIもWindows Azure Marketplaceに移行するようですので、今回の例と同じようにAccess Tokenを取得して利用することができると思います。
Windows Azure Marketplace で提供されている Microsoft Translator を含め、自分のアプリケーションに利用すると便利なサービスが沢山あるので、どんどん使いたいですね。クラウドって素晴らしい。
参考サイト
Obtaining an Access Token
http://msdn.microsoft.com/en-us/library/hh454950.aspx
Microsoft Translator Developer Offerings