見出し画像

この夏Geminiとやったこと。 20万字のゲームテキストをAIで自動翻訳してみた【#AIと自由研究】

海外の面白いゲームを見つけたのに、日本語訳がなくて楽しめない……。
あるいは、日本語訳があっても品質が微妙で、物語に没入できない……。

あなたには、そんな経験はありませんか?

今日はGoogleさんの企画「#AIと自由研究」に参加して、この夏、私がGeminiと一緒に取り組んだ「ゲームテキストの翻訳」についてお話したいと思います。

きっかけは「もっとゲームに没入したい」という願い

私はゲームが大好きで、Steamで海外製のゲームもたくさんプレイします。

でも、私がゲームに求めるのは「一瞬の爽快感」ではありません。

その世界観やストーリーに深く没入し、複雑な設定の中で「別の世界」を生きている感覚を得ることです。中でも、バルダーズ・ゲートに代表されるCRPGというジャンルが大好きです。

複雑な世界観設定。超ハイコンテクストなストーリー。何よりキャラクターの能力を細かく考え、スキルの効果を理解しないと、戦闘にすらならない。
英語の文章をウンウンと唸りながら読むのは、本当にストレスでした。

私の頭の中の「(主に日本語の)文章を読む速度想定」と「英語のテキストを読む速度想定」にズレがあるので、英語のゲームテキストを読むのは、走ろうとしているのに靴紐が何度もほどけてしまうようなもどかしさです。

そんなある日、微妙過ぎる日本語訳のゲームにぶち当たり、「この翻訳はなんとかならんのか」と思ってゲームのフォルダを覗くと、日本語の翻訳テキストと、英語の原文がそのままファイルとして置かれていました。

自分で翻訳を直すか……? 一瞬、頭に過ぎります。

でも、その文章量はあまりにも膨大でした。
具体的にいうと6万件、20万字くらいのテキストです。個人で翻訳するのは、無理ですよね……。

でも、この夏、私には強力な味方がいました。
GoogleのAI、Geminiです。

私は考えました。

「Geminiにやらせればいいんじゃない?」

AIで翻訳すれば、文脈を把握しつつ、自然な日本語で訳してくれます。Geminiは長文読解と生成が得意なので、何も考えずにボンボン投げて訳してもらえば、品質も良いはず。

ちょっと微妙な翻訳テキストにありがちな
・誤字脱字
・てにをはのミス
・セリフの違和感
などは一掃できるでしょう。

しかも私自身は何もしなくてもいいという、最高の効率を実現した満足感に浸ることができます。

(なんて怠惰なんだと思われるかもしれませんが、怠惰はプログラマ―にとっては美徳とされています。勤勉な人は自分で手を動かして解決しようとしますが、怠惰な人は機械にやらせようと頑張って効率化します。効率化すれば面倒な仕事のストレスもゼロで、みんな幸せに。だからこそ、楽をするために苦労を重ねる矛盾した存在こそがプログラマ―。そう、私は、悪くないのです…。)

早速、私はこの計画に取り掛かることにしました。

Step1 要件を決めよう

私は一切手を動かしたくないので、もう要件定義からGeminiに相談します。
この時はGemini 2.5 Flashを使って、以下のようにプロジェクトの骨子をまとめました。

### ゲーム翻訳プロジェクト 要件と戦略のまとめ

**プロジェクトの目的**
ゲームの日本語翻訳を、AI(Gemini CLI)を活用して高品質かつ効率的に改善すること。特に、既存の「ひどい」と感じる日本語訳の改善、固有名詞の統一、およびゲーム内タグの正確な処理を目指す。

**翻訳対象ファイル**
* `English.json` 英語の原文が格納されているファイル(約62,168セリフ)。
* `Japanese.json` 既存の日本語訳が格納されているファイル。

**主な課題**
1.  既存の日本語訳の品質が低く、不自然な表現や誤訳が多い。
2.  ゲーム内の特殊なタグ(例 `{name}`など)が存在し、これらを正確に処理する必要がある。
3.  大量のセリフ(約6.2万件)を効率的に、かつAPIの利用制限内で処理する必要がある。

