このガイドのゴール

  • アプリに翻訳機能を組み込み、ユーザーが多言語コンテンツを扱えるようにする
  • DeepL API・Google Gemini(LLM 翻訳)・OpenAI(LLM 翻訳)の特性を理解し、用途に応じて使い分ける
  • コスト構造とレート制限を把握し、本番運用で破綻しない設計を作る

翻訳 API には「専用翻訳エンジン」と「LLM による翻訳」の 2 系統があります。それぞれ得意分野が異なるため、要件に応じた選定が必要です。

🧩 このガイドで使うリソース
翻訳の目的に応じて選択する
🎯 翻訳品質重視
DeepL API
欧州言語↔日本語の翻訳精度が高い。用語集(Glossary)で訳語を統一できる。
🧠 文脈を読む翻訳
Google Gemini
長文コンテキストを保持したまま翻訳可能。無料枠でプロトタイプを検証できる。
🔧 カスタム翻訳
OpenAI GPT
翻訳+要約・トーン変換を同時に実行可能。プロンプトで出力形式を細かく制御できる。

専用翻訳 API と LLM 翻訳の違い

翻訳機能を実装する前に、2 つのアプローチの根本的な違いを理解しておく必要があります。

観点 専用翻訳 API(DeepL) LLM 翻訳(GPT / Gemini)
翻訳精度 言語ペアによっては非常に高い。特に欧州言語 文脈理解が深く自然だが、用語の一貫性は不安定
レイテンシ 50〜200ms 程度 1〜10 秒(モデルとトークン数による)
コスト単位 文字数課金 トークン数課金(入力+出力)
用語統一 Glossary 機能あり プロンプトに用語集を含める(トークン消費)
対応言語数 DeepL は約 30 言語 事実上ほぼ全言語(品質は言語による)
カスタマイズ 限定的(フォーマリティ設定等) プロンプトで自在に制御
📌
DeepL の対応言語は約 30 言語に限られる

アラビア語、ヒンディー語、タイ語など、DeepL が未対応の言語を扱う場合は LLM 翻訳一択になります。対応言語は DeepL の公式ドキュメントで最新状況を確認してください。

アーキテクチャ: 翻訳パイプラインの設計

🔧 翻訳パイプラインの全体像
入力テキストを前処理し、適切なエンジンに振り分ける構成
📝 入力テキスト 言語検出含む 前処理 言語判定 HTML タグ保護 分割(長文時) 振り分け 言語+用途で判定 DeepL API 定型翻訳・高速 OpenAI GPT 翻訳+加工が必要な場合 Google Gemini 長文コンテキスト翻訳

用途別の選定基準

DeepL API を選ぶケース

  • UI ラベル・ヘルプ文書の定型翻訳 — 速度と一貫性が重要
  • Glossary で訳語を揃えたい — 製品名や技術用語の表記ゆれ防止
  • 欧州言語がメイン — 英独仏西などは翻訳品質が特に高い

DeepL の Free プランは月 50 万文字まで無料で使えます。Pro は従量課金で、文字数ベースの料金体系です。

LLM(OpenAI / Gemini)を選ぶケース

  • 翻訳+要約を同時に行いたい — 「英語の記事を日本語 200 字で要約」のような複合タスク
  • トーン指定が必要 — 「カジュアルに」「ビジネス文書として」等をプロンプトで制御
  • DeepL 未対応言語 — タイ語、ベトナム語などの翻訳
⚠️
LLM 翻訳のレイテンシは専用 API の 10〜50 倍になる

GPT-4o で 500 文字の翻訳に 2〜5 秒かかります。リアルタイム翻訳(入力中にプレビュー表示)には向きません。バッチ処理や非同期翻訳として設計してください。

実装パターン

パターン 1: DeepL で同期翻訳

// DeepL API — シンプルな同期翻訳
$response = Http::withHeaders([
    'Authorization' => 'DeepL-Auth-Key ' . config('services.deepl.key'),
])->post('https://api-free.deepl.com/v2/translate', [
    'text' => [$sourceText],
    'source_lang' => 'EN',
    'target_lang' => 'JA',
    'glossary_id' => $glossaryId, // 用語集(任意)
]);

$translated = $response->json('translations.0.text');

パターン 2: LLM で文脈付き翻訳

# OpenAI — コンテキストを含めた翻訳
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": (
            "技術文書の翻訳者として振る舞ってください。"
            "以下の用語は訳さずそのまま使ってください: API, SDK, webhook"
        )},
        {"role": "user", "content": f"以下を日本語に翻訳:\n\n{source_text}"}
    ],
    temperature=0.3,  # 翻訳は低めが安定
)

パターン 3: ハイブリッド(振り分け)

定型コンテンツは DeepL、文脈が必要なコンテンツは LLM に振り分ける構成です。

def translate(text, context=None, target_lang="JA"):
    if context is None and target_lang in DEEPL_SUPPORTED_LANGS:
        return deepl_translate(text, target_lang)
    else:
        return llm_translate(text, target_lang, context)

コスト比較

サービス 課金単位 100 万文字あたりの目安
DeepL Free 文字数 無料(月 50 万文字まで)
DeepL Pro 文字数 数千円台
OpenAI GPT-4o トークン 数千〜1 万円台(入出力の比率による)
Google Gemini Flash トークン 無料枠あり。有料でも GPT-4o の数分の 1
💡
LLM 翻訳のコストは「入力+出力」の合計トークンで決まる

翻訳では入力と出力がほぼ同じ長さになるため、通常の LLM 利用よりも出力トークンの割合が高くなります。出力トークンの単価は入力の数倍なので、コスト見積もり時は注意してください。

本番運用の注意点

HTML タグの保護

翻訳対象テキストに HTML が含まれる場合、タグ構造が壊れるリスクがあります。DeepL は tag_handling: xml オプションでタグを保護できますが、LLM ではプロンプトで「HTML タグは変更しないこと」と明示する必要があります。

キャッシュの導入

同じテキストを何度も翻訳しないよう、翻訳結果をキャッシュしてください。DB やメモリキャッシュに (source_text_hash, source_lang, target_lang) → translated_text を保存するのが定番です。

フォールバック設計

DeepL がダウンした場合に LLM にフォールバックする、またはその逆の設計を入れておくと運用が安定します。

まとめ

  • 速度と一貫性が最優先 → DeepL API(Glossary で訳語統一)
  • 翻訳+加工の複合タスク → OpenAI GPT(プロンプトで制御)
  • 長文+文脈保持+コスト抑制 → Google Gemini Flash
  • 本番では キャッシュ・フォールバック・HTML 保護 を忘れずに

この記事の情報は 2026 年 4 月時点のものです。各サービスの料金体系や対応言語は変更される可能性があります。