使ってみよう! Windows Live SDK/API

第38回使ってみようMicrosoft Translator

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サイト 図1 ウィジットを追加したWebサイト

本記事執筆時点では、ウィジットのCollaborative Translationsは招待制になっており招待コードがないと利用できません。APIは招待コードなしで利用できます。

環境の準備

APIの種類

Microsoft Translator API v2は、AJAX、HTTP、SOAPの3種類のサービスがあります[1]。AJAXサービスはJavaScriptを使用した呼出しに向いています。HTTPサービスはXMLで結果を取得します。SOAPサービスは、SOAPと呼ばれるXMLとHTTPベースの通信方法でアクセスします。

今回はこれらのサービスのうちAJAXサービスを利用することにしましょう。

ファイルの準備

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の作成
図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 サポート言語の取得
図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 言語名の取得
図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では、複数の文章に対して一度に翻訳や言語の検出も可能です。その場合、TranslateArrayDetectArrayメソッドを使用します。また文章をセンテンスに分割する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サンプルの実行結果
図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) {
            // do nothing
        }
    });
});

登録後、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 オブジェクトの構造
図6 オブジェクトの構造

これらのメソッドにも一括で複数のテキストを処理するメソッドが用意されていますAddTranslationArrayGetTranslationsArrayメソッド⁠⁠。こちらも詳しくは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トークンの取得
図7 AppIDトークンの取得

取得できたトークンの値は、GetAppIdTokenメソッドを除くすべてのメソッドのAppIDパラメーターの値として使用できます。


いかがでしたでしょうか。今回は以上です。Microsoft TranslatorウィジットおよびAPIは、商用・非商用に関わらず無償で利用できます。ぜひWebサイトやアプリケーションに活用してみてください。

おすすめ記事

記事・ニュース一覧