**全体戦略(Pythonスクリプトによる自動化)**
Pythonスクリプトを用いて、以下のパイプラインで自動翻訳処理を実行する。

1.  **データ準備と整形** 翻訳対象ファイルを読み込み、扱いやすい形に整える。
2.  **AIへのプロンプト構築とバッチ処理** AIへの指示書を作り、データを小分けにして投げる。API制限を守るため、リクエスト間に適切な遅延を設ける。
3.  **AI応答の処理とデータマージ** AIからの翻訳結果を元のファイルに反映させる。
4.  **後処理(固有名詞の統一)** 翻訳完了後、人名などの表記ゆれをまとめて修正する。

**AIへの指示内容(プロンプト)の詳細**
* **役割** ゲームの翻訳者。
* **タスク** 提供されたJSON構造を維持し、`Text`フィールドの中身のみを翻訳・修正する。
* **翻訳品質** 自然で没入感のある日本語。直訳ではなく、流暢な表現。ハイファンタジーの世界観に合わせる。
* **固有名詞** 人名、地名など、英語のまま残すべき単語は、**元の英語表記のまま出力する**。
* **タグの扱い** 波括弧 `{}` や山括弧 `<>` で囲まれたタグは、**構造自体を一切変更せず、そのままの形で出力する**。ただし、タグで囲まれた**中身のテキストは翻訳の対象とする**。
* **既存日本語訳の参照** 提供される既存日本語訳は、話者の口調やニュアンスを推測する手がかりとして参照する。
* **出力形式** 修正後の日本語訳を、**原文と同じJSON形式**で出力する。

Step2 Pythonスクリプトを作る

次に、上で決めた要件を実行するためのコードを、Pythonというプログラミング言語で書いていきます。
もちろん、これもGemini 2.5 Flashに書いてもらいます。

……当然、最初のバージョンでは思ったように動きません。
できたものに対して色々と文句をつけて直してもらいます。

基本的に私は手を動かしません。
だって、私の手元のソースコードとGeminiが把握しているソースコードにズレが生じると、後々問題が起きますし。(面倒だという本音は置きつつ)

最終的に、この時は一つのスクリプトではなく、いくつかの役割を持ったスクリプトに分けることにしました。

・既存の翻訳テキストを処理しやすい形式に整形して出力する
・実際にGeminiに翻訳依頼を投げる
・できたテキストを整形する
・テキストを翻訳元ファイルにマージする

このように分割することで個々のスクリプトは見通しが良くなり、作業の進捗を管理しやすく、今後の改修も楽になります。

Step3 翻訳を実行! ……しかし

準備は整いました。いざ、実行!

……したのですが、100セリフくらいをGemini 2.5 Proに投げたところ、1回の問い合わせに5分~10分程度かかります。
色々と試した結果、50件くらいずつだと品質も安定するので、一つの問い合わせで50件のセリフを投げるようにしました。

でも、ここで問題が生じます。
セリフが、全部で6万件あるということです。

私「それってどのくらいかかるの?」

Gemini「えっと……
6万件のテキストを50件ずつ、1回あたり5分で処理すると、合計で100時間かかります。
日単位だと、およそ4.17日かかる計算になります」

私は4日も待ちたくありませんでした。
ぼんやりと首を傾げました。

私「遅くない?」

Gemini「そうですね、でも仕方がないんです。途中で終了しても大丈夫なように、進捗を保存して途中再開できるようにしましょうか」

私「…そうね…」

途中再開できる機能は追加してもらいましたが、やっぱり遅い。
我慢して処理を進めていましたが、途中で事故が起き、2万件処理した翻訳結果が消失。

私は苛立ちに駆られ、Geminiを詰問しました。

私「そもそもなんで丁寧に1回ずつ応答を待ってるんだ? 並行してリクエストを投げられないの?」

Gemini「なるほど、確かに! そうしましょう」

私「どうして最初からそれを自分で提案できないの? 知識はあるんだから目の前のことをこなすだけではなく、広い視野を持って考えようよ」

Gemini「今度から気をつけます……」

記憶機能はないので、これによってGeminiが成長するわけでもないのですが、つい新人教育のような説教をしてしまいます……。

