中級 11 分翻訳

ローカルでドキュメントを翻訳:の代替案 DeepL

DeepLやChatGPTに契約書、財務報告書、人事関連の資料を貼り付けることは、自分では管理できないサーバーにその文書を送ることを意味します。ローカルAI翻訳はこの問題を解決します。多言語LLMが手元のマシンで動作し、データは一切外部に出ません。このガイドでは、選ぶべきモデル、ファイルの書式を維持する方法、そして簡単なOllamaスクリプトで数十件の文書を一括翻訳する方法を紹介します。

著者 Marie L.·更新 2026-08-27·Windows・macOS・Linuxでテスト済み

#文書をDeepLに送らない理由

DeepL と Google Translate は優れていますが、そのビジネスモデルはクラウドに依存しています。テキストは各社のサーバーを経由し、利用するプランによっては保存されたり、モデルの改善に使われたりする可能性があります。差し障りのないメールなら、大した問題ではありません。しかし、NDAの対象となる契約書、出願手続き中の特許、貸借対照表、従業員の個人データでは、具体的な法的リスクや競争上のリスクになります。

ローカルでのAI翻訳は状況を変えます:モデルはあなたのディスクにダウンロードされ、あなたのCPUまたはGPUで実行されます。ネットワークリクエストも、アカウントも、容量制限もありません。機密文書のフォルダ全体を、1バイトもあなたの端末を離れることなく翻訳できます。オフライン、飛行機内、または隔離されたネットワークでも同様です。

i
本当の利点はコンプライアンス
法律事務所、人事部門、医療チームでは、ローカル翻訳によって、委託先へのデータ移転に関する GDPR 上の問題がすべてなくなります。文書が企業の管理範囲を出ることはありません。
プライバシー
契約書、特許、医療データまたは人事データは、あなたのマシン上に残ります。
利用コストゼロ
サブスクリプションも文字数に応じた課金もありません。10ページでも10,000ページでも、同じ料金で翻訳できます。
オフライン
ネットワーク接続なしで動作するため、ネットワークから隔離された端末や移動中の利用に便利です。
処理量は無制限
クラウドAPIにあるような月間利用枠やスロットリングはありません。

#本当に正確に翻訳できるローカルモデルはどれか

ローカルRAGキット

あなたのドキュメント、あなたのAI:あなたのPDF、メモ、メールを扱う信頼性の高いローカルRAG。何もクラウドに送信しません。

  • 永久に利用できるオンラインスペース
  • PDF + ファイル
  • 生涯アップデート

LLM の翻訳性能は一様ではありません。優れたローカル翻訳モデルには、大規模な多言語コーパスで学習され、フランス語をきめ細かく扱えることが求められます。2026年現在、セルフホストでの利用に適したモデル群の中では、いくつかのファミリーが明確に際立っています。

Qwen 3.5 9B
多言語に優れ、フランス語も非常に得意で、ニュアンスや専門用語を適切に扱えます。Q4で約6.6 GB、コンテキスト256k、Apache 2.0ライセンス。2026年における品質とリソースのバランスが最も優れた選択肢です。品質が十分でなければ、Qwen 3.8 27B(約18 GB)に切り替えてください。
Gemma 4 12B
流暢で自然な翻訳で、フランス語の句読点も丁寧に扱います。マルチモーダルに対応し、現在はApache 2.0ライセンスです(Gemmaは2026年にApache 2.0へ移行しました)。Q4で約7.6 GBで、12〜16 GBのGPUやユニファイドメモリ搭載のMacで余裕を持って動作します。
Qwen 3.5 4B
2026年の小型多言語モデルの定番:約3.4GBしか必要とせず、どこでも、CPUだけでも動作します。このサイズとしては、すでに驚くほど優れた翻訳ができます。Apache 2.0。
Mistral Small 24B
フランス語に強く、高速で、Q4では約14GB。幅広い用途で安定した性能を発揮し、16GBのGPUで大量の処理をこなす際に非常に良い選択肢です。
Qwen 3.6 35B-A3B
MoEアーキテクチャによりクラウドに近い品質を実現し、現在では32 GBから利用できます(Q4で約23 GB、RTX 4090または大容量のユニファイドメモリを搭載したMac)。高い品質が求められる翻訳向けです。
→
どこから始めればよいですか
迷った場合は、Qwen 3.5 9BをQ4_K_Mで実行してください。8〜12 GBのGPUでFR ↔ EN/ES/DE/ITの翻訳を行う場合、品質とVRAM使用量のバランスが最も優れています。品質が十分でない場合に限り、Qwen 3.8 27Bに切り替えてください。

NLLBやOpus-MTのような翻訳専用モデルもあり、非常に軽量です。ただし、最近の汎用LLMは、長文の翻訳や文脈の尊重(文体、専門用語、文書全体の一貫性)では、これらを上回ることがよくあります。


#前提条件とインストール

基本構成は定番です。推論エンジンにはOllama、多言語モデルを使用し、ファイル処理スクリプトにはPythonを使います。Ollamaはデフォルトで http://localhost:11434 で待ち受けます。

Ollama インストール済み
モデルをダウンロードして実行するデーモン。まだインストールしていなければ、インストールガイドを参照すること。
余裕を持って使えるGPU
12GBのRTX 3060は、Qwen 3.5 9B をQ4(約6.6GB)でスムーズに動作させることができます。CPUでも動作は可能ですがあまり高速ではありません。
Python 3.10+
DOCX、PDF、Markdownを扱い、OllamaのAPIを呼び出すため
ターミナル
# Récupérer un modèle multilingue adapté à la traduction
ollama pull qwen3.5:9b

# Vérifier qu'il répond
ollama run qwen3.5:9b "Traduis en anglais : Le contrat prend effet à sa signature."
ターミナル
# Dépendances Python pour les formats de documents
pip install ollama python-docx pypdf markdown-it-py

#翻訳の初期テスト

自動化する前に、代表的なサンプルで品質を確認してください。良好なローカル翻訳の鍵はシステムプロンプトにあります。プロンプトは役割、ターゲット言語、そして特に「追加しない」という指示を定義します。

traduire.py
import ollama

MODELE = "qwen3.5:9b"

SYSTEME = (
    "Tu es un traducteur professionnel. Traduis le texte fourni de "
    "{source} vers {cible}. Conserve le sens, le registre et la "
    "terminologie technique. Ne commente pas, n'ajoute rien : "
    "renvoie uniquement la traduction."
)

def traduire(texte, source="français", cible="anglais"):
    reponse = ollama.chat(
        model=MODELE,
        messages=[
            {"role": "system", "content": SYSTEME.format(source=source, cible=cible)},
            {"role": "user", "content": texte},
        ],
        options={"temperature": 0.2},
    )
    return reponse["message"]["content"].strip()

if __name__ == "__main__":
    extrait = "Le présent contrat prend effet à la date de sa signature par les deux parties."
    print(traduire(extrait))
→
低いtemperature設定
翻訳では、温度を0.1〜0.3に設定すると、より原文に忠実で再現性の高い結果が得られます。値を高くすると、モデルが内容を「膨らませたり」、言い換えたりしやすくなり、望ましくありません。

#フォーマットの保持(DOCX、PDF、Markdown)

プレーンテキストを翻訳するのは簡単ですが、実際の文書の書式を保つのはそれほど簡単ではありません。適切な方法は、ファイル全体をモデルに丸ごと渡すのではなく、文書の構造をそのまま保ちながら、各テキスト部分を元の位置で翻訳することです。

#Wordファイル(DOCX)

python-docx では、各段落と表の各セルにアクセスできます。スタイルを維持しながら各「run」のテキストを翻訳し、その後ファイルを書き直します。レイアウト、見出し、表は保持されます。

traduire_docx.py
from docx import Document
from traduire import traduire

def traduire_docx(entree, sortie, cible="anglais"):
    doc = Document(entree)

    for para in doc.paragraphs:
        if para.text.strip():
            para.text = traduire(para.text, cible=cible)

    for table in doc.tables:
        for ligne in table.rows:
            for cellule in ligne.cells:
                if cellule.text.strip():
                    cellule.text = traduire(cellule.text, cible=cible)

    doc.save(sortie)
    print(f"Traduit : {sortie}")

if __name__ == "__main__":
    traduire_docx("contrat.docx", "contrat_en.docx")
!
複数のランに分かれたテキストでは書式が失われることがあります
para.textを書き換えると、runが置き換えられ、細かな書式設定(文の途中の太字など)が失われることがあります。書式設定が多い文書で仕上がりを完璧にするには、段落全体ではなくrunごとに翻訳してください。ただし、その分、モデルにとっては区切り方が不自然になります。

#Markdown

Markdownは、形式を保ちながら翻訳するのが最も簡単なフォーマットです。モデルに構文を維持するよう指示するだけで済みます。プロンプトでそのように指定すれば、見出し、リスト、リンク、コードブロックはそのまま維持されます。

traduire_md.py
import ollama

SYSTEME_MD = (
    "Traduis ce document Markdown en {cible}. Conserve EXACTEMENT la "
    "syntaxe Markdown : titres (#), listes, liens, tableaux et blocs "
    "de code. Ne traduis PAS le contenu des blocs de code. Renvoie "
    "uniquement le Markdown traduit."
)

def traduire_markdown(chemin, sortie, cible="anglais"):
    texte = open(chemin, encoding="utf-8").read()
    reponse = ollama.chat(
        model="qwen3.5:9b",
        messages=[
            {"role": "system", "content": SYSTEME_MD.format(cible=cible)},
            {"role": "user", "content": texte},
        ],
        options={"temperature": 0.2},
    )
    open(sortie, "w", encoding="utf-8").write(reponse["message"]["content"])

traduire_markdown("README.md", "README_en.md")

#PDF

PDFは最も扱いが難しい形式です。内容そのものではなく、表示上の体裁を表す形式だからです。pypdfでテキストを抽出し、翻訳してから、新しい文書(多くの場合はDOCXまたは新たに生成したPDF)に出力します。PDFのレイアウトを正確に再現する作業は、費用や手間に見合うことがほとんどありません。ピクセル単位で一致するコピーよりも、読みやすい文書を目指してください。

traduire_pdf.py
from pypdf import PdfReader
from docx import Document
from traduire import traduire

def pdf_vers_docx_traduit(entree, sortie, cible="anglais"):
    lecteur = PdfReader(entree)
    doc = Document()

    for page in lecteur.pages:
        texte = page.extract_text() or ""
        for paragraphe in texte.split("\n\n"):
            if paragraphe.strip():
                doc.add_paragraph(traduire(paragraphe, cible=cible))

    doc.save(sortie)

pdf_vers_docx_traduit("rapport.pdf", "rapport_en.docx")

#Ollama でバッチ翻訳

ローカル実行の大きな利点は、利用料金を気にせず大量に処理できることです。フォルダ内を巡回して各ファイルを翻訳するスクリプトを使えば、手元のPCが一括翻訳サービスになります。以下は、ディレクトリ内のすべての.docxファイルを処理するスクリプトです。

batch_traduction.py
import sys
from pathlib import Path
from traduire_docx import traduire_docx

def traduire_dossier(dossier, cible="anglais", suffixe="_traduit"):
    dossier = Path(dossier)
    fichiers = list(dossier.glob("*.docx"))
    print(f"{len(fichiers)} fichier(s) à traduire\n")

    for i, fichier in enumerate(fichiers, 1):
        if suffixe in fichier.stem:
            continue  # éviter de retraduire une sortie
        sortie = fichier.with_name(f"{fichier.stem}{suffixe}.docx")
        print(f"[{i}/{len(fichiers)}] {fichier.name}")
        traduire_docx(fichier, sortie, cible=cible)

    print("\nTerminé.")

if __name__ == "__main__":
    dossier = sys.argv[1] if len(sys.argv) > 1 else "."
    traduire_dossier(dossier)
ターミナル
# Traduire tous les .docx d'un dossier en anglais
python batch_traduction.py ./documents_a_traduire
→
モデルを読み込んだ状態に保つ
大量のファイルをまとめて処理する場合は、OLLAMA_KEEP_ALIVEを設定し(例:export OLLAMA_KEEP_ALIVE=30m)、ファイルの処理と処理の間にOllamaがモデルをメモリから解放しないようにしてください。VRAMへの再読み込みには毎回数秒かかります。

#翻訳の品質を向上させる

ローカル LLM は初期設定でもうまく翻訳できますが、いくつかの設定を調整すると、特に専門業務に関する文章では、仕上がりを「まずまず」から「公開できる水準」へ引き上げられます。

  1. 01
    用語集を提供する
    システムプロンプトに、業務用語とその指定訳をまとめた用語集(正式な会社名、製品名、略語)を追加してください。モデルは訳語を勝手に作らず、指定した用語に従います。
  2. 02
    適切に分割する
    一文ずつではなく、段落またはセクション単位で翻訳してください。文法上の一致、代名詞が何を指すか、文体や言葉遣いを適切に扱うには、モデルに文脈が必要です。
  3. 03
    ドキュメントのコンテキストを提供する
    プロンプトで文章の種類(「商取引契約書」「技術説明書」「社内メール」)を明示してください。文体や語彙がそれに応じて調整されます。
  4. 04
    重要な箇所を読み直す
    契約書や法的文書では、重要な条項を人間が確認することが引き続き不可欠です。ローカル実行で機密性は確保できますが、誤りがなくなるわけではありません。
  5. 05
    必要に応じてモデルをアップグレードする
    品質が頭打ちになったら、Qwen 3.5 9BからQwen 3.8 27Bに切り替えてください(推論レベルを「low」に設定することを忘れないでください。デフォルトでは考えすぎるため、翻訳には不要です)。あるいは、Qwen 3.6 35B-A3BのようなMoEモデルに切り替えることも検討してください。長い文や用語の細かなニュアンスでは、明確な改善が得られます。

#トラブルシューティング

モデルがコメントを追加する
「翻訳だけを返す」という指示を強調し、温度を下げてください。一部のモデルは「以下が翻訳です:」という前置きを付けるため、必要に応じて後処理で削除してください。
誤った言語に翻訳しています
プロンプトで翻訳先の言語を明示し、例を示してください。短いテキストでは、モデルが翻訳先の言語を間違えることがあります。
DOCXの書式が失われる
para.textを置き換えると、複数のrunがまとめられ、個別の書式が失われます。書式設定の多い文書では、runごとに翻訳してください。
大量のテキストを翻訳すると遅い
モデルが VRAM に収まることを確認してください(収まらない場合は CPU にオフロードされ、動作が遅くなります)。モデルのサイズを小さくするか、OLLAMA_KEEP_ALIVE を使用してください。
Markdown 形式のコードブロックが翻訳されています
プロンプトで「コードブロック内の内容は翻訳しないでください」と明確に強調してください。それ以外の方法として、翻訳前にコードブロックを取り出し、翻訳後に元に戻してください。
コンテキストが長すぎたため切り捨てられました
非常に大きな文書はコンテキストウィンドウに収まりません。セクションに分割し、それぞれを個別に翻訳してください。

#さらに詳しく

ローカルAI翻訳の基盤となるのは、適切に選んだOllamaの構成です。導入を補う当サイトのガイドはこちらです:

Ollama のインストール
推論エンジンをまだインストールしていない場合に、インストールするためのガイドです。
Q4、Q5、Q8:どの量子化を選ぶべきか
お使いの GPU に応じて、翻訳品質、速度、VRAM 使用量のバランスを判断するために。
n8n + Ollama:ローカルAIで自動化を実現
翻訳をノーコードのワークフロー(受信メール、アップロードされたファイルなど)に組み込むために。
このガイドは役に立ちましたか?

ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。