AI

セルフホスト翻訳比較:LibreTranslate vs Argos Translate vs OPUS-MT で機械翻訳を実現する

オープンソースラボ編集部2026年6月14日

セルフホスト翻訳比較:LibreTranslate vs Argos Translate vs OPUS-MT で機械翻訳を実現する

Google翻訳・DeepL APIへの依存から脱却し、機密文書・社内コンテンツをクラウドに送信せず自社サーバーで機械翻訳するOSSセルフホスト翻訳ツールが普及しています。LibreTranslate(REST API・最も使いやすい)・Argos Translate(オフライン・軽量)・OPUS-MT(Helsinki-NLP・研究水準)の3つが2026年のOSS機械翻訳主要選択肢です。

セルフホスト翻訳ツールを使う理由

  • プライバシー: 医療・法律・契約書等の機密文書をGoogle/DeepLのサーバーに送信しない
  • コスト削減: DeepL API($7.49/月・500K文字)→セルフホストでVPS費用のみ
  • オフライン運用: インターネット接続なしで工場・船舶・セキュア環境での翻訳
  • カスタマイズ: 専門用語(医療・法律・技術)に特化した翻訳モデルのファインチューニング

主要ツールの概要

LibreTranslate

2020年公開、Python製のOSSです。GitHubスター10k+。REST APIを提供するセルフホスト機械翻訳サーバーで、Argos Translateエンジンをバックエンドに使いHTTP APIで翻訳を提供します。DeepL/Google Translate APIの代替として、既存アプリのAPIエンドポイントをLibreTranslateに切り替えるだけで移行できます。

# docker-compose.yml: LibreTranslate
version: "3.8"
services:
  libretranslate:
    image: libretranslate/libretranslate:latest
    restart: unless-stopped
    ports:
      - "5000:5000"
    environment:
      LT_API_KEYS: "true"               # APIキー認証を有効化
      LT_API_KEYS_DB_PATH: /app/db/api_keys.db
      LT_LOAD_ONLY: ja,en,zh,ko,fr,de  # 必要言語のみ読み込み(起動高速化)
      LT_THREADS: 4                      # 翻訳スレッド数(CPUコア数に応じて)
      LT_CHAR_LIMIT: 5000               # リクエスト文字数上限
      LT_REQ_LIMIT: 100                  # レート制限(100リクエスト/日)
      LT_BATCH_LIMIT: 10                # バッチ翻訳の最大テキスト数
      LT_SUGGESTIONS: "true"            # 翻訳提案を有効化
    volumes:
      - lt_data:/app/db
      - lt_models:/home/libretranslate/.local/share/argos-translate

volumes:
  lt_data:
  lt_models:
# Python: LibreTranslate API で翻訳を自動化
import requests
import json

LT_URL = 'http://localhost:5000'
LT_API_KEY = 'your-api-key'

def translate(text: str, source: str = 'auto', target: str = 'ja') -> str:
    '''LibreTranslate APIで翻訳'''
    resp = requests.post(f'{LT_URL}/translate', json={
        'q': text,
        'source': source,
        'target': target,
        'api_key': LT_API_KEY,
    })
    resp.raise_for_status()
    return resp.json()['translatedText']

def detect_language(text: str) -> str:
    '''言語自動検出'''
    resp = requests.post(f'{LT_URL}/detect', json={'q': text, 'api_key': LT_API_KEY})
    detections = resp.json()
    return max(detections, key=lambda d: d['confidence'])['language']

def batch_translate(texts: list[str], target: str = 'ja') -> list[str]:
    '''複数テキストを一括翻訳'''
    resp = requests.post(f'{LT_URL}/translate', json={
        'q': texts,
        'source': 'auto',
        'target': target,
        'api_key': LT_API_KEY,
    })
    return [r['translatedText'] for r in resp.json()['translatedText']]

def translate_html(html_content: str, target: str = 'ja') -> str:
    '''HTML形式のテキストを翻訳(タグを保持)'''
    resp = requests.post(f'{LT_URL}/translate', json={
        'q': html_content,
        'source': 'auto',
        'target': target,
        'format': 'html',
        'api_key': LT_API_KEY,
    })
    return resp.json()['translatedText']

def get_supported_languages() -> list[dict]:
    '''サポート言語一覧取得'''
    resp = requests.get(f'{LT_URL}/languages')
    return resp.json()