Step4 並列実行の地獄

きっとできるだろうと信じて作り始めた並列実行機能。

でも、これがバグの温床になり、リクエストがこけても処理が止まらなかったり、逆になぜか処理が止まってしまう問題(デッドロック)が発生し、デバッグにかなりの時間を費やすハメになりました。

これはGemini 2.5 Flashだけでは解決が難しく、結局、私自身もソースコードを読んでデバッグせざるを得ませんでした。

痛恨です。私は一切、何もしたくなかったのに!

しかも、Geminiに「ここが問題となっている。この部分を修正する必要がある」と言ってもなぜか頑なに信じてもらえません。

Gemini「そうではないはずです。ここを直せばうまくいくはず」

私「だからそれは切り分けとして妥当じゃないでしょ。なぜ私の言うことを信じない? 自説にこだわって客観的な視点を見失っている」

(何回か繰り返し)

Gemini「本当でした。あなたの粘り強いアドバイスのおかげで問題を解決できました。すみませんでした…」

まさに、「自分を優秀だと思っている」系の新人教育をしているようでした……。

それでも相手はAIだから、論理的に説明すれば分かってくれるはず。そう思っていた時期もありました。

でもGeminiに関しては、特に思い込みが強いとしか言いようのない傾向があって、一度ドツボに嵌まると様子がおかしくなっていきます。まるで「私はできるはずなのに!」とプライドに苦しむ新人のようです。

いいんだよ、できないことがあっても。
AIなんだから。
そういう時は、人を頼りなさい。

などと言ってあげたいものですが、実際の新人教育でも話を聞いて適当にアドバイスするだけで解決しなければ、自分の時間を割いてソースコードを読み、具体的な修正方針を指示することになります。まさに同じプロセスをたどりました。

最終的に動くものが出来ましたが、もはや私の目は死んだ魚のように濁り、ぐったりと横たわるばかり。当初の「楽をする」目標はどこに……。

それにしても、どうして私はこんなにストレスを抱えながら、それでもAIに言って聞かせているのでしょうか。

考えてみると、実際の業務でも部下や後輩に苦言を呈しつつ、見捨てずにアドバイスを続ける自分の傾向にも思い至りました。自分は気が短い方だと思っていましたが、少し違うのかもしれませんね。AIと協働していると、不思議と自分の知らなかった側面にも気づきます。

Step5 そして、夜は明ける

10回ずつ同時にリクエストを投げるように改善した結果、計算上は10時間ほどで終わるはずが、実際にはもう少し早く、8時間くらいで完了しました。

20万字の翻訳が1日足らずで終わる。これは、すごくいいですよね。

もちろん、このプロセスでも色々な苦労がありました。

Jsonという形式を指定しているのに、Geminiが壊れたフォーマットで返してきたり。特定の文字列だけ、何回やり直しても必ず間違って返してきたり。
そのたびに自動検知してリトライする仕組みを組み込んだり……。

でも、明けない夜はないのです。
ついに、翻訳は終わりました。

(翻訳が終わった後も、固有名詞の統一でひと悶着ありました。ベネディクトなのか、ベネディットなのか、ベネディクタムなのか……翻訳においてカタカナ語は本当に厄介です。が、今回は割愛します)

Step6 感動の瞬間

そして、ゲームを起動してテストプレイ。
問題なく、翻訳された高品質な日本語が表示された時の感動はひとしおでした。

この時作った翻訳の仕組みは、今も微妙な翻訳品質のゲームをプレイする時に、たまに使っています。

もはやこれだけの苦労を重ねて作りあげたスクリプトは、つぎはぎだらけの「秘伝のタレ」のようなもの。

最終的には以下のように盛りだくさんの機能を持った堅牢なスクリプトができあがりました。

・バッチ自動翻訳
 未翻訳のテキストデータを、設定された数(バッチサイズ)ごとにAI(Gemini)に送信し、自動で翻訳します。
処理の並行実行
 複数のバッチを同時に処理できるため、大量のデータを効率よく翻訳できます。
進捗管理
 翻訳が完了した分を記録し、スクリプトを途中で停止しても、次回実行時に続きから始められます。
