Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have 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にしましょう。

n0bisuke
プロトタイピング専門スクール「プロトアウトスタジオ」で教えたりしてます。 プロフ -> https://dotstud.io/members/n0bisuke
https://protoout.studio
dotstudio
全ての人がモノづくりを楽しむ世界を目指して活動しています。 ( https://dotstud.io ) プロトタイピングスクールの運営をしています。
https://protoout.studio
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