- controller: model.authenticationTranslatorLMStudio 呼び出しに base_url=config.LMSTUDIO_URL を明示的に渡すよう修正(LMStudio 接続判定で設定 URL を利用) - docs: 新規ドキュメントを追加・更新 - 追加: translation_gemini.md, translation_lmstudio.md, translation_ollama.md, translation_openai.md, translation_plamo.md - 更新: config.md, controller.md, mainloop.md, model.md, overlay.md, translation_languages.md, translation_translator.md, 仕様書.md(翻訳/モデル管理・エンドポイント・YAML 言語定義・フォント探索・VRAM フォールバック等の記載追加) - ドキュメントに記載した主な変更点 - LMStudio / Ollama のローカルLLM統合(モデルリスト/選択用プロパティ追加、接続確認エンドポイント) - CTranslate2 の言語定義を weight_type ネスト構造へ変更対応 - 外部 YAML による言語マッピング導入(loadTranslationLanguages) - フォント探索を PyInstaller バンドル(_internal/fonts/) を考慮して強化 - 認証後のモデルリスト自動更新・SELECTED_* プロパティ名統一、VRAM エラー検知時の自動フォールバック等の動作説明追加 (コードの振る舞いは既存処理に合わせた引数指定の修正とドキュメント反映が主体)
374 lines
9.9 KiB
Markdown
374 lines
9.9 KiB
Markdown
# model.py - VRCTコアモデルクラス
|
||
|
||
## 概要
|
||
|
||
VRCTアプリケーションの中核となるModelクラスを定義するモジュールです。音声認識、翻訳、VRオーバーレイ、OSC通信、WebSocketサーバーなどの主要機能を統合管理し、システム全体の動作を制御します。
|
||
|
||
## 最近の更新 (2025-10-20)
|
||
|
||
### VRAMエラー検出とフォールバック
|
||
|
||
- `detectVRAMError()` を追加し CUDA メモリ関連メッセージ/独自例外 `VRAM_OUT_OF_MEMORY` を判別
|
||
- 翻訳/音声認識実行中に VRAM エラー検出時、Controller 側で翻訳機能を無効化し CTranslate2 へフォールバックする運用を支援
|
||
- エラー詳細文字列を UI へ通知するためのメッセージ抽出を標準化
|
||
|
||
### CTranslate2 言語マッピングネスト対応
|
||
|
||
- `getListLanguageAndCountry()` / `findTranslationEngines()` が `translation_lang['CTranslate2'][CTRANSLATE2_WEIGHT_TYPE]['source']` を参照するネスト構造へ更新
|
||
- ウェイト種別切替時に対応言語集合が動的に変化しエンジン再判定をトリガー
|
||
|
||
### ローカル LLM 翻訳エンジン統合
|
||
|
||
- LMStudio / Ollama 用クライアント初期化・モデルリスト取得メソッド追加: `authenticationTranslatorLMStudio()`, `getTranslatorLMStudioModelList()`, `setTranslatorLMStudioModel()`, `updateTranslatorLMStudioClient()` など
|
||
- Ollama も同様のインターフェースで統一 (`getTranslatorOllamaModelList`, `setTranslatorOllamaModel`, `updateTranslatorOllamaClient`)
|
||
- Plamo / Gemini / OpenAI と同一フォーマットでモデル選択ロジックを実装し Controller からの呼び出しを簡素化
|
||
|
||
### トークナイザ・リソース取得安定化
|
||
|
||
- CTranslate2 トークナイザダウンロード処理を `downloadCTranslate2ModelTokenizer()` で明示化し PyInstaller パス周りの不整合回避
|
||
- フォントパス探索は OverlayImage 側へ委譲 (`OverlayImage(config.PATH_LOCAL)`) し Model は生成と更新呼び出しのみ保持
|
||
|
||
### 翻訳失敗時のフェールセーフ再試行
|
||
|
||
- `getTranslate()` 内で翻訳失敗(非文字列)時に CTranslate2 をリトライループして安定した結果を返却
|
||
- 成功判定フラグを返却し上位層でエンジン制限エラー検出/フォールバックを容易化
|
||
|
||
### キーワードフィルタ再初期化改善
|
||
|
||
- `resetKeywordProcessor()` でインスタンス再生成し `addKeywords()` により設定変更後のフィルタ更新即時反映
|
||
|
||
### WebSocket サーバー管理強化
|
||
|
||
- 非同期サーバー起動を `asyncio.run` ラッパースレッドで安定化
|
||
- ループフラグ `websocket_server_loop` と状態フラグ `websocket_server_alive` を追加し安全な停止処理と存活確認を標準化
|
||
|
||
### 影響
|
||
|
||
| 項目 | 内容 |
|
||
|------|------|
|
||
| 安定性 | VRAM 検出とフェールセーフ再試行で異常終了回避 |
|
||
| 拡張性 | ローカル LLM 統合によりネットワーク不要環境対応 |
|
||
| 柔軟性 | CTranslate2 ウェイト種別に応じた言語集合動的切替 |
|
||
| 保守性 | トークナイザ/フォント取得責務分離で可読性向上 |
|
||
| 観測性 | エラー詳細標準化により UI/ログでの診断容易 |
|
||
|
||
## 主要機能
|
||
|
||
### シングルトンパターン
|
||
|
||
- アプリケーション全体で単一のModelインスタンスを保証
|
||
- 遅延初期化による軽量なインポート
|
||
|
||
### 音声認識機能
|
||
|
||
- マイク音声のリアルタイム文字起こし
|
||
- スピーカー出力の音声認識
|
||
- エネルギーレベル監視
|
||
- 複数言語対応
|
||
|
||
### 翻訳機能
|
||
|
||
- 複数の翻訳エンジン対応(DeepL、Google、CTranslate2等)
|
||
- 言語自動検出
|
||
- バッチ翻訳処理
|
||
|
||
### VRオーバーレイ
|
||
|
||
- OpenVR統合
|
||
- 小型・大型ログオーバーレイ
|
||
- 動的配置・透明度制御
|
||
|
||
### OSC通信
|
||
|
||
- VRChatとのOSC通信
|
||
- タイピング状態の同期
|
||
- ミュート状態の監視
|
||
|
||
### WebSocketサーバー
|
||
|
||
- 外部アプリケーションとの通信
|
||
- リアルタイムメッセージ配信
|
||
|
||
## クラス構造
|
||
|
||
### threadFnc クラス
|
||
|
||
```python
|
||
class threadFnc(Thread):
|
||
def __init__(self, fnc, end_fnc=None, daemon: bool = True, *args, **kwargs)
|
||
```
|
||
|
||
- 関数を繰り返し実行するスレッドラッパー
|
||
- 一時停止・再開機能
|
||
- エラー保護機能
|
||
|
||
### Model クラス
|
||
|
||
```python
|
||
class Model:
|
||
def __new__(cls) # シングルトンパターン
|
||
def init(self) # 重い初期化処理
|
||
def ensure_initialized(self) # 遅延初期化
|
||
```
|
||
|
||
## 主要メソッド
|
||
|
||
### 初期化・管理
|
||
|
||
```python
|
||
init() -> None
|
||
```
|
||
|
||
- 全コンポーネントの初期化
|
||
- 重い処理のため明示的に呼び出し
|
||
|
||
```python
|
||
ensure_initialized() -> None
|
||
```
|
||
|
||
- 必要時の自動初期化
|
||
- 安全な遅延初期化
|
||
|
||
### 翻訳機能メソッド
|
||
|
||
```python
|
||
getInputTranslate(message, source_language=None) -> Tuple[List[str], List[bool]]
|
||
```
|
||
|
||
- 入力メッセージの多言語翻訳
|
||
- 成功フラグも同時に返却
|
||
|
||
```python
|
||
getOutputTranslate(message, source_language=None) -> Tuple[List[str], List[bool]]
|
||
```
|
||
|
||
- 出力メッセージの翻訳(逆方向)
|
||
|
||
```python
|
||
authenticationTranslatorDeepLAuthKey(auth_key) -> bool
|
||
```
|
||
|
||
- DeepL APIキーの認証
|
||
|
||
### 音声認識機能メソッド
|
||
|
||
```python
|
||
startMicTranscript(fnc: Callable) -> None
|
||
```
|
||
|
||
- マイク音声認識の開始
|
||
- コールバック関数で結果を通知
|
||
|
||
```python
|
||
startSpeakerTranscript(fnc: Callable) -> None
|
||
```
|
||
|
||
- スピーカー音声認識の開始
|
||
|
||
```python
|
||
pauseMicTranscript() -> None
|
||
resumeMicTranscript() -> None
|
||
```
|
||
|
||
- 音声認識の一時停止・再開
|
||
|
||
```python
|
||
startCheckMicEnergy(fnc: Callable) -> None
|
||
startCheckSpeakerEnergy(fnc: Callable) -> None
|
||
```
|
||
|
||
- 音声エネルギーレベルの監視
|
||
|
||
### VRオーバーレイ機能
|
||
|
||
```python
|
||
createOverlayImageSmallLog(message, your_language, translation, target_language) -> Image
|
||
```
|
||
|
||
- 小型ログオーバーレイ画像の生成
|
||
|
||
```python
|
||
createOverlayImageLargeLog(message_type, message, your_language, translation, target_language) -> Image
|
||
```
|
||
|
||
- 大型ログオーバーレイ画像の生成
|
||
|
||
```python
|
||
updateOverlaySmallLogSettings() -> None
|
||
updateOverlayLargeLogSettings() -> None
|
||
```
|
||
|
||
- オーバーレイ設定の更新
|
||
|
||
### OSC通信機能
|
||
|
||
```python
|
||
oscSendMessage(message: str) -> None
|
||
```
|
||
|
||
- VRChatへのメッセージ送信
|
||
|
||
```python
|
||
oscStartSendTyping() -> None
|
||
oscStopSendTyping() -> None
|
||
```
|
||
|
||
- タイピング状態の通知
|
||
|
||
```python
|
||
setMuteSelfStatus() -> None
|
||
```
|
||
|
||
- VRChatミュート状態の取得
|
||
|
||
### WebSocket機能
|
||
|
||
```python
|
||
startWebSocketServer(host: str, port: int) -> None
|
||
```
|
||
|
||
- WebSocketサーバーの起動
|
||
|
||
```python
|
||
websocketSendMessage(message_dict: dict) -> bool
|
||
```
|
||
|
||
- 全クライアントへのメッセージ送信
|
||
|
||
```python
|
||
checkWebSocketServerAlive() -> bool
|
||
```
|
||
|
||
- サーバー稼働状態の確認
|
||
|
||
### ファイルダウンロード機能
|
||
|
||
```python
|
||
downloadCTranslate2ModelWeight(weight_type, callback=None, end_callback=None)
|
||
```
|
||
|
||
- 翻訳モデルのダウンロード
|
||
|
||
```python
|
||
downloadWhisperModelWeight(weight_type, callback=None, end_callback=None)
|
||
```
|
||
|
||
- 音声認識モデルのダウンロード
|
||
|
||
### ウォッチドッグ機能
|
||
|
||
```python
|
||
startWatchdog() -> None
|
||
feedWatchdog() -> None
|
||
setWatchdogCallback(callback: Callable) -> None
|
||
```
|
||
|
||
- システム監視とタイムアウト処理
|
||
|
||
## 使用方法
|
||
|
||
### 基本的な使い方
|
||
|
||
```python
|
||
from model import model
|
||
|
||
# 明示的な初期化(推奨)
|
||
model.init()
|
||
|
||
# または自動初期化
|
||
model.ensure_initialized()
|
||
|
||
# 翻訳機能の使用
|
||
translations, success_flags = model.getInputTranslate("Hello World")
|
||
|
||
# 音声認識の開始
|
||
def on_transcript_result(result):
|
||
print(f"認識結果: {result}")
|
||
|
||
model.startMicTranscript(on_transcript_result)
|
||
```
|
||
|
||
### VRオーバーレイの使用
|
||
|
||
```python
|
||
# オーバーレイの開始
|
||
model.startOverlay()
|
||
|
||
# 画像の作成と更新
|
||
img = model.createOverlayImageSmallLog(
|
||
message="Hello",
|
||
your_language="English",
|
||
translation=["こんにちは"],
|
||
target_language={"1": {"language": "Japanese", "enable": True}}
|
||
)
|
||
model.updateOverlaySmallLog(img)
|
||
```
|
||
|
||
### WebSocketサーバーの使用
|
||
|
||
```python
|
||
# サーバー起動
|
||
model.startWebSocketServer("127.0.0.1", 8765)
|
||
|
||
# メッセージ送信
|
||
message = {"type": "translation", "text": "Hello", "translation": "こんにちは"}
|
||
success = model.websocketSendMessage(message)
|
||
```
|
||
|
||
## 依存関係
|
||
|
||
### 必須モジュール
|
||
|
||
- `controller`: アプリケーション制御
|
||
- `config`: 設定管理
|
||
- `device_manager`: デバイス管理
|
||
|
||
### 音声・翻訳関連
|
||
|
||
- `models.transcription.*`: 音声認識
|
||
- `models.translation.*`: 翻訳機能
|
||
- `models.transliteration.*`: 音写変換
|
||
|
||
### VR・通信関連
|
||
|
||
- `models.overlay.*`: VRオーバーレイ
|
||
- `models.osc.*`: OSC通信
|
||
- `models.websocket.*`: WebSocket通信
|
||
|
||
### ユーティリティ
|
||
|
||
- `models.watchdog.*`: 監視機能
|
||
- `utils`: 共通ユーティリティ
|
||
- `flashtext`: キーワードフィルタリング
|
||
|
||
## 設定依存関係
|
||
|
||
多くの機能がconfigモジュールの設定に依存:
|
||
|
||
- 音声認識設定(しきい値、タイムアウト等)
|
||
- 翻訳設定(エンジン選択、言語設定等)
|
||
- VR設定(オーバーレイ位置、透明度等)
|
||
- OSC設定(IPアドレス、ポート等)
|
||
|
||
## エラーハンドリング
|
||
|
||
- 初期化エラーの適切な処理
|
||
- VRAM不足エラーの検出と対応
|
||
- ネットワークエラーの回復機能
|
||
- スレッドセーフティの保証
|
||
|
||
## 注意事項
|
||
|
||
- 重い初期化処理のため、明示的な初期化を推奨
|
||
- OpenVR環境が必要(VRオーバーレイ使用時)
|
||
- CUDA環境推奨(高速な音声認識・翻訳)
|
||
- WebSocketサーバーは非同期で動作
|
||
- 音声デバイスのアクセス権限が必要
|
||
|
||
## パフォーマンス考慮事項
|
||
|
||
- 遅延初期化によるメモリ使用量の最適化
|
||
- スレッドプールによる並行処理
|
||
- モデルの重複読み込み防止
|
||
- キューイングによる非同期処理
|