# 使用例
en_text = 'Open source software enables organizations to collaborate and innovate freely.'
ja_text = translate(en_text, target='ja')
print(f'翻訳結果: {ja_text}')

# バッチ翻訳(例: 商品説明の多言語化)
products = ['Wireless keyboard', 'USB-C hub', 'Ergonomic mouse']
ja_products = batch_translate(products, target='ja')
print('商品名翻訳:', list(zip(products, ja_products)))

# Webスクレイプコンテンツの翻訳+言語検出
lang = detect_language('Bonjour, comment allez-vous?')
print(f'検出言語: {lang}')  # fr

# Next.js APIルートからLibreTranslateを呼び出す例
nextjs_route = '''
// app/api/translate/route.ts
import { NextRequest, NextResponse } from 'next/server'

export async function POST(req: NextRequest) {
  const { text, target = 'ja' } = await req.json()
  const resp = await fetch('http://libretranslate:5000/translate', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ q: text, source: 'auto', target, api_key: process.env.LT_API_KEY }),
  })
  const { translatedText } = await resp.json()
  return NextResponse.json({ translatedText })
}
'''

Argos Translate

2020年公開、Python製のOSSです。GitHubスター4k+。完全オフラインで動作する軽量機械翻訳ライブラリで、モデルパッケージ(.argosmodel)をインストールしてインターネット接続なしで翻訳できます。GUIアプリとPython APIの両方を提供し、LibreTranslateのバックエンドエンジンとしても使われています。

# Python: Argos Translate でオフライン翻訳
import argostranslate.package
import argostranslate.translate

def setup_offline_translation(from_code: str = 'en', to_code: str = 'ja'):
    '''翻訳パッケージをインストール(初回のみ・インターネット必要)'''
    # 利用可能なパッケージ一覧を取得
    argostranslate.package.update_package_index()
    available_packages = argostranslate.package.get_available_packages()

    # en→jaのパッケージを検索してインストール
    package = next(
        filter(lambda p: p.from_code == from_code and p.to_code == to_code, available_packages),
        None,
    )
    if package:
        download_path = package.download()
        argostranslate.package.install_from_path(download_path)
        print(f'インストール完了: {from_code}→{to_code}')

def offline_translate(text: str, from_code: str = 'en', to_code: str = 'ja') -> str:
    '''オフラインでテキストを翻訳'''
    return argostranslate.translate.translate(text, from_code, to_code)

# 使用例(完全オフライン)
setup_offline_translation('en', 'ja')  # 初回のみ
result = offline_translate('Hello, this is an offline translation test.', 'en', 'ja')
print(result)

# FastAPIで翻訳APIサーバーを構築
fastapi_server = '''
from fastapi import FastAPI
from pydantic import BaseModel
import argostranslate.translate

app = FastAPI()

class TranslateRequest(BaseModel):
    text: str
    from_code: str = "en"
    to_code: str = "ja"

@app.post("/translate")
def translate(req: TranslateRequest):
    result = argostranslate.translate.translate(req.text, req.from_code, req.to_code)
    return {"translated": result}
'''

OPUS-MT

Helsinki-NLP(ヘルシンキ大学)が開発したOSSマルチリンガル翻訳モデル群です(Hugging Face公開)。研究・学術水準の翻訳品質でOPUS(Open Parallel Corpus)で学習したMarianMT アーキテクチャを使います。HuggingFaceのTransformers経由でPythonから呼び出せます。

# Python: OPUS-MT(HuggingFace Transformers)で高品質翻訳
from transformers import MarianMTModel, MarianTokenizer
import torch

class OPUSTranslator:
    def __init__(self, model_name: str = 'Helsinki-NLP/opus-mt-en-jap'):
        self.tokenizer = MarianTokenizer.from_pretrained(model_name)
        self.model = MarianMTModel.from_pretrained(model_name)
        self.device = 'cuda' if torch.cuda.is_available() else 'cpu'
        self.model.to(self.device)

    def translate(self, texts: list[str], max_length: int = 512) -> list[str]:
        inputs = self.tokenizer(texts, return_tensors='pt', padding=True,
                                truncation=True, max_length=max_length).to(self.device)
        with torch.no_grad():
            translated = self.model.generate(**inputs, max_length=max_length)
        return [self.tokenizer.decode(t, skip_special_tokens=True) for t in translated]

# 使用例
translator = OPUSTranslator('Helsinki-NLP/opus-mt-en-jap')
results = translator.translate(['Open source software is essential for modern development.'])
print(results[0])

機能比較表

比較項目LibreTranslateArgos TranslateOPUS-MT
REST API❌(Python直接)❌(Transformers)
完全オフライン
翻訳品質✅ 学術水準
GPU対応✅(CUDA)
セットアップ容易さ✅(Docker)✅(pip)

セルフホスト翻訳はLLM Toolsカテゴリ/categories/llm-toolsのLlamaIndex・LangChainと組み合わせて「非日本語ドキュメントを翻訳→チャンク化→日本語RAG検索」という多言語RAGパイプラインを構築するユースケースが増えています。DevOpsカテゴリ/categories/devopsのKubernetesでLibreTranslateをサービスとしてデプロイして複数アプリが共有する翻訳マイクロサービス構成が採用されています。

FAQ

Q. LibreTranslateとDeepL APIの翻訳品質の差はどれくらいですか?

A. DeepLが全体的に高品質ですが、LibreTranslateは用途次第で十分実用的です。比較結果(英日翻訳・BLEU scoreベース): DeepL > Google翻訳 > LibreTranslate/OPUS-MT > Argos Translate の順が一般的傾向。LibreTranslateが有用なケース: ①大量の社内文書・技術マニュアルの一括翻訳(コスト最優先)②機密文書でクラウドAPIに送信不可③プリプロセスとして原文の言語検出のみ使用④翻訳後に人間が見直す想定のドラフト翻訳。OPUS-MTが強いケース: 科学論文・医療文書等の専門ドメインでは適切なモデルをHugging Faceから選択→DeepLに近い品質を出せる場合あり。実測例: 一般的なビジネス文書でDeepLと比べてLibreTranslateは誤訳5〜15%増が目安。

Q. LibreTranslateのAPIキー認証を設定してセキュリティを高めるには?

A. LT_API_KEYS=true設定後にCLIまたはAPIでキーを発行して各クライアントに配布します。設定: ①docker-compose.ymlのLT_API_KEYS: "true"を有効化②コンテナ内でキーを発行: docker exec -it libretranslate lt-manage-keys generate③APIキーを使ったリクエスト: {"q": "Hello", "source": "en", "target": "ja", "api_key": "your-key"}。キー別レート制限: LT_API_KEYS: trueの場合、APIキーなしのリクエストをブロックまたはレート制限→LT_REQ_LIMITでデフォルト制限、APIキーごとに異なる制限設定が可能(lt-manage-keys set-rate-limit)。用途別キー発行: アプリAに月100万文字・アプリBに月10万文字等の制限を個別設定。

Q. Argos TranslateでNext.jsアプリに組み込む場合の推奨構成は?

A. Argos TranslateをPythonマイクロサービス(FastAPI)でラップして、Next.jsからREST APIで呼び出す構成が推奨です。構成: ①Pythonマイクロサービス: FastAPI + argostranslatePOST /translateエンドポイント→Dockerイメージ化②Next.js: fetch('http://translate-service:8000/translate', {...})でAPI呼び出し③Docker Compose: translate-servicenextjsを同一ネットワークに配置→外部公開不要。オフラインモデル管理: モデル(.argosmodelファイル)をDockerイメージに含めるか、起動時にargostranslate.packageでダウンロード→本番環境では事前にビルドしてモデルを含むイメージを使用。

Q. OPUS-MTで医療・法律ドメインの翻訳品質を向上させるには?

A. ドメイン固有の対訳データセットでMarianMTモデルをファインチューニングします。手順: ①HuggingFace Hubから適切なOPUS-MTモデルを選択(Helsinki-NLP/opus-mt-en-jap等)②専門対訳データセットを収集(医療: MedLine・EMEA・ECDC等・法律: JRC-Acquis・MultiUNなど)③MarianMTModelTrainerでファインチューニング(from transformers import Seq2SeqTrainingArguments, Seq2SeqTrainer)④評価: sacrebleu・CHRFスコアで翻訳品質を測定⑤デプロイ: ファインチューニング済みモデルをHugging Face Hubまたはローカルに保存→推論APIとして公開。効果: 一般翻訳モデル vs ファインチューニング済みモデルで専門ドメインのBLEUスコアが10〜20ポイント改善するケースあり。

まとめ

ユースケース推奨ツール
REST API・マイクロサービス・チーム共有LibreTranslate
完全オフライン・軽量・エアギャップ環境Argos Translate
高品質・ドメイン特化・GPU推論・研究OPUS-MT

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。