5/19/2012

Windows Azure Marketplace の Microsoft Translator API を使ってみる

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

Azure

2. Azure DataMarketにアプリケーションを登録

つぎに、Azure DataMarket(以下のURL)に自分が作成しているアプリケーションの登録を行います。この登録はAPIを利用するために重要な作業です。この登録で取得する「顧客の秘密」(英語だとClient Secret)と、「クライアントID」(英語だとClient ID)はAPIで使用します。

https://datamarket.azure.com/developer/applications

develop02

項目名から何を記入したらよいのかわからないと思いますので、以下に記入内容を書いておきます。

クライアント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


http://www.microsofttranslator.com/dev/