はじめに
みなさん、翻訳ツールって何を使ってますか?
多くはGoogle翻訳やDeepLとかではないかと思います。
そんな中、機械学習型の「みんなの自動翻訳」というサイトがあったので、こちらを試してみました。
参考サイト
コピペ翻訳機を作る 目標〜翻訳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としてもなかなか便利で、良いなあと思いました。
これからちょくちょく利用しようと思います。
では、今回はこの辺で