Files
VRCT/src-python/docs/details/translation_translator.md

16 KiB
Raw Blame History

translation_translator.py - 翻訳エンジン統合クラス

概要

複数の翻訳エンジンを統合管理する高レベル翻訳インターフェースです。DeepL、Google、Bing、Papago、CTranslate2などの多様な翻訳サービスを統一的に扱い、エラー時の自動フォールバック機能と認証管理を提供します。

主要機能

多エンジン統合

  • DeepL無料版・API版
  • Google TranslateWebスクレイピング
  • Microsoft TranslatorBing
  • Papago Translator
  • CTranslate2ローカル翻訳
  • Plamo APIプリファードネットワークス LLM
  • Gemini APIGoogle LLM
  • OpenAI APIChatGPT系
  • Groq API高速 LLM 推論)
  • OpenRouter API統合 LLM プロバイダー)
  • LMStudioローカル LLM
  • Ollamaローカル LLM

統一インターフェース

  • エンジン依存を隠蔽した単一の翻訳メソッド
  • 自動エラーハンドリング・フォールバック
  • 認証情報の統合管理

オフライン翻訳対応

  • CTranslate2による完全オフライン翻訳
  • 複数モデルサイズsmall/large対応
  • CUDA高速化サポート

クラス構造

Translator クラス

class Translator:
    def __init__(self) -> None:
        self.deepl_client: Optional[DeepLClient] = None
        self.ctranslate2_translator: Any = None
        self.ctranslate2_tokenizer: Any = None
        self.is_loaded_ctranslate2_model: bool = False
        self.is_changed_translator_parameters: bool = False
        self.is_enable_translators: bool = ENABLE_TRANSLATORS

翻訳機能の中核クラス

属性

  • deepl_client: DeepL APIクライアント
  • ctranslate2_translator: ローカル翻訳モデル
  • ctranslate2_tokenizer: CTranslate2トークナイザー
  • is_loaded_ctranslate2_model: ローカルモデル読み込み状態
  • is_enable_translators: Web翻訳サービス利用可能フラグ

主要メソッド

翻訳実行

translate(translator_name: str, source_language: str, target_language: str, 
          target_country: str, message: str) -> Any

統一翻訳インターフェース

パラメータ

  • translator_name: 翻訳エンジン名("DeepL", "Google", "CTranslate2"等)
  • source_language: 送信元言語
  • target_language: 送信先言語
  • target_country: 送信先国・地域
  • message: 翻訳対象テキスト

戻り値

  • str: 翻訳結果(成功時)
  • False: 翻訳失敗時

DeepL認証管理

authenticationDeepLAuthKey(authkey: str) -> bool

DeepL APIキーの認証と設定

パラメータ

  • authkey: DeepL APIキー

戻り値

  • bool: 認証成功可否

CTranslate2管理

changeCTranslate2Model(path: str, model_type: str, device: str = "cpu",
                      device_index: int = 0, compute_type: str = "auto") -> None

ローカル翻訳モデルの読み込み・変更

パラメータ

  • path: モデルファイルのベースパス
  • model_type: モデルサイズ("small"/"large"
  • device: 計算デバイス("cpu"/"cuda"
  • device_index: デバイスインデックス
  • compute_type: 計算精度タイプ

状態管理

isLoadedCTranslate2Model() -> bool

CTranslate2モデルの読み込み状態確認

isChangedTranslatorParameters() -> bool
setChangedTranslatorParameters(is_changed: bool) -> None

翻訳設定変更フラグの管理

使用方法

基本的な翻訳

from models.translation.translation_translator import Translator

# 翻訳器の初期化
translator = Translator()

# Google翻訳の使用
result = translator.translate(
    translator_name="Google",
    source_language="Japanese",
    target_language="English", 
    target_country="United States",
    message="こんにちは、世界!"
)

if result != False:
    print(f"翻訳結果: {result}")  # "Hello, world!"
else:
    print("翻訳に失敗しました")

DeepL API使用

# DeepL APIキーの設定
api_key = "your-deepl-api-key"
auth_success = translator.authenticationDeepLAuthKey(api_key)

if auth_success:
    print("DeepL API認証成功")
    
    # DeepL APIで翻訳
    result = translator.translate(
        translator_name="DeepL_API",
        source_language="English",
        target_language="Japanese",
        target_country="Japan", 
        message="Hello, world!"
    )
    print(f"DeepL翻訳: {result}")
else:
    print("DeepL API認証失敗")

ローカル翻訳CTranslate2の使用

# ローカルモデルの読み込み
translator.changeCTranslate2Model(
    path=".",                    # アプリケーションルート
    model_type="small",          # smallモデル使用
    device="cuda",               # GPU使用
    device_index=0,
    compute_type="float16"       # 半精度で高速化
)

# モデル読み込み確認
if translator.isLoadedCTranslate2Model():
    print("CTranslate2モデル読み込み完了")
    
    # ローカル翻訳実行
    result = translator.translate(
        translator_name="CTranslate2",
        source_language="Japanese",
        target_language="English",
        target_country="United States",
        message="機械翻訳のテストです"
    )
    print(f"ローカル翻訳: {result}")
else:
    print("CTranslate2モデル読み込み失敗")

エラーハンドリング付きの翻訳

def safe_translate(translator, message, source_lang="Japanese", target_lang="English"):
    """安全な翻訳処理"""
    # 翻訳エンジンの優先順位
    engines = ["DeepL_API", "DeepL", "Google", "CTranslate2"]
    
    for engine in engines:
        try:
            result = translator.translate(
                translator_name=engine,
                source_language=source_lang,
                target_language=target_lang,
                target_country="United States",
                message=message
            )
            
            if result != False:
                print(f"{engine}で翻訳成功: {result}")
                return result
            else:
                print(f"{engine}翻訳失敗、次のエンジンを試行")
                
        except Exception as e:
            print(f"{engine}でエラー: {e}")
            continue
    
    print("全ての翻訳エンジンで失敗")
    return None

# 使用例
result = safe_translate(translator, "こんにちは")

翻訳設定の管理

# 設定変更フラグの確認
if translator.isChangedTranslatorParameters():
    print("翻訳設定が変更されています")
    
    # 設定変更の適用(例:モデル再読み込み)
    translator.changeCTranslate2Model(".", "small", "cpu")
    
    # フラグのリセット
    translator.setChangedTranslatorParameters(False)

翻訳エンジン比較

DeepL API有料

  • 精度: 最高レベル
  • 速度: 高速
  • 制限: API使用料、月間制限
  • 対応: 26言語、地域別対応

DeepL無料

  • 精度: 高品質
  • 速度: 中程度
  • 制限: 月間使用量制限、文字数制限
  • 対応: 26言語

Google Translate

  • 精度: 良好
  • 速度: 高速
  • 制限: アクセス頻度制限
  • 対応: 100+言語

CTranslate2ローカル

  • 精度: 中〜高(モデル依存)
  • 速度: 高速GPU使用時
  • 制限: なし(オフライン)
  • 対応: 主要言語ペア

その他Bing, Papago等

  • 精度: 中程度
  • 速度: 中程度
  • 制限: サービス依存
  • 対応: サービス固有

CTranslate2詳細

対応モデル

ctranslate2_weights = {
    "small": {
        "url": "m2m100_418m.zip",
        "directory_name": "m2m100_418m", 
        "tokenizer": "facebook/m2m100_418M"
    },
    "large": {
        "url": "m2m100_12b.zip", 
        "directory_name": "m2m100_12b",
        "tokenizer": "facebook/m2m100_1.2b"
    }
}

パフォーマンス特性

small モデル

  • サイズ: ~400MB
  • メモリ: ~1GB RAM
  • VRAM: ~500MBCUDA使用時
  • 速度: 高速
  • 精度: 良好

large モデル

  • サイズ: ~4.8GB
  • メモリ: ~6GB RAM
  • VRAM: ~3GBCUDA使用時
  • 速度: 中程度
  • 精度: 高品質

計算タイプ設定

# CPU使用時
compute_type = "int8"          # 速度重視

# CUDA使用時
compute_type = "float16"       # バランス重視
compute_type = "int8_float16"  # メモリ効率重視

エラーハンドリング

ネットワークエラー

  • 接続タイムアウト
  • API制限超過
  • サービス一時停止

認証エラー

  • 無効なAPIキー
  • 期限切れアカウント
  • 使用量上限到達

モデルエラー

  • ファイル破損
  • VRAM不足
  • 非対応言語ペア

対応策

def robust_translation(translator, message, source_lang, target_lang):
    """堅牢な翻訳処理"""
    # オンライン翻訳を先に試行
    online_engines = ["DeepL_API", "DeepL", "Google"]
    
    for engine in online_engines:
        try:
            result = translator.translate(engine, source_lang, target_lang, "", message)
            if result != False:
                return result
        except Exception as e:
            print(f"{engine}エラー: {e}")
            continue
    
    # オンライン翻訳が全て失敗した場合、ローカル翻訳にフォールバック
    try:
        if not translator.isLoadedCTranslate2Model():
            translator.changeCTranslate2Model(".", "small", "cpu")
            
        result = translator.translate("CTranslate2", source_lang, target_lang, "", message)
        if result != False:
            return result
    except Exception as e:
        print(f"ローカル翻訳エラー: {e}")
    
    return "翻訳に失敗しました"

依存関係

必須依存関係

  • translation_languages: 言語コード管理
  • translation_utils: CTranslate2ユーティリティ
  • utils: エラーログ、計算デバイス管理

オプション依存関係

  • deepl: DeepL APIライブラリ
  • translators: Web翻訳サービスライブラリ
  • ctranslate2: ローカル翻訳エンジン
  • transformers: トークナイザー

設定要件

環境変数

  • DEEPL_AUTH_KEY: DeepL APIキーオプション

ファイル配置

root/
└── weights/
    └── ctranslate2/
        ├── m2m100_418m/     # smallモデル
        └── m2m100_12b/      # largeモデル

注意事項

  • Web翻訳サービスは利用制限に注意
  • CTranslate2の初回読み込みは時間がかかる
  • GPU使用時はVRAM消費量に注意
  • API認証情報の適切な管理が必要
  • 長文翻訳時は分割処理を推奨

関連モジュール

  • translation_languages.py: 言語コードマッピング
  • translation_utils.py: CTranslate2ユーティリティ
  • config.py: 翻訳設定管理
  • model.py: 翻訳機能統合
  • controller.py: 翻訳制御インターフェース

最近の更新

2025-12-10: Groq API および OpenRouter API サポート追加

Groq API 統合

  • Groq API (https://api.groq.com/openai/v1) を翻訳エンジンとして追加
  • OpenAI 互換エンドポイントで高速 LLM 推論を実現
  • API キーバリデーション(gsk で始まり40文字以上
  • モデルリスト自動取得とフィルタリング(テキスト処理モデルのみ)
  • 認証成功時に SELECTABLE_GROQ_MODEL_LIST を更新、未選択時は先頭モデルを自動選択
  • API キー無効時にモデルリストと選択モデルをクリアしフロントエンドに通知

OpenRouter API 統合

  • OpenRouter API (https://openrouter.ai/api/v1) を翻訳エンジンとして追加
  • 単一 API キーで複数 LLM プロバイダーへアクセス可能
  • API キーバリデーション20文字以上
  • モデルリスト自動取得とフィルタリング(テキスト処理モデルのみ)
  • 認証成功時に SELECTABLE_OPENROUTER_MODEL_LIST を更新、未選択時は先頭モデルを自動選択
  • API キー無効時にモデルリストと選択モデルをクリアしフロントエンドに通知

updateTranslationEngineAndEngineList() の拡張

  • SELECTABLE_TRANSLATION_ENGINE_STATUS で Groq_API と OpenRouter_API の状態を管理
  • 各エンジンの認証キー更新時に自動的にモデルリストを再取得
  • フロントエンドへの通知を run_mapping 経由で送信

影響

項目 内容
Groq API 高速 LLM 推論による翻訳速度向上
OpenRouter API 単一キーで複数 LLM プロバイダーへアクセス
モデル管理 API キー検証失敗時の自動クリアで一貫性向上
UX改善 認証後の自動モデル選択で初期設定簡略化

2025-10-20: LLM エンジン拡張と最適化

新規ローカル LLM エンジン追加

LMStudio / Ollama を翻訳エンジンとして追加。接続確認後にモデルリスト (SELECTABLE_LMSTUDIO_MODEL_LIST / SELECTABLE_OLLAMA_MODEL_LIST) を取得し、未選択なら先頭モデルを自動選択 (SELECTED_LMSTUDIO_MODEL / SELECTED_OLLAMA_MODEL)。現時点では CTranslate2 と同様にローカル動作を想定し、翻訳関数側は将来の統合(温度等パラメータ)に備えて抽象化維持。

モデル選択プロパティ名称統一

Plamo / Gemini / OpenAI の選択モデルプロパティを SELECTED_* 形式へ変更。旧名称 (PLAMO_MODEL / GEMINI_MODEL / OPENAI_MODEL) は利用停止。自動認証後のモデルリスト更新ロジックで未選択時に先頭補完を行う。

OpenAI / Gemini / Plamo 認証後のモデルリスト自動更新

Auth設定メソッド完了時に SELECTABLE_*_MODEL_LIST を再取得し不足時は UI へ push。OpenAI はキー設定直後に最新モデルリストを反映し高速化。Gemini / Plamo も同様に updateTranslator*Client() 呼び出しでクライアント再生成。

CTranslate2 言語ネスト化対応

translation_lang["CTranslate2"][weight_type]["source"|"target"] へ構造変更。CTRANSLATE2_WEIGHT_TYPE により重みタイプ別の言語集合を参照。Translator 内では translator_name == "CTranslate2" の分岐で weight_type を参照して言語判定を行う実装に変更。

YAML 言語マッピング導入

外部ファイル languages.yml を読み込んで翻訳エンジン別対応言語を動的拡張。新言語追加は YAML 編集のみで実現(コード再デプロイ不要)。読み込み失敗時は空辞書でフォールバックし既存ハードコードを保持。

VRAM エラー検知とフォールバック

DeepL / Plamo / Gemini / OpenAI 実行時の VRAM 不足検知で自動的に CTranslate2 へ切替し翻訳を停止 (ENABLE_TRANSLATION=False)。ユーザー通知後は再度有効化要求時に再初期化を試行。安定性向上のためログへ VRAM エラー詳細を記録。

トークナイザーパス修正

CTranslate2 トークナイザーのダウンロード処理で保存ディレクトリ作成とパス使用順序不整合を修正。これにより初回起動時の失敗率低下。

全言語ペア包括テスト導入

backend_test.py にて test_translate_all_language_pairs() を追加。複数エンジン・全言語ペアを列挙実行し translation_test_results.json を生成。失敗ペアの早期検出と YAML 追加言語検証に活用。

影響

項目 内容
ローカルLLM オフライン翻訳候補拡充 (LMStudio/Ollama)
プロパティ統一 SELECTED_* 命名で一貫性と保守性向上
CTranslate2構造 重みタイプ毎に最適言語集合参照可能
YAML外部化 言語追加/削除が設定ファイル編集のみで完結
VRAM検知 エラー時自動停止 + 軽量エンジン切替で安定性向上
Tokenizer修正 初回セットアップ失敗減少
包括テスト 言語組合せの網羅的品質担保