このガイドのゴール
- アプリに翻訳機能を組み込み、ユーザーが多言語コンテンツを扱えるようにする
- DeepL API・Google Gemini(LLM 翻訳)・OpenAI(LLM 翻訳)の特性を理解し、用途に応じて使い分ける
- コスト構造とレート制限を把握し、本番運用で破綻しない設計を作る
翻訳 API には「専用翻訳エンジン」と「LLM による翻訳」の 2 系統があります。それぞれ得意分野が異なるため、要件に応じた選定が必要です。
専用翻訳 API と LLM 翻訳の違い
翻訳機能を実装する前に、2 つのアプローチの根本的な違いを理解しておく必要があります。
| 観点 | 専用翻訳 API(DeepL) | LLM 翻訳(GPT / Gemini) |
|---|---|---|
| 翻訳精度 | 言語ペアによっては非常に高い。特に欧州言語 | 文脈理解が深く自然だが、用語の一貫性は不安定 |
| レイテンシ | 50〜200ms 程度 | 1〜10 秒(モデルとトークン数による) |
| コスト単位 | 文字数課金 | トークン数課金(入力+出力) |
| 用語統一 | Glossary 機能あり | プロンプトに用語集を含める(トークン消費) |
| 対応言語数 | DeepL は約 30 言語 | 事実上ほぼ全言語(品質は言語による) |
| カスタマイズ | 限定的(フォーマリティ設定等) | プロンプトで自在に制御 |
アラビア語、ヒンディー語、タイ語など、DeepL が未対応の言語を扱う場合は LLM 翻訳一択になります。対応言語は DeepL の公式ドキュメントで最新状況を確認してください。
アーキテクチャ: 翻訳パイプラインの設計
用途別の選定基準
DeepL API を選ぶケース
- UI ラベル・ヘルプ文書の定型翻訳 — 速度と一貫性が重要
- Glossary で訳語を揃えたい — 製品名や技術用語の表記ゆれ防止
- 欧州言語がメイン — 英独仏西などは翻訳品質が特に高い
DeepL の Free プランは月 50 万文字まで無料で使えます。Pro は従量課金で、文字数ベースの料金体系です。
LLM(OpenAI / Gemini)を選ぶケース
- 翻訳+要約を同時に行いたい — 「英語の記事を日本語 200 字で要約」のような複合タスク
- トーン指定が必要 — 「カジュアルに」「ビジネス文書として」等をプロンプトで制御
- DeepL 未対応言語 — タイ語、ベトナム語などの翻訳
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 利用よりも出力トークンの割合が高くなります。出力トークンの単価は入力の数倍なので、コスト見積もり時は注意してください。
本番運用の注意点
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 月時点のものです。各サービスの料金体系や対応言語は変更される可能性があります。