Microsoft Translator Text APIをNode.jsから使ってみる

  • 25
    Like
  • 0
    Comment
More than 1 year has passed since last update.

indico記事の流れで機械学習系のサービスを横断的に探していて、以下の記事からMSの翻訳APIを発見しました。

(主に)ディープラーニングの成果を利用したAPI集(自分用)

Google翻訳APIは有料だけどMSのは無料のもあるみたいです。

Microsoft Translator APIを使ってみるを参考にしつつ、ここに掲載されていたコードがうまく動作しなかったのでこちら(Windows Translatorで "ArgumentOutOfRangeException: 'to' must be a valid languageというエラーが出るときの対処)も参考にして動作を検証したメモです。

アカウント発行と必要な情報取得

とりあえず試すだけならリダイレクトURLは適当なもので大丈夫です。
顧客の秘密って書いてるところが↓のソースコードのclient_secretになります。クライアントIDはそのままclient_idですね。

サンプルをNode.jsで動かす。

外部モジュールが無いので、このままコピペで動くとおもいます。
ちなみにNode.jsはv6.0

app.js
'use strict';

const http = require('http');
const https = require('https');
const qs = require('querystring');

//アクセストーク取得
function getAccessToken(callback) {
    let body = '';
    let data = {
        'client_id': '自分のアプリケーションのクライアントID',
        'client_secret': '自分のアプリケーションのクライアントシークレット',
        'scope': 'http://api.microsofttranslator.com',
        'grant_type': 'client_credentials'
    };

    let req = https.request({
        host: 'datamarket.accesscontrol.windows.net',
        path: '/v2/OAuth2-13',
        method: 'POST'
    }, (res) => {
        res.setEncoding('utf8');
        res.on('data', (chunk) => {
            body += chunk;
        }).on('end', () => {
            let resData = JSON.parse(body);
            callback(resData.access_token);
        });
    }).on('error', (err) => {
        console.log(err);
    });
    req.write(qs.stringify(data));
    req.end();
}

//翻訳 (日本語 -> 英語)
function translate(token, text, callback) {
    let options = 'from=ja'+
                  '&to=en' +
                  '&text=' +
                  qs.escape(text) +
                  '&oncomplete=translated';
    let body = '';
    let req = http.request({
        host: 'api.microsofttranslator.com',
        path: '/V2/Ajax.svc/Translate?' + options,
        method: 'GET',
        headers: {
          "Authorization": 'Bearer ' + token
        }
    }, (res) => {
        res.setEncoding('utf8');
        res.on('data', (chunk) => {
            body += chunk;
        }).on('end', () => {
            eval(body);
        });
    }).on('error', (err) => {
        console.log(err);
    });
    req.end();

    function translated(text) {
        callback(text);
    }
}

//実行
getAccessToken((token) => {
    translate(token, process.argv[2], (translated) => {
        console.log(process.argv[2],'->',translated);
    });
});

実行

$ node app.js こんばんわ
こんばんわ -> Good evening!

$ node app.js めちゃ眠い
めちゃ眠い -> So sleepy

こんな感じで結構口語の日本語でも翻訳してくれてけっこう精度の良さを感じますね

パラメータは今回は日本語->英語なのでfrom=ja&to=enですが、英語->日本語にするときはfrom=en&to=jaにしましょう。