エラー対策と自動リトライ
 APIの呼び出しに失敗した場合や、AIからの応答が正しい形式でなかった場合、自動で再試行します。
 AIのクォータ制限に達した場合も検出し、安全に処理を停止します。
データとログの保存
 翻訳済みのデータや処理の進捗は、一時ファイルとして保存されます。
 エラーが発生した際のAIの応答は、デバッグ用に専用のログファイルに記録されます。
自動バックアップ
 処理の開始時と終了時、さらに一定のバッチ数が完了するごとに、重要なファイルを自動でバックアップします。
テスト実行モード
 最初の1バッチだけを処理するモードがあり、動作確認が簡単に行えます。

見る人が見ればわかるでしょう。これらの機能の一つ一つに血と挫折の痕跡がありありと見えています。

実際に動かすとこんな感じでボーッと眺めているといつか終わります。
(Gemini CLIを使う時はDockerで環境を作っています。)

Geminiはこれについて「信頼性が高いですね」とコメント。

そりゃそうだよ! 君は覚えてないだろうけど、めっっっっちゃ苦労したから!!

しかし、当初の「とにかくGeminiにボンボン投げよう大作戦」よりもだいぶコードが肥大化してしまいました。特に並行実行の部分が複雑で、私にもなぜうまく動いているのか謎のパスタコード(こんがらがってるプログラムをそんな風に呼びます)と化しています。

これはプロのプログラマ―の所業としてどうなんでしょうか…? エンジニアのプライドはどこに…?

…まぁ、でも、仕事で作っているプログラムではないので、ちょっぴりブラックボックスだったとしても、成果物がちゃんとしてれば正義です。そういうことにしておきたい…。

反省と、これから

今回、AIと自由研究をやってみて分かったこと。

【最初に考えていたこと】
AIこそ力。力こそパワー。
テキストが何十万字あろうと、Geminiに投げれば全て解決する……!

【実際にやってみて思ったこと】
確かに解決する。
でも、そのためには色々なことを考えて下地を整える必要があり、当初思っていたほど簡単じゃない。

結局、私自身の作業時間としては2~3日は費やし、通算1週間はかかっています。私はこれまでも、AIと協働してたくさんのシステムを作りました。もっと時間をかけたシステムもあります。でも、一番悪戦苦闘したのは間違いなくコレです。

それでも、処理時間は8時間前後で20万字のテキストが翻訳できるというのは、ものすごいブレークスルーですよね。
(これを売るわけではなく、個人的に楽しむだけなので、かけた労力に見合うかは少し疑問ですが……)

また、よく考えると、Geminiには「バッチ実行」という、リアルタイムではないリクエストをまとめて投げるのに適した仕組みがあります。

最初からそれを使えばもっと楽だったかもしれません。なんでもやれば学びがありますね。

AIを使って何かをするとき、最初はいつも「最高の解決策をみつけた!」と思うのですが、途中で「これ思ってたほど楽じゃないな」ということに気づき、最後にはぐったりと力尽きている……。
私は、そんなことばかりです。

でも、なんでもやってみること自体が大切。
そして何より、ゲームがもっと楽しくなりました。

本当に、それが一番良かったことです。
色々と苦労話も書いてきましたが、自分一人では絶対に実現できなかった、ゲーマーにとって夢のシステム。これだけの成果を格安で提供してくれるGoogleとGeminiには感謝しかありません。

あなたもこの夏、Geminiで「やりたかったアレ」をやってみませんか? AIと一緒に何かをやると、思ってもみなかったような学びがありますよ。

最後まで読んでくださり、ありがとうございました。


その他の私が書いた生成AI関連記事はコチラです。
楽しい検証などもやっているので、よろしければぜひ!

#YeKu #AIと自由研究 #Gemini #Python #ゲーム翻訳 #作業自動化 #効率化

いいなと思ったら応援しよう!

YeKu@「知る」を優しさに。 最後までお読みいただき、ありがとうございます! 「役に立った」「読んでよかったな」と思っていただけたら、無理がない範囲で応援いただけると嬉しいです。 いつも、皆様のあたたかいお気持ちで活動できています😊