開発中の廃課金シミュレーターが14言語対応(中国語(簡体字)、中国語(繁体字)、英語、フランス語、ドイツ語、ハンガリー語、イタリア語、日本語、韓国語、ポーランド語、ブラジルポルトガル語、スペイン語、トルコ語)を行うため、可能な限り効率的にかつ高品質に各言語に翻訳を行う必要があった。本記事では、私が実施したChatGPTを用いた翻訳のプロセスを紹介する。
なお、今回のケースはシミュレーションゲームにおける説明文等に用いる翻訳であるため、意味が通じればOKくらいのレベルの翻訳であり、ストーリー重視のゲームなどでキャラの心情やセリフ回しなどに拘りたい場合などは難しいことをご留意ください。
事前準備
実際にテキストの翻訳を行う前に、事前にやっておくべきことがいくつかある。
とくに、あとから変えようと思ったらめちゃくちゃ大変な要素もあるため、必ず開発を開始する前に確認しておくことを推奨する。
Localization Tableの準備
ゲーム内でTextMeshProなどを用いてテキストを入れ込む前に、Localization Tableを準備しておく。
Unity Localizationの設定やLocalization Tableの準備のやり方は調べたら出てくるし、ChatGPTなどに聞けば一発なのでここでは割愛。
大事なのは、テキストを直打ちしたりするのでなく、必ずLocalization String Eventを介してローカライズ可能な形でテキストを入れるようにすること。
コードからテキストを入れる場合も必ずテーブルから文字列を取得するようにしておく。
これさえ守っておけば、あとから言語を追加するのも簡単にできる。
Keyの命名規則の設計
これがめちゃくちゃ大事。
ChatGPT等で多言語翻訳を行う場合には、そのテキストがどのような用途で使われるのか、どのような背景があるものなのか、どんな話者が話す内容なのか、等のコンテキスト情報を与えると翻訳品質が劇的に上がる。
例えば、海外ゲームでよくある「解雇」を表す「Fire」が「火事」と翻訳されてしまうなどの問題は、コンテキストが足りないため起こる問題。正しく、「従業員を解雇するボタンに表示する文字」という情報が与えられていれば、このような誤訳は行われない。
コンテキスト情報を別途用意することもできるが、一番簡単なのが、Localization TableのKey名がそのままコンテキスト情報になる設計。
例えば、先ほどの解雇ボタンのテキストのKeyを、Button.Shop.Employee.FireみたいなKeyになっていれば、一目見てお店における従業員解雇ボタンに使われるテキストであることが分かる。
合わせて、Buttonに表示するテキストは必ず「Button.」から始まるという命名規則で統一しておけば、翻訳時にChatGPTへの指示で「「Button.」から始まるテキストはボタンに表示するテキストであるため、可能な限り簡潔に翻訳してください」みたいいまとめて指示を出せるので非常に効率が良くなる。
そのような形で、ショップ関係はShop.を付ける、従業員関係はEmployee.を付ける、などカテゴリごとに決まった命名規則でKeyを設計しておけば、Key名そのものがコンテキスト情報になるため、そういった命名規則をあらかじめ決めたうえでLocalization Tableへの登録を行うことを強く推奨する。
一度Keyを割り当ててしまうと、あとから変更することは非常に大変なため、開発開始時にルールを決めておくとよい。
特定のキャラのセリフにはそのキャラの名前をKeyに含める、などのルールを決めておけば、例えば「CharacterAはクールなキャラでぶっきらぼうな性格なので、CharacterAがKeyに含まれる場合にはその性格を考慮したうえで翻訳してください」みたいにすれば、口調もある程度コントロール可能。
テーブルの適切な分割
Localization Tableは1つのテーブルに大量のレコードを登録することもできるが、巨大なcsvになってしまうとChatGPTなどで一括で翻訳することができなくなり、手作業で分割が必要になったりするため、用途やシーンごとにテーブルを分けておくことを推奨する。
14言語翻訳では、セリフなど長いテキストを登録する場合は50~100レコードまで、ウィンドウタイトルなどの短いテキストを登録する場合は100~200レコード程度に収めるのがオススメとのこと(ChatGPTいわく)。
そのため、それくらいの規模感になりそうなら、テーブルを分割しておくと、後々csvをそのまま翻訳に回せて楽になる。
巨大ファイルをcodex等で自動ループを回させて翻訳する方法もあるが、翻訳品質に課題があったため、推奨しない形とする(時代が進めば、精度が上がってできるようになるかもしれない)
(できれば)英語翻訳の整備
最初のLocalization Tableに日本語文を登録する際に、できればChatGPTなどを使って、詳細なコンテキスト情報(どういう用途で、どんな背景がある文章なのか)を入れたうえで高品質な英語翻訳を用意しておくことを推奨する。
あとから多言語に翻訳する際、日本語1つから翻訳するより、日本語+英語が揃った状態で翻訳する方が、同音異義語などに強くなる。
また、英語であればある程度理解できる方も多いと思うので、あとで全く理解できないイタリア語とかフランス語とかの品質に不安を覚えるくらいなら、日本語+英語だけでもきちんと整備しておく方が後々楽ができる。
一旦日本語+英語を整備しながら開発を進め、最後に必要な言語の文だけ今回のやり方で追加するのが理想的な進め方。
ChatGPTを使った翻訳
まずやり方としては、Localization Tableに必要な言語のカラムを作る(やり方はChatGPT等に聞こう)→csvをエクスポート→ChatGPTで翻訳を追加→csvをインポート の流れ。
一つ気を付けるべきなのは、csvでkeyやidが少しでも変更されてしまうと、割り当てたLocalization Stringが解除されてしまうリスクがある点。
特にExcelなどで開いて、id列が数値扱いになって意図しないものに書き換わってしまうなどあった場合、割り当てが全滅してしまい、全てのLocalization Stringを割り当てなおしになるという地獄が発生するリスクがある。
そのため、基本的にExcelなどの表計算ソフトでは開かず(開いても保存しない)、微調整などを行いたい場合はVS Codeなどでテキストとして編集することを推奨。
また、csvインポートの作業を実施する前に、必ずGitなどを使用してバージョン管理を行うか、プロジェクト丸ごとバックアップを取っておくこと。
環境がぶっ壊れたら、すぐに元に戻せるようにしておく。
ChatGPTで翻訳する方法
オススメは、ChatGPTに「Unityでゲームを作成しており、Unity Localizationで多言語対応したい」という旨を相談し、最終的に「相談した内容をChatGPTで実施するためのプロンプトを設計してください」と聞く。
実際にテーブルのcsvを渡して、「このテーブルを翻訳したいんだけどどうすればいい?」等聞けば全部教えてくれる。
で、そのあとに「では実際にそれを行ってください」と指示しながらcsvを投げる。これでOK。
後述する、用語集の整備とKey情報の整備を行っておけばかなり高品質に翻訳ができる。
用語集の整備
例えばゲーム内で頻繁に使用するパラメータ名やステータス名、キャラの名前やアイテムの名前など、一貫性を保ちたい名前に関しては、一括自動翻訳ではなく手作業で1つずつ詳細なコンテキストを与えて全言語に翻訳しておくことを推奨。
そしてそれらの翻訳情報をcsvにまとめたものを用意して用語集として整備しておく。
ChatGPTに翻訳を依頼する際、「添付した用語集を参照し、そこに登録されている名称に関しては一貫性を保つように翻訳すること」等を追加すると使用してくれる。
用語集を使ったやり方に関しても、ChatGPTに聞きながらプロンプトを整備すると良い。
Key情報の整備
前述した、Keyの命名規則に従ったコンテキスト情報をまとめる。
Button.* → ボタンに表示するテキストのため、簡潔に翻訳してください。
Desc.* → システム的な説明文のため、丁寧で分かりやすい形で翻訳してください。
みたいな形。
Key情報を使った翻訳指示も、ChatGPTにやり方聞けばふさわしいやり方を教えてくれるので、実際に聞いてみるのが早い。
翻訳の実施
KeyやIdを絶対に変更しないこと、{value}などのプレースホルダーも変更しないこと、などの制約を盛り込み翻訳を実施する。
与えるファイルは、翻訳対象のcsv(Localization Tableをエクスポートしたやつそのまま)、用語集のcsv、Key情報(これはファイルにまとめても、プロンプトとして与えてもどちらでもいいと思う)の3つ。
出力として、Localization Tableにそのままインポートできる形式のcsvを指定しておく。
出力できたら、それをそのままUnityインポートするのでなく、必ず後述するチェックプロセスを実施すること。
翻訳成果物のチェック
成果物として得たcsvを張り付け、「Unityプロジェクトにインポートするファイルとして問題がないか、最終チェックを行ってください」等指示し、翻訳漏れがないか、正しく各言語に翻訳できているかなどをチェックさせる。
意外と、ポーランド語の欄にロシア語入れちゃってたり等、しょうもないミスがあることもある。
翻訳タスクに比べるとチェックのタスクは簡単みたいで、問題があれば高精度に見つけてくれていた。
問題があった場合、「その問題を修正したcsvを出力してください」等指示して修正させる。
そして出てきたcsvを再びチェックさせる。
私のケースだと、3~4回往復しないとチェックをクリアしないこともあった。
必ずChatGPTの最終チェックをクリアしたことを確認してから、翻訳の完成とすること。
翻訳の完成
完成した翻訳csvをLocalization Tableにインポートし、Localization String Eventなどの参照が壊れてなければ、無事翻訳完了です。
念のため、全言語で通しテストを行うことを推奨します。

