echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【Node.js】「みんなの自動翻訳」APIを使ってみた

はじめに

みなさん、翻訳ツールって何を使ってますか?
多くはGoogle翻訳やDeepLとかではないかと思います。

そんな中、機械学習型の「みんなの自動翻訳」というサイトがあったので、こちらを試してみました。

みんなの自動翻訳@TexTra®

参考サイト

コピペ翻訳機を作る 目標〜翻訳APIの利用|Erectronでマルチプラットフォームなデスクトップアプリケーションを作ろう

みんなの自動翻訳の特徴

  • 国立研究開発法人情報通信研究機構NICT)が開発した自動翻訳サイト
  • 最新の自動翻訳研究に基づく「高精度自動翻訳エンジン」が無料で使える
  • 翻訳WEB APIが無料公開されている
  • VS Code用の拡張機能も公開されている

使用にはサインアップが必要ですが、翻訳やWeb API, VS Code拡張機能もすべて無料で使用できます。

そして個人的には「無料で翻訳WEB APIが使える」ところが大きいので、今回はそれを試してみました。

Web APIについて

ログイン後、Web API一覧→自動翻訳リクエストとページ移動すると、下記画面が表示されます。
そこで「API」の「i」アイコンをクリックすると、APIの詳細仕様や言語別のソースコードが表示されます。


そこで今回は「汎用NT【英語・日本語】」のWeb APIをNode.jsで実行します。

  • ログインすると「API Key」「API Secret」「ログインID」の3つが発行されます。
    • この3つがWeb API実行に必須となります。
  • 認可形式はOAuth/OAuth2です。
  • 通信形式はPOSTです。

実行してみた

というわけで、Node.jsで書いてみました。

ちなみに、せっかく前回ES2022の正式機能を紹介したので、今回はES2022の正式機能に採用されたクラスの機能(フィールド&private要素)を使って書いてみました。

またOAuth2のクライアント認証に、axios-oauth-clientを使用しています

// 翻訳を実行するクラス
// 詳細は公式ページのソースを参照。
// なお公式ページはrequestを使ってますが、今回はaxiosで記載
const axios = require('axios');
const oauth = require('axios-oauth-client');
const axiosFetcher = axios.default;
  
class MinnaTransClass {
    // これが全APIのベースとなるURL
    #BASE_URL = 'https://mt-auto-minhon-mlt.ucri.jgn-x.jp';
      
    #key = '';       // API Key
    #secret = ';'   // API Secret
    #name = '';   // ログインID
    #token= '';    // アクセストークン
    #expire = 0;  // 有効期限(今回はほとんど使ってないです)
    
    constructor(key, secret, name) {
        this.#key = key;
        this.#secret = secret;
        this.#name = name;
    }
    
    // 英→日翻訳
    async translateEn2Ja(text) {
        if(this.#isNeedNewToken()) {
            await this.#getAuthorizationCode();
        }
        
        return (await this.#request('mt/generalNT_en_ja/', text));
    };
    
    // 日→英翻訳
    async translateJa2En(text) {
        if(this.#isNeedNewToken()) {
            await this.#getAuthorizationCode();
        }
        
        return (await this.#request('mt/generalNT_ja_en/', text));
    };
    
    // アクセストークン取得要否を判定する。  
    // 有効期限5分前を切ったら再取得する。  
    // (今回使うことはないけど)
    #isNeedNewToken() {
        return this.#token === '' || this.#expire < Date.now();
    }
    
    // OAuth2認可を行い、アクセストークンを取得する関数
    // urlとurlAccessTokenにはOAuth2認可の固定URLを設定する。
    // grant_typeはclient_credentials固定。  
    // client_idとclient_secretはそれぞれAPI KeyとAPI Secretを指定する。
    async #getAuthorizationCode() {
        const oauthFunc = oauth.client(axios.create(), {
            url: `${this.#BASE_URL}/oauth2/token.php`,
            grant_type: 'client_credentials',
            client_id: this.#key,
            client_secret: this.#secret,
            urlAccessToken: `${this.#BASE_URL}/oauth2/token.php`
        });
  
        const auth = await oauthFunc();
        this.#token = String(auth.access_token) || '';
        this.#expire = Number(auth.expires_in) + Date.now(); 
        return;
    } 
    
    // 実際に翻訳APIを実行する関数
    // postするパラメータは下記コメント参照
    // また詳細はAPIの詳細仕様を参照  
    // ちなみにtype以外は必須パラメータ
    async #request(path, text) {
        const pathElements = path.split('/');
        const params = {
            access_token: this.#token,  // アクセストークン
            key: this.#key,  // API Key                  
            api_name: pathElements[0], // 固定文字列(汎用NTの場合'mt'固定)
            api_param: pathElements[1], // 英→日および日→英で固定の文字列 
            name: this.#name,  // ログインID
            text,  // 翻訳するテキスト
            type: 'json',  // レスポンス形式(xml/json, デフォルトはxml)
        };
        
        // URLSearchParamsにしないと、ログインID認証エラーが発生した  
        var searchParams = new URLSearchParams();
        for (let key in params) {
            searchParams.append(key, params[key]);
        }
        
        const res = await axiosFetcher.post(`${this.#BASE_URL}/api/`, searchParams);
        
        // 翻訳テキストはrespose.bodyのresultset.result.textに格納される
        return res.data.resultset.result.text;
    }
};
  
module.exports = {
    MinnaTransClass: MinnaTransClass,
};
// 上記クラスを使用して、実際に翻訳APIを呼び出す
import { MinnaTransClass } from './minnaTransClass.js';

const minnaTrans = new MinnaTransClass('(API Key)', '(API Secret)', '(ログインID)');
  
const resource = '隣の客はよく柿食う客だ';
console.log(`原文:${resource}`);
const result = await minnaTrans.translateJa2En(resource);
console.log(result);

const result2 = await minnaTrans.translateEn2Ja(result);
console.log(result2);

結果、こうなりました。

翻訳としては、十分OKではないでしょうか?(customerを2回使ってたり、whoがちょっとくどかったり、細かい所はあるけど)

もちろん翻訳としても十分使えますし、何より動作確認などの目的で使える無料のWeb APIがある、というのが大きいです。

VS Code拡張機能

みんなの自動翻訳はVS Code拡張機能としても公開されています。

TexTra - Visual Studio Marketplace

公式サイトの動画でも紹介されていますが、下記手順で実行します。(ほかにもコマンドはあるので、それは公式サイトを参照)

  • コマンドパレットで「TexTra: API Settings」を選択し、API Key, API Secret, ユーザーIDを設定する。
  • 翻訳したいテキストを選択して、コマンドパレットで「Textra: Translate Selected Text」を選択する。
    • この際、翻訳結果を選択テキストの直下に貼り付けるか、クリップボードにコピーするかを選べます。

まとめ

以上、みんなの自動翻訳の紹介でした。

翻訳ツールとしてもそうですが、Web APIとしてもなかなか便利で、良いなあと思いました。
これからちょくちょく利用しようと思います。

では、今回はこの辺で