🚗

AIを活用したアプリ多言語化の効率化 - OpenAI APIによる高精度翻訳システムの構築

に公開

1. はじめに

株式会社Sally CTO の @aitaro です。普段はマーダーミステリーアプリ「ウズ」とマダミス制作ツール「ウズスタジオ」、マダミス情報サイト「マダミス.jp」を全力で開発しています。

以前の多言語化シリーズでは、Golangでの自作多言語対応の基本実装と、Notionと翻訳ファイルを双方向同期するシステムについて紹介しました。

本記事では、この仕組みをさらに発展させ、OpenAI APIを活用した自動翻訳システムの構築について解説します。翻訳作業を自動化することで開発者の負担を軽減しつつ、高品質な多言語対応を実現する方法を紹介します。

2. アプリ多言語化の上で解きたい課題

前回までの仕組みにより、エンジニア以外も翻訳作業に参加できるようになりましたが、以下の課題が残っていました:

  1. 開発工程と翻訳工程の分離

ウズの開発では GitHub Flow を採用しており、mainブランチは常にデプロイ可能な状態であることが求められます。この前提では、新機能、機能改修を実装する度に翻訳が必要になる場合にPR上での作業が求められますが、PR上で開発チームと翻訳チームの作業が連続的に発生すると、PRのライフタイムが長期化し、開発生産性が低下してしまいます。
GitHub Flow を維持しつつ、開発工程と翻訳工程の分離を行うことが開発生産性を落とさずに多言語化を行うのに必須の要件でした。

  1. 翻訳業務の効率化

弊社ではマーダーミステリーという言語依存性の高いゲームを扱う性質上、リリースするアプリには高い翻訳品質が求められています。一方でtoCアプリとして、どの国の市場に刺さるのかをクイックに検証する必要があります。翻訳業務より校正業務の方がタスクとしての難易度は低いので、AIに翻訳を行ってもらい、人間がその結果を校正するというフローが最も費用対効果の高い方法だと考えました。

3. 開発工程と翻訳工程を分離するためのリリースフロー

「開発工程と翻訳工程の分離」の必要性についてより具体的に理解するため、弊社のリリースフローについて簡単に説明します。

  1. 開発工程

    • 機能開発時、エンジニアは日本語のテキストのみを実装
    • PR上でAI翻訳が自動的に実行され、多言語の翻訳が翻訳ファイルに追加される
    • 翻訳の校正を待たずにmainにマージを行う
  2. 翻訳工程

    • マージ後、Notionの翻訳DBに新しいキーが自動追加される
    • 翻訳担当者がAI翻訳の校正を行う
    • 修正が完了したら翻訳完了とマーク

このようなリリースフローを構築することで、開発工程と翻訳工程を分離し、開発スピードを落とすことなく多言語化対応が可能となります。
トレードオフとして、翻訳担当者のチェックが終わっていない文章がリリースされる可能性がありますが、翻訳担当者がこまめにチェックする体制と、特に大きな機能の場合はフィーチャーフラグを用意してユーザーへのロールアウト前にチェックが完了する仕組みを整えています。

4. システム全体像

辞書ファイル、OpenAI API、および前記事で言及したNotionとの連携を組み合わせた翻訳システムの全体像は以下のようになっています。

5. 翻訳のためのプロンプト

AIによる翻訳の精度は、プロンプトの設計に大きく依存します。以下は、実際に使用しているプロンプトの構造です(一部簡略化しています。):

let baseSystemPrompt = `You are a translator specializing in localizing app UIs for multilingual support. `;

let userPrompt: string;

if (Object.keys(texts).length == 1) {
  const originLanguage = Object.keys(texts)[0];
  const text = texts[originLanguage];
  baseSystemPrompt += `Translate the following text to ${targetLanguage} accurately, considering the context of a Murder Mystery app built with Flutter.`;
  userPrompt = `Translate the following ${originLanguage} text to ${targetLanguage}: ${text}`;
} else {
  const languages = Object.keys(texts).join(",");
  let combinedText = Object.entries(texts)
    .map(([language, text]) => `${language}: ${text}`)
    .join("\n");

  baseSystemPrompt += `The content provided is in multiple languages(${languages}), and you should use the combined information from all languages to generate the most accurate translation into ${targetLanguage}, preserving the meaning and context of the app. `;
  userPrompt = `Translate the following texts into ${targetLanguage} by combining the meaning from all languages:\n${combinedText}`;
}

  baseSystemPrompt += `Use the provided word list for translations where applicable, and prioritize using words from the list. If a word appears in the word list, prioritize that translation.
Here is the word list:\n\n${wordListString}`;

try {
  const response = await openaiClient.chat.completions.create({
    model: "gpt-4o",
    messages: [
      {
        role: "system",
        content: baseSystemPrompt,
      },
      {
        role: "user",
        content: userPrompt,
      },
      {
        role: "assistant",
        content:
          "Translate the text accurately without adding additional explanations or context, and output only the translated text.",
      },
    ],
    max_tokens: 100,
  });

6. 精度向上のための工夫

1. プロダクト特有の用語集の活用

翻訳の一貫性を確保するため、プロダクト特有の用語集を作成し、OpenAI APIへのプロンプトに含めています。

ja: アクション, zh-TW: 行動, ko: 행동
ja: アリバイ, zh-TW: 不在場證明, ko: 알리바이
ja: イベント, zh-TW: 場次, ko: 이벤트

これにより、以下のメリットが得られました:

  • 一貫した専門用語の翻訳 - 同じ日本語の単語が常に同じ外国語に翻訳される
  • 表記ゆれの防止 - 「探偵」と「名探偵」のような類似概念の翻訳が明確に区別される
  • ブランド名などの固有名詞の保護 - サービス名やキャラクター名が適切に処理される

2. 複数言語からの翻訳入力

ウズではすでに複数の言語で展開されており、新しい言語のサポートを追加するとき、翻訳精度を高めるために、単一言語からではなく、複数の既存言語の翻訳を入力として利用しています。

例えば、簡体中国語(zh-CN)への翻訳を行う場合:

  • 日本語(ja)からの直接翻訳だけでなく
  • 既に翻訳済みの繁体中国語(zh-TW)や英語(en)の情報も活用

この方法には以下の利点があります:

  • 言語的近接性の活用 - 例えば、簡体中国語と繁体中国語は言語的に近いため、より正確な翻訳が可能
  • 文化的ニュアンスの保持 - 複数言語の情報を組み合わせることで、文化的文脈をより適切に反映
  • 誤訳リスクの低減 - 単一言語からの翻訳で生じる可能性のある誤解を複数のソースで検証

欧州系の言語では、日本語→英語→その他言語というパスが効果的であることが多いですが、繁體中文→簡体中文等、アジア言語間では直接の翻訳パスが精度の高いケースもあります。

具体例

例えば、「探偵が事件を解決した」という日本語テキストを翻訳する場合:

単一言語入力(日本語のみ)の場合:

Input: ja: 事件は解決した
Output (zh-CN): 案件已解决

複数言語入力の場合:

Input:
ja: 事件は解決した
en: The detective solved the case
zh-TW: 偵探解決了案件

Output (zh-CN): 侦探解决了案件

日本語は主語が省略されることが多いため、多言語化した際に不自然な表現になったり主語を誤ったりすることがあります。このとき、他の言語の入力を補うことでより翻訳精度を向上させることが可能になります。

7. まとめ

本記事では、OpenAI APIを活用した自動翻訳システムについて解説しました。このシステムにより、以下の課題を解決することができました:

  1. 開発工程と翻訳工程の分離
    GitHub Flowを維持しつつ、PRのライフタイムを短縮。開発者は日本語テキストのみを実装し、AI翻訳が自動で追加されることで、翻訳を待たずにマージが可能になりました。

  2. 翻訳業務の効率化
    AIによる自動翻訳と人間による校正という流れを確立することで、コストと効率のバランスが取れた多言語化プロセスを実現しました。

また、翻訳精度向上のために行った工夫として:

  • プロダクト特有の用語集の活用で一貫性のある翻訳を実現
  • 複数言語からの翻訳入力により、より正確で文化的ニュアンスを捉えた翻訳を可能に

多言語対応がソフトウェアの開発速度低下を招き、それでいてビジネス的に海外展開が思うように進まず、不要に労力が割かれているという声をよく耳にします。多言語対応のコストを完全にゼロにすることは難しいですが、本記事で紹介したアプローチはそのコストを大幅に削減することに貢献するでしょう。

これらの取り組みにより、マーダーミステリーという言語依存性の高いジャンルにおいても、開発速度を落とすことなく高品質な多言語対応を実現できています。この仕組みは様々なプロダクトにも応用可能であり、グローバル展開を目指す開発チームの一助となれば幸いです。

採用情報

Sally社では、新しいエンタメ領域のプロダクト開発に興味を持ったエンジニアを募集しています!
この記事を読んで、話を聞いてみたいという方は↓よりカジュアル面談をお申し込みください。

https://uzu.one/s/recruit

UZU テックブログ

Discussion