Microsoft Translator V2
2010年3月15〜17日に開催された、開発者とデザイナー向けのMicrosoftのカンファレンスMIX10で機械翻訳エンジンMicrosoft Translatorの新しい機能が紹介されました(セッション内容 と公式Blogのアナウンス ) 。今回は番外編として、このAPIを紹介します。
現在、Microsoftのオンライン機械翻訳サービスはエンドユーザー向けにBing Translatorという名前で提供されています。このバックグランドで動作しているのがMicrosoft Translatorです。ちなみに、Bingブランドに移行する前はLive Translatorという名前で、Live Messenger向けに翻訳BOTも提供されており、Windows Liveにまったく関係ないわけではなく、少しだけ本連載のテーマともつながりがあります。
Microsoft Translator はWebサイトオーナーや開発者向けに、以前からWebページに貼り付けて使用するウィジットやAPIが提供されていました。今回、Microsoft Translator V2とバージョンが上がり、次にあげる機能追加や新しいAPI、コントロールの提供がなされています。
ウィジットの改良
Collaborative Translations
Text to Speechサポート
SSLサポート
Silverlightコントロールの提供
Collaborative Translationsとは、機械翻訳結果に人手による翻訳情報を与えることで翻訳精度の向上を図るものです。今回の新機能の目玉といえるでしょう。Microsoft Translatorを利用したWebサイトで、WebサイトオーナーやWebサイト訪問者がより良い翻訳を投稿することで、Microsoft TranslatorはそのWebサイトにおいては機械翻訳だけではなく人手による翻訳を組み合わせた結果を返すようになります。
さて、翻訳機能を利用するには、ウィジットの使用またはAPIの利用があります。本連載ではMicrosoft Translator APIを利用して翻訳機能を使ってみましょう。少しのプログラミングで簡単に翻訳機能を備えたアプリケーションの開発が可能です。ウィジットを使用するとプログラミングすることなくWebサイトに翻訳機能を付けられます(図1 ) 。本連載では扱いませんが、こちらもぜひ試してみてください。Microsoft Translator Widget からウィジットが作成できます。
図1 ウィジットを追加したWebサイト
本記事執筆時点では、ウィジットのCollaborative Translationsは招待制になっており招待コードがないと利用できません。APIは招待コードなしで利用できます。
環境の準備
APIの種類
Microsoft Translator API v2は、AJAX、HTTP、SOAPの3種類のサービスがあります[1] 。AJAXサービスはJavaScriptを使用した呼出しに向いています。HTTPサービスはXMLで結果を取得します。SOAPサービスは、SOAPと呼ばれるXMLとHTTPベースの通信方法でアクセスします。
今回はこれらのサービスのうちAJAXサービスを利用することにしましょう。
[1]
どのサービスもHTTPを利用しています。同列に並ぶ名前であるかどうかは疑問がありますが、このように分類されています。ちなみに検索サービスのBing APIも同様に分類されており、こちらは、JSON、XML、SOAPの3種類となっています。
ファイルの準備
WebサイトでMicrosoft Translator APIの利用を想定して、JavaScriptを記述してAPIを呼び出します。次のようなHTMLを記述したファイルを用意し、JavaScriptのコードを書いていくことで、このあと紹介する翻訳機能を使っていきます。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml" >
<head>
<title> Microsoft Translator Sample </title>
<script src = "http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.min.js" type = "text/javascript" ></script>
<script type = "text/javascript" >
var appId = "Bing API AppID" ;
</script>
</head>
<body>
</body>
</html>
今回、JavaScriptのライブラリーjQueryを使用してAPIを呼び出しています。本記事ではjQueryについては解説していません。
Bing API Application IDの取得
APIのアクセスには、Bing APIのApplication ID(AppID)を使用します。Bing Developer Center (図2 )でアプリケーションの登録を行い、IDを取得しておきましょう。AppIDは、APIの各種メソッドを呼び出す際に必要となります。
図2 Bing Developer Center AppIDの作成
翻訳
それでは、Microsoft Translator APIを使ってみましょう。まずは、ある言語から別の言語へとテキストを翻訳する基本的な機能です。この基本的な機能は前バージョンのMicrosoft Translator V1からあるものです。
AJAXサービスによるAPIは、次のURLにメソッド名とメソッドに必要なパラメーターを付けてアクセスすることで結果が得られます。
http://api.microsofttranslator.com/V2/Ajax.svc/
たとえばテキストから翻訳する場合は、次のようなURLへアクセスすると翻訳結果が返ってきます。自分のAppIDを付けてWebブラウザーからアクセスしてみましょう。すぐに結果が得られると思います。とても簡単ですね。
http://api.microsofttranslator.com/V2/Ajax.svc/Translate?appId=YourAppID &text=Hello&from=en&to=ja
上記URLのTranslate がメソッド名、appIdやtext、from、toがパラメーター名、Helloやen、jaがパラメーターに指定した値です。ここでは「Hello」という英語(en)を日本語(ja)に翻訳したということになります。Translate メソッドは次のパラメーターを指定します。
パラメーター名
説明
appId
AppID
text
翻訳するテキスト
from
翻訳前の言語(言語コード)
To
翻訳語の言語(言語コード)
JavaScriptのコードでは次のように書けます。APIのURLとWebサイトのあるURLはドメインが異なるため、JSONPという方法を使ってアクセスしています。
$ ( function () {
$ . ajax ({
type : "GET" ,
url : "http://api.microsofttranslator.com/V2/Ajax.svc/Translate" ,
dataType : "jsonp" ,
data : {
appId : appId ,
text : "Hello, world!" ,
from : "en" ,
to : "ja"
},
jsonp : "oncomplete" ,
success : function ( data , dataType ) {
alert ( data );
}
});
});
サポート言語の取得
テキストの翻訳は現在30言語がサポートされています。Translate メソッドのfromやtoパラメーターに指定できる値は、GetLanguagesForTranslate メソッドで取得できます。実行結果は図3 です。
$ ( function () {
$ . ajax ({
type : "GET" ,
url : "http://api.microsofttranslator.com/V2/Ajax.svc/GetLanguagesForTranslate" ,
dataType : "jsonp" ,
data : {
appId : appId
},
jsonp : "oncomplete" ,
success : function ( data , dataType ) {
alert ( data );
}
});
});
図3 サポート言語の取得
enやjaのように表記された言語の種類(本記事では言語コードを表記します)を、「英語」や「日本語」のように、ある言語で表記した言語名もGetLanguageNames メソッドで取得できます。実行結果は図4 です。
$ ( function () {
$ . ajax ({
type : "GET" ,
url : "http://api.microsofttranslator.com/V2/Ajax.svc/GetLanguageNames" ,
dataType : "jsonp" ,
data : {
appId : appId ,
locale : "ja" ,
languageCodes : "[\"en\", \"ja\", \"de\", \"fr\", \"it\"]"
},
jsonp : "oncomplete" ,
success : function ( data , dataType ) {
alert ( data );
}
});
});
図4 言語名の取得
GetLanguageNames メソッドのパラメーターは次の通りです。
パラメーター名
説明
appId
AppID
Locale
指定した言語コードで言語名を取得する
languageCodes
言語名を取得する言語コードの配列表記(例はコードを参照)
言語の検出
テキストからその言語の検出も可能です。その場合は、Detect メソッドを使います。これを利用すれば、ユーザーは元の言語を指定せずに翻訳先の言語だけを指定するだけで翻訳機能が使えるようになります。
$ ( function () {
$ . ajax ({
type : "GET" ,
url : "http://api.microsofttranslator.com/V2/Ajax.svc/Detect" ,
dataType : "jsonp" ,
data : {
appId : appId ,
text : "こんにちは"
},
jsonp : "oncomplete" ,
success : function ( data , dataType ) {
alert ( data );
}
});
});
Detect メソッドのパラメーターは、AppIDと検出対象のテキスト(textパラメータ)です。戻り値は言語コードです。
一括処理
以上までが前バージョンにもある機能でした。新しいMicrosoft Translator V2では、複数の文章に対して一度に翻訳や言語の検出も可能です。その場合、TranslateArray やDetectArray メソッドを使用します。また文章をセンテンスに分割するBreakSentences メソッドも用意されています。これらについては本記事で紹介しませんので、詳しくはMSDN Library を参照してください。
Text-to-Speech
次はText-to-Speech機能です。Text-to-Speechとはテキストを人工的に合成した音声で読み上げてくれるものです。Microsoft Translator V2から指定したテキストのWave形式のストリームデータを取得できます。
さっそく使ってみましょう。Text-to-SpeechにはSpeak メソッドを使います。Speak メソッドのパラメーターは次の通りです。
パラメーター名
説明
appId
AppID
text
読み上げるテキスト
language
テキストの言語コード
format
ストリームデータのContent-type(現在はaudio/wavのみサポートで省略可能)
戻り値は、ストリームデータのURLです。JavaScriptからは次のように使えます。<embed>要素をページ内に追加して音声を再生するようにしています。Internet Explorerでの実行結果は図5 のようになります。
$ ( function () {
$ . ajax ({
type : "GET" ,
url : "http://api.microsofttranslator.com/V2/Ajax.svc/Speak" ,
dataType : "jsonp" ,
data : {
appId : appId ,
text : "Hello, world!" ,
language : "en" ,
format : "audio/wav"
},
jsonp : "oncomplete" ,
success : function ( data , dataType ) {
$ ( "body" ). append (
$ ( "<embed>" ). attr ( "src" , data ). attr ( "autostart" , true ));
}
});
});
図5 Text-to-Speechサンプルの実行結果
残念ながら現在は日本語の読み上げには対応していません。サポートしている言語はGetLanguagesForSpeak メソッドで取得できます。使い方は、GetLanguagesForTranslate メソッドと同じです。
Collaborative Translations
次はCollaborative Translations機能を使ってみましょう。Collaborative Translationsは、既に述べたとおり、人手による翻訳情報を与えることで翻訳精度を向上させるものです。翻訳前のテキストと人手による翻訳後のテキストを登録することでAPI呼出し時にその情報を利用できます。翻訳したテキストはMicrosoftのデータベース上にAppIDに関連付いて保存されます。
人手による翻訳は誰によって翻訳されたかが重要になってきます。Webサイトオーナーや信頼できるユーザーとWebサイトを訪れた匿名ユーザーでは翻訳の質や価値が異なります。この点については数値による評価(重み付け)ができ、API呼出し時にどの翻訳結果を採用するか判断する必要があります。
翻訳の登録
翻訳情報の登録はAddTranslation メソッドを使います。パラメーターは次の通りです。戻り値はありません。
パラメーター名
説明
appId
AppID
originalText
翻訳前のテキスト(1000文字まで)
translatedText
翻訳後のテキスト(1000文字まで)
from
翻訳前の言語コード
To
翻訳後の言語コード
rating
翻訳の質を表す値 -1から10の整数(省略時は1)
contentType
テキストのContent-type(text/plainまたはtext/html 省略時はtext/plain)
category
翻訳のカテゴリー(省略時はgeneral)
user
ユーザー名(文字列)
uri
翻訳の場所(省略可能)
categoryとuriパラメーターは、同じテキストでも文章のジャンルによって異なる翻訳になるような場合に、付加情報として利用するために用意されていると思われます。ratingは、-1から10の整数で翻訳の質を表しています。機械翻訳の場合ratingは5です。Webサイトオーナーや権限のあるユーザーによる翻訳は6以上、匿名ユーザーによるものは5未満となるように使いわけます。userは翻訳者が誰であるかを追跡するために使用します。
JavaScriptのコードは例えば次のようになります。
$ ( function () {
$ . ajax ({
type : "GET" ,
url : "http://api.microsofttranslator.com/V2/Ajax.svc/AddTranslation" ,
dataType : "jsonp" ,
data : {
appId : appId ,
originalText : "where do you eat a choco-coronet from?" ,
translatedText : "チョココロネってどっちから食べる?" ,
from : "en" ,
to : "ja" ,
rating : 6 ,
user : "owner"
},
jsonp : "oncomplete" ,
success : function ( data , dataType ) {
}
});
});
登録後、originalTextに指定したテキストをTranslate メソッドで翻訳するとtranslatedTextに指定したテキストが翻訳結果として得られることがわかると思います。これはratingに6を指定していたため、機械翻訳の結果よりも登録された翻訳のほうがよいと判断されたためです。
翻訳の取得
Translate メソッドはひとつの翻訳結果を返します。機械翻訳を含むデータベースに登録された複数の翻訳情報を取得したい場合は、GetTranslations メソッドを使用します。パラメーターは次の通りです。
パラメーター名
説明
appId
AppID
text
翻訳するテキスト
from
翻訳前の言語コード
To
翻訳後の言語コード
maxTranslations
取得する翻訳の最大数
options
(後述)
optionsにはAddTranslation メソッドで使用したcategory, user, uriなどの情報を指定し、特定の翻訳情報を取得するために使用します。optionsに使用できるパラメーターは次の通りです。
パラメーター名
説明
Category
翻訳のカテゴリー(省略時はgeneral)
ContentType
テキストのContent-type(text/plainまたはtext/html 省略時はtext/plain)
Uri
翻訳の場所(省略可能)
User
ユーザー名(省略可能)
State
状態オブジェクト(指定した値が応答時に返ってきます。プログラムが要求と応答を対応付ける場合などのために任意で使用します)
パラメーターはすべて省略可能ですので、AddTranslationメソッド で各パラメーターに対応する値を使用していなければoptionsパラメーターを使う必 要はありません。optionsの値は、{"User": "admin", "State": "uniqueId"} のようにJSON形式で表します。
JavaScriptのコードは次のようになります。
$ ( function () {
$ . ajax ({
type : "GET" ,
url : "http://api.microsofttranslator.com/V2/Ajax.svc/GetTranslations" ,
dataType : "jsonp" ,
data : {
appId : appId ,
text : "where do you eat a choco-coronet from?" ,
from : "en" ,
to : "ja" ,
maxTranslations : 5 ,
options : "{\"State\": \"someUniqueStateId\"}"
},
jsonp : "oncomplete" ,
success : function ( data , dataType ) {
for ( var i = 0 ; i < data . Translations . length ; ++ i ) {
alert ( "TranslatedText: " + data . Translations [ i ]. TranslatedText + "\n" +
"MatchDegree: " + data . Translations [ i ]. MatchDegree + "\n" +
"Rating: " + data . Translations [ i ]. Rating );
}
}
});
});
戻り値は、次の値が返ってきます。
キー名
説明
Translations
翻訳情報を含むオブジェクト(後述)の配列
From
翻訳前の言語コード
State
optionsパラメーターのStateの値
Translationsは配列になっており、各オブジェクトは、次のキーと値を持っています。
Error
もしエラーの場合はErrorというキー名を含み、その値はエラーコードです。
MatchDegree
翻訳の際に使用したデータベースの元のテキストが、メソッドに入力された翻訳対象のテキストとどの程度一致しているかを示す0〜100の整数です。0は完全に不一致、100は完全に一致を示します。英語の場合、大文字と小文字の違いなどでこの値が減少します。
MatchedOriginalText
翻訳の際に使用したデータベースの元のテキストです。機械翻訳や完全に一致している場合は、この値はありません。
Rating
翻訳の登録時に付けたratingの値です。機械翻訳の結果は5になります。
Count
このオブジェクトの翻訳が、ユーザーにより選択された回数を示します。APIにはそのようなUIはないため、ratingを1以上で複数回 同じ翻訳を登録すると、その分このCount値が増えていることがわかります。ratingが-1で登録されるとCount値は減ります。機械翻訳の結果は0になります。
TranslatedText
翻訳したテキストです。
参考までに戻り値をVisual Studioで表示したものを図6 に示します。
図6 オブジェクトの構造
これらのメソッドにも一括で複数のテキストを処理するメソッドが用意されています(AddTranslationArray とGetTranslationsArray メソッド) 。こちらも詳しくはMSDN Library を参照してください。
AppIDトークンの利用
これまで、各メソッドの呼び出しにはAppIDを使用してきましたが、翻訳の登録など誰でも自由にできては困る場合があります。そのような場合にAppIDを使用せず代わりにAppIDトークンと呼ばれる値を使う方法も用意されています。
AppIDトークンはAppIDを元に作成します。作成するときに、このトークンによって翻訳の登録時に指定できるratingの最大値と、翻訳の取得時に取得できるratingの最小値を指定できます。また、トークンの有効期間の設定も可能です。これによって匿名ユーザーが登録する翻訳のrating値を5未満に制限したり、翻訳を取得したとき低いratingのものは取得できないようにしたりします。
AppIDトークンはGetAppIdToken メソッドを使います。パラメーターは次の通りです。
キー名
説明
appId
AppID
minRatingRead
取得可能な翻訳のrating最小値
maxRatingWrite
登録可能な翻訳のrating最大値
expireSeconds
トークンの有効期間(秒)
最大86400秒
JavaScriptのコードは次のようになります。実行結果は図7 のようになります。
$ ( function () {
$ . ajax ({
type : "GET" ,
url : "http://api.microsofttranslator.com/V2/Ajax.svc/GetAppIdToken" ,
dataType : "jsonp" ,
data : {
appId : appId ,
minRatingRead : 5 ,
maxRatingWrite : 4 ,
expireSeconds : 300
},
jsonp : "oncomplete" ,
success : function ( data , dataType ) {
alert ( "AppIdToken = " + data );
}
});
});
図7 AppIDトークンの取得
取得できたトークンの値は、GetAppIdToken メソッドを除くすべてのメソッドのAppIDパラメーターの値として使用できます。
いかがでしたでしょうか。今回は以上です。Microsoft TranslatorウィジットおよびAPIは、商用・非商用に関わらず無償で利用できます。ぜひWebサイトやアプリケーションに活用してみてください。