【python】XUnity Auto Translatorで翻訳APIを試すコード【みんなの自動翻訳】

日本語化関連

Unity製で日本語化されていないゲームを、ゲーム中で自動翻訳してくれる神ツール「XUnity Auto Translator」。非常にお世話になっております。

XUnity Auto Translatorで使用する翻訳ツールとして「DeepLのフリーAPI」を選択していたのですがDeepL側の文字数制限が思った以上に厳しく、他に良い翻訳ツールAPIが無いかを試すため、Custom Translate用のpythonコードを書きました。

この記事では「みんなの自動翻訳@TexTra」のサービスを試すコードを公開しています。使用するサービスによって色々と書き換えてください。

Custom Translateの機能自体は、あくまで開発用オプションでありどんな翻訳APIにも対応している訳では無いと製作者が記載していますので、あくまで自己責任で利用しましょう。

スポンサーリンク

みんなの自動翻訳APIを使用するpythonコード

# -*- coding: utf-8 -*-
from flask import Flask, request, jsonify
from gevent.pywsgi import WSGIServer
import requests
from json import loads

# APIキーなど。環境変数から読み込むなり、暗号化して別ファイルに分けるなり
API_KEY = ''
API_SECRET_KEY = ''
USER_NAME = ''

app = Flask(__name__)

# 翻訳APIのURL
URL = "https://mt-auto-minhon-mlt.ucri.jgn-x.jp"
ACCESS_TOKEN_URL = f"{URL}/oauth2/token.php"

CLIENT_DATA = {
"grant_type": "client_credentials",
"client_id": API_KEY,
"client_secret": API_SECRET_KEY,
"urlAccessToken": f"{URL}/oauth2/token.php"
}

DEFAULT_DATA = {
"key": API_KEY,
"name": USER_NAME,
"type": "json"
}

@app.route('/translate')
def translate():
    text = request.args.get('text')
    url = f"{URL}/api/mt/generalNT_en_ja/"
    data = dict(**DEFAULT_DATA, access_token=get_access_token(), text=text)
    return loads(post(url, data=data))["resultset"]["result"]["text"]

    
def post(url: str, data: dict[str, str]) -> str:
    return requests.post(url, data).text


def get_access_token():
    return loads(post(f"{URL}/oauth2/token.php", data=CLIENT_DATA))["access_token"]


def main():
    http_server = WSGIServer(('127.0.0.1', 5000), app)
    http_server.serve_forever()


# if __name__ == '__main__':
#     app.run(host='127.0.0.1', port=5000, debug=True)
if __name__ == '__main__':
    main()

仕様上、サーバーに

http://:サーバー名/translate/"翻訳したい文章"

という形でリクエストしたら翻訳文が返ってくる形にしなければならないので、そのように記述している。上記コードだと、

http://:127.0.0.1:5000/translate/"翻訳したい文章"

となる。

エラー処理も何も入れていないので、試すだけでなく実際にCustom Translate翻訳でゲームを遊ぶならもう少しコードを書き足そう。

XUnity Auto TranslatorのConfig.iniファイルの編集

XUnity Auto TranslatorのGithubに記載されているが、Custom Translateを使用するためにはConfig.iniを書き換える必要がある。

書き換え箇所は、

Endpoint=CustomTranslate
[Custom]
Url=http://サーバー名/translate

となっている。書き換え前のConfig.iniのバックアップを取っておけば戻すのが楽。

みんなの自動翻訳を試してみた結果

試したゲームは、Pathfinder: Wrath of the Righteous。

  • 日本語化されておらず、直近での日本語化の見込みもない
  • Unity製でXUnity Auto Translatorの動作も確認されている
  • 文章量が膨大であり、難しい会話文も多い

という理由で選択。

翻訳速度

実際に試してみたが、選択肢がある会話画面や、複数の説明文が1画面中に存在する場合に翻訳速度が非常に遅くなってしまった。精度が良くない限りは(本件に限っては)実用性が低め。

翻訳精度

説明文などはそこまで問題なかったりするが、会話文が微妙。DeepLと比較すると流石に数段落ちる印象。現時点ではDeepLの代替としては使えないと判断。

一例として、会話文の翻訳をそれぞれ見てみる。ゲーム中での原文は以下の通り。

“He’sh not one of ush. No, not one of ush. Hish father was one of ush, but hish mother — no. They took him up to the shurface, they ruined him as a child. Then they came back, but he washn’t one of ush. A good hunter, yesh… But he feelsh trapped down here… But he can’t go up there either. Sh’not safe. He wouldn’t lasht a gong.”

Pathfinder: Wrath of the Righteousより

これをDeepLで訳すと、

“彼は私たちの仲間じゃない そうです、仲間ではありません。父親は我々の仲間だったが、母親は違う。彼らは彼を地上に連れて行き、子供の頃に彼をダメにした。そして戻ってきたが、彼は “簒奪者 “ではなかった。狩りは上手かったが… しかし、彼はここに閉じ込められたと感じた… でも、上には行けない。安全じゃないんだ 彼はゴングを鳴らすこともできないだろう”

次にみんなの自動翻訳

「彼はウシュの一人ではありません。いいえ、ウシュの一人ではありません。父はウシュの一人でしたが、母はそうではありませんでした。彼らは彼をshurfaceに連れて行き、子供の頃に彼を破滅させました。それから彼らは戻ってきましたが、彼はウシュの一人も洗いませんでした。良い猟師です、はい.しかし、彼はここに閉じ込められたfeelshをします.しかし、彼はそこにも行くことができません。安全ではありません。彼はゴングのlashtをしません。」

DeepLだと意味が通じる部分が多く、機械翻訳ながらもそのままプレイできる人が大半でしょう。一方のみんなの自動翻訳では、所々引っかかるところがあり、DeepL翻訳の後に見ていなければ「ん?どういうこと?」となってしまう人もいるかなという感想。

ちなみにGoogle翻訳の結果は以下の通り。

「彼はウシュ族ではありません。いいえ、ウシュ族ではありません。彼の父親はウシュ族の一人でしたが、彼の母親は — いいえ。彼らは彼を浅瀬に連れて行き、子供の頃に彼を台無しにしました。その後、彼らは戻ってきましたが、 彼はアッシュの 1 つではありませんでした.良いハンター、ええ..しかし、彼はここに閉じ込められていると感じています…しかし、彼もそこに行くことはできません.安全ではありません.彼はゴングを叩きません.

実はこれもイマイチで、みんなの自動翻訳のほうが文の繋がりがマシに感じる。DeepLの代替は厳しそうなので、また他の翻訳サービスを少し探してみます。皆さんも、もし気になる自動翻訳サービスがあったら調べてみてください。

今回利用させて貰った「みんなの自動翻訳@TexTra」の翻訳精度はゲーム中の会話となるとイマイチでしたが、専門的な文章が得意らしいのでまた別用途で使ってみることにします。サイエンスや特許専用の自動翻訳エンジンがあるみたいなので非常に気になります。

参考サイト:

コメント

タイトルとURLをコピーしました