32
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

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にしましょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
32
Help us understand the problem. What are the problem?