Files
VRCT/src-python/docs/modules/translation.md

114 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 翻訳モジュール (models.translation)
このドキュメントは `models/translation` 配下に対して行った最近の変更点、セットアップ手順、API の使い方、テスト方針、トラブルシュートをまとめたものです。
### 概要
- モジュールの責務: テキストの翻訳を行う高レベルの `Translator` クラス、言語コードのマッピング、CTranslate2 用の重み・トークナイザのダウンロード/検証ユーティリティを提供します。
- 変更点の狙い: 型注釈と docstring を追加し、`translation_utils.py` のダウンロード/検証ロジックをシンプルで堅牢な実装へ置換しました。これにより初回セットアップの手順が明確になります。
### 主な変更点(サマリ)
- `translation_translator.py`: 型注釈、docstring を追記。外部依存は存在するが、例外が発生してもモジュールが壊れないように保護されています。
- `translation_languages.py`: 言語コードマッピングの説明を追加。
- `translation_utils.py`: 重みファイルの検証SHA-256 ハッシュ照合、zip 展開、`transformers.AutoTokenizer` を使ったトークナイザ取得、ダウンロード進捗用のコールバックを備えた実装へ置換。
### インストール(依存関係)
必須ではないものが含まれます。開発・最小稼働に必要なパッケージはプロジェクト全体の要件に従ってください。
主に使うパッケージ:
- `requests` — ダウンロード処理
- `transformers` — トークナイザ取得AutoTokenizer
- `ctranslate2` — CTranslate2 を使う場合(ランタイムのみ、テストではモック推奨)
推奨インストール例(任意):
```powershell
pip install requests transformers ctranslate2
```
DeepL や `translators` といった外部 API ラッパーはオプショナルです。CI やローカルテストではモックして動作確認してください。
### 初回セットアップ / 重みの準備
`translation_utils.py` に含まれるユーティリティ関数:
- `checkCTranslate2Weight(root: str, weight_type: str = "small") -> bool`
- 指定した `root/weights/ctranslate2/<model_dir>` 以下に必要なファイルが存在し、既知のハッシュと一致するかをチェックします。
- `downloadCTranslate2Weight(root: str, weight_type: str = "small", callback: Optional[Callable[[float], None]] = None, end_callback: Optional[Callable[[], None]] = None) -> None`
- 重みを ZIP 形式でダウンロードして展開します。
- `callback(progress: float)` は 0.0〜1.0 の進捗通知に使えます。
- `end_callback()` は処理完了時に呼び出されます。
- `downloadCTranslate2Tokenizer(path: str, weight_type: str = "small") -> None`
- `transformers.AutoTokenizer.from_pretrained` を利用してトークナイザをダウンロード/キャッシュします(`cache_dir` に保存)。
呼び出し例(簡単):
```python
from models.translation import translation_utils as tu
# ルートディレクトリ(プロジェクトルートなど)
root = "."
if not tu.checkCTranslate2Weight(root, "small"):
tu.downloadCTranslate2Weight(root, "small", callback=lambda p: print(f"{p*100:.1f}%"))
tu.downloadCTranslate2Tokenizer(root, "small")
```
注意: 大きなモデル(`large`)はダウンロードに時間とディスク容量を要します。
### API 使用例 (`Translator` の簡易例)
以下は `Translator` の想定されるシンプルな使い方です(実装は `translation_translator.py` を参照してください)。
```python
from models.translation.translation_translator import Translator
tr = Translator()
result = tr.translate("Hello", src_lang="en", target_lang="ja")
if result:
print(result)
else:
print("翻訳に失敗しました")
```
戻り値とエラー: 既存のコードベースとの互換性を重視し、失敗時は False を返すケースがあります。API 呼び出し前に戻り値の型を確認してください。
### テスト方針
- 外部サービスDeepL、web 翻訳ラッパー、ctranslate2、transformersはユニットテストでモックします。
- 推奨: `pytest``unittest.mock` を使い、`Translator.translate` の成功パス・失敗パスを検証するテストを追加してください。
簡単なテスト設計:
- 正常系: ctranslate2 経由の翻訳が正しく呼ばれる(モックで期待レスポンスを返す)
- フォールバック系: ctranslate2 が利用できない場合に別の翻訳経路を辿る(モック)
### トラブルシュート
- `ModuleNotFoundError` (例: `sudachidict_full`) — transliteration/別モジュールで必要な辞書が無い場合。該当パッケージのインストールか、当該機能を無効にしてください。
- ハッシュ不一致 — ダウンロード済みファイルの破損が疑われます。該当ファイルを削除して再ダウンロードしてください。
- `transformers` のトークナイザが取得できない場合、ネットワークやキャッシュ先の権限を確認してください。
### 変更履歴
- 2025-10-09: 型注釈と docstring の追加、`translation_utils.py` を再実装してダウンロード/検証ロジックを整理。
---
このドキュメントは簡潔な参照用です。必要なら実行例やさらに詳細なトラブルシュート手順(コマンド出力例、ログの取り方など)を追加します。
# models/translation — 詳細設計
構成ファイル:
- translation_translator.py — Translator クラス。DeepL/API、Google、Bing、Papago、CTranslate2 を統一インターフェースで扱う。
- translation_utils.py — 重みファイルのダウンロード・検証ロジックCTranslate2 用)。
- translation_languages.py — 各エンジンの対応言語マップ。
Translator の契約:
- translate(translator_name, source_language, target_language, target_country, message) -> str|False
- 成功時は文字列、失敗または一時的エラーは False を返す。
- changeCTranslate2Model(path, model_type, device, device_index, compute_type)
- CTranslate2 の Translator オブジェクトと Tokenizer を初期化する。
フォールバック:
- Controller/Model 層で翻訳が失敗した場合に CTranslate2 にフォールバックする実装がある。
外部依存:
- ctranslate2, transformers, deeplオプション、translators任意
安全性:
- 翻訳 API キーDeepLは Translator.authenticationDeepLAuthKey で検証して保持。