zagaroid連携専用AI翻訳クライアント
FuguMTモデルを使用したオフライン翻訳サービスを提供するWebSocketクライアントです。zagaroidサーバーに接続し、JSON-RPC 2.0形式の翻訳リクエストを処理します。
主な特徴:
initialize(roles=["nmt"])を送信。仕様の正本は zagaroid/docs/protocol.md)FuguMTはs-takaさんが開発したオープンソースの英日・日英翻訳モデルです:
# プロジェクトをダウンロード
git clone https://github.com/your-username/MenZ-FuguMT.git
cd MenZ-FuguMT
# 自動セットアップを実行
setup.bat
# サーバーを起動
run.bat
# プロジェクトをダウンロード
git clone https://github.com/your-username/MenZ-FuguMT.git
cd MenZ-FuguMT
# 自動セットアップを実行
chmod +x setup.sh
./setup.sh
# サーバーを起動
./run.sh
# 1. 仮想環境を作成(推奨)
python3 -m venv venv
source venv/bin/activate # Linux/macOS
# または
venv\Scripts\activate # Windows
# 2. 依存関係をインストール
pip install -r requirements.txt
# 3. クライアントを起動(初回起動時に自動的に設定ファイルが作成されます)
python main.py
設定ファイル config/fugumt_translator.ini を編集して、サーバーの動作をカスタマイズできます。
[WEBSOCKET]
# zagaroidサーバーのIPアドレス
host = 127.0.0.1
# zagaroidサーバーのポート
port = 50001
# 接続パス(zagaroidの翻訳エンドポイント)
path = /translate_text
[TRANSLATION]
model_name_en_ja = staka/fugumt-en-ja
model_name_ja_en = staka/fugumt-ja-en
device = auto # auto, cpu, cuda, mps
max_length = 128
num_beams = 4
temperature = 1.0
use_cache = true
use_fp16 = false
[LOGGING]
level = INFO
file = logs/fugumt_translator.log
[PERFORMANCE]
timeout_seconds = 30.0
worker_threads = 2
zagaroidサーバーの接続先を指定します:
[WEBSOCKET]
host = 192.168.1.100 # zagaroidサーバーのIP
port = 50001 # zagaroidサーバーのポート
path = /translate_text # 翻訳エンドポイントのパス
auto: 自動選択(CUDA → MPS → CPU の順)cuda: NVIDIA GPU使用mps: Apple Silicon GPU使用cpu: CPU使用config/fugumt_translator.ini:
[WEBSOCKET]
host = 192.168.1.100 # zagaroidサーバーのIP
port = 50001 # zagaroidサーバーのポート
path = /translate_text # 翻訳エンドポイント
python main.py
別の設定ファイルを使用する場合:
python main.py --config my_config.ini
詳細は CLIENT_MODE.md を参照してください。
{
"jsonrpc": "2.0",
"id": "550e8400-e29b-41d4-a716-446655440000",
"method": "translate_text",
"params": {
"text": "Hello, how are you?",
"source_lang": "en",
"target_lang": "ja",
"priority": "high"
}
}
{
"jsonrpc": "2.0",
"id": "550e8400-e29b-41d4-a716-446655440000",
"result": {
"translated": "こんにちは、元気ですか?",
"processing_time_ms": 250.5
}
}
このサーバーは JSON-RPC 2.0形式のみ をサポートしています。
type: "translation" などの従来カスタム形式は現在の実装では受け付けず、Invalid Request: JSON-RPC 2.0 format required を返します。
接続(再接続含む)のたびに自己紹介を送り、zagaroid のセッション台帳に登録される(zagaroid/docs/protocol.md § 4.1 / § 4.5):
{
"jsonrpc": "2.0",
"id": "<uuid>",
"method": "initialize",
"params": {
"protocol": "mzp/1.0",
"name": "MenZ-FuguMT",
"roles": ["nmt"]
}
}
応答 {"result": {"ok": true, "protocol": "mzp/1.0"}} を10秒以内に受けられなければ再接続する。
リクエスト:
{
"jsonrpc": "2.0",
"id": "550e8400-e29b-41d4-a716-446655440000",
"method": "translate_text",
"params": {
"text": "こんにちは、今日はお元気ですか?",
"speaker": "discord_user_123456789",
"source_lang": "ja",
"target_lang": "en",
"priority": "normal"
}
}
レスポンス:
{
"jsonrpc": "2.0",
"id": "550e8400-e29b-41d4-a716-446655440000",
"result": {
"translated": "Hello, how are you today?",
"processing_time_ms": 234.56,
"speaker": "discord_user_123456789"
}
}
translate_textテキストを翻訳します。
パラメータ:
text (string, required): 翻訳対象テキストsource_lang (string, optional): 源言語(デフォルト: "en")target_lang (string, optional): 目標言語(デフォルト: "ja")speaker (string, optional): 話者IDpriority (string, optional): 優先度(デフォルト: "normal")health_checkサーバーの健康状態を確認します。
パラメータ: なし
レスポンス例:
{
"jsonrpc": "2.0",
"id": "...",
"result": {
"status": "healthy",
"models_loaded": 2,
"device": "cuda:0",
"supported_pairs": ["en-ja", "ja-en"]
}
}
get_stats翻訳統計情報を取得します。
パラメータ: なし
list_methods利用可能なメソッド一覧を取得します。
パラメータ: なし
JSON-RPC形式のテストには、付属のテストスクリプトを使用できます:
python test_jsonrpc_client.py
using System;
using System.Threading.Tasks;
using UnityEngine;
using WebSocketSharp;
public class FuguMTClient : MonoBehaviour
{
private WebSocket ws;
void Start()
{
ws = new WebSocket("ws://127.0.0.1:55002");
ws.OnMessage += OnMessage;
ws.Connect();
}
public void TranslateText(string text, string sourceLang = "en", string targetLang = "ja")
{
var request = new
{
jsonrpc = "2.0",
id = Guid.NewGuid().ToString(),
method = "translate_text",
@params = new
{
text = text,
source_lang = sourceLang,
target_lang = targetLang
}
};
ws.Send(JsonUtility.ToJson(request));
}
private void OnMessage(object sender, MessageEventArgs e)
{
var response = JsonUtility.FromJson<TranslationResponse>(e.Data);
Debug.Log($"翻訳結果: {response.translated}");
}
}
[Serializable]
public class TranslationResponse
{
public string jsonrpc;
public string id;
public TranslationResult result;
}
[Serializable]
public class TranslationResult
{
public string translated;
public float processing_time_ms;
}
import asyncio
import websockets
import json
import uuid
async def translate_text_jsonrpc(text, source_lang="en", target_lang="ja", speaker=None):
"""JSON-RPC 2.0形式で翻訳"""
uri = "ws://127.0.0.1:50001"
async with websockets.connect(uri) as websocket:
request = {
"jsonrpc": "2.0",
"id": str(uuid.uuid4()),
"method": "translate_text",
"params": {
"text": text,
"source_lang": source_lang,
"target_lang": target_lang,
"speaker": speaker
}
}
await websocket.send(json.dumps(request))
response = await websocket.recv()
result = json.loads(response)
if "result" in result:
return result["result"]["translated"]
else:
raise Exception(result.get("error", {}).get("message", "Translation failed"))
# 使用例
async def main():
translation = await translate_text_jsonrpc(
"Hello world!",
speaker="user_123"
)
print(f"翻訳結果: {translation}")
asyncio.run(main())
# GPU環境をチェック
python check_gpu.py
# NVIDIA GPU
nvidia-smi
# 依存関係を再インストール
pip install torch --index-url https://download.pytorch.org/whl/cu118
設定ファイルを調整:
[TRANSLATION]
device = cuda # または mps
num_beams = 2 # ビーム数を減らす
max_length = 256 # 最大長を短縮
[PERFORMANCE]
batch_size = 4 # バッチサイズを増加
メモリ不足の場合:
[TRANSLATION]
num_beams = 1
max_length = 128
# Windows
netstat -an | findstr :55002
# Linux/macOS
lsof -i :55002
# キャッシュクリア
rm -rf ~/.cache/huggingface/
# 手動ダウンロード
python -c "from transformers import MarianTokenizer, MarianMTModel; MarianTokenizer.from_pretrained('staka/fugumt-en-ja'); MarianMTModel.from_pretrained('staka/fugumt-en-ja')"
MenZ-FuguMT/
├── FuguMTTranslator/ # メインパッケージ
│ ├── __init__.py
│ ├── config.py # 設定管理
│ ├── translator.py # 翻訳エンジン
│ └── websocket_server.py # WebSocketサーバー
├── config/
│ └── fugumt_translator.ini # 設定ファイル
├── logs/ # ログファイル
├── main.py # エントリーポイント
├── setup.py # セットアップスクリプト
├── requirements.txt # 依存関係
├── setup.bat / setup.sh # 自動セットアップ
├── run.bat / run.sh # 実行スクリプト
├── check_gpu.py # GPU環境チェック
└── README.md # このファイル
ログは以下の場所に出力されます:
logs\\fugumt_translator.loglogs/fugumt_translator.logGPU最適化:
[TRANSLATION]
device = cuda
use_cache = true
[PERFORMANCE]
worker_threads = 2
batch_size = 8
CPU最適化:
[TRANSLATION]
device = cpu
num_beams = 1
max_length = 256
[PERFORMANCE]
worker_threads = 4
batch_size = 1
このプロジェクトはMITライセンスの下で公開されています。
ただし、使用するFuguMTモデルはCC BY-SA 4.0ライセンスの下で配布されており、研究用途での使用が前提となっています。商用利用の際は、モデルライセンスを十分にご確認ください。
プルリクエストやイシューの報告を歓迎します。
問題が発生した場合は、GitHub Issues でお知らせください。
FuguMT翻訳サーバー - 高品質なオフライン翻訳サービスをあなたのアプリケーションに 🌸
zagaroid連携専用AI翻訳クライアント
FuguMTモデルを使用したオフライン翻訳サービスを提供するWebSocketクライアントです。zagaroidサーバーに接続し、JSON-RPC 2.0形式の翻訳リクエストを処理します。
主な特徴:
initialize(roles=["nmt"])を送信。仕様の正本は zagaroid/docs/protocol.md)FuguMTはs-takaさんが開発したオープンソースの英日・日英翻訳モデルです:
# プロジェクトをダウンロード
git clone https://github.com/your-username/MenZ-FuguMT.git
cd MenZ-FuguMT
# 自動セットアップを実行
setup.bat
# サーバーを起動
run.bat
# プロジェクトをダウンロード
git clone https://github.com/your-username/MenZ-FuguMT.git
cd MenZ-FuguMT
# 自動セットアップを実行
chmod +x setup.sh
./setup.sh
# サーバーを起動
./run.sh
# 1. 仮想環境を作成(推奨)
python3 -m venv venv
source venv/bin/activate # Linux/macOS
# または
venv\Scripts\activate # Windows
# 2. 依存関係をインストール
pip install -r requirements.txt
# 3. クライアントを起動(初回起動時に自動的に設定ファイルが作成されます)
python main.py
設定ファイル config/fugumt_translator.ini を編集して、サーバーの動作をカスタマイズできます。
[WEBSOCKET]
# zagaroidサーバーのIPアドレス
host = 127.0.0.1
# zagaroidサーバーのポート
port = 50001
# 接続パス(zagaroidの翻訳エンドポイント)
path = /translate_text
[TRANSLATION]
model_name_en_ja = staka/fugumt-en-ja
model_name_ja_en = staka/fugumt-ja-en
device = auto # auto, cpu, cuda, mps
max_length = 128
num_beams = 4
temperature = 1.0
use_cache = true
use_fp16 = false
[LOGGING]
level = INFO
file = logs/fugumt_translator.log
[PERFORMANCE]
timeout_seconds = 30.0
worker_threads = 2
zagaroidサーバーの接続先を指定します:
[WEBSOCKET]
host = 192.168.1.100 # zagaroidサーバーのIP
port = 50001 # zagaroidサーバーのポート
path = /translate_text # 翻訳エンドポイントのパス
auto: 自動選択(CUDA → MPS → CPU の順)cuda: NVIDIA GPU使用mps: Apple Silicon GPU使用cpu: CPU使用config/fugumt_translator.ini:
[WEBSOCKET]
host = 192.168.1.100 # zagaroidサーバーのIP
port = 50001 # zagaroidサーバーのポート
path = /translate_text # 翻訳エンドポイント
python main.py
別の設定ファイルを使用する場合:
python main.py --config my_config.ini
詳細は CLIENT_MODE.md を参照してください。
{
"jsonrpc": "2.0",
"id": "550e8400-e29b-41d4-a716-446655440000",
"method": "translate_text",
"params": {
"text": "Hello, how are you?",
"source_lang": "en",
"target_lang": "ja",
"priority": "high"
}
}
{
"jsonrpc": "2.0",
"id": "550e8400-e29b-41d4-a716-446655440000",
"result": {
"translated": "こんにちは、元気ですか?",
"processing_time_ms": 250.5
}
}
このサーバーは JSON-RPC 2.0形式のみ をサポートしています。
type: "translation" などの従来カスタム形式は現在の実装では受け付けず、Invalid Request: JSON-RPC 2.0 format required を返します。
接続(再接続含む)のたびに自己紹介を送り、zagaroid のセッション台帳に登録される(zagaroid/docs/protocol.md § 4.1 / § 4.5):
{
"jsonrpc": "2.0",
"id": "<uuid>",
"method": "initialize",
"params": {
"protocol": "mzp/1.0",
"name": "MenZ-FuguMT",
"roles": ["nmt"]
}
}
応答 {"result": {"ok": true, "protocol": "mzp/1.0"}} を10秒以内に受けられなければ再接続する。
リクエスト:
{
"jsonrpc": "2.0",
"id": "550e8400-e29b-41d4-a716-446655440000",
"method": "translate_text",
"params": {
"text": "こんにちは、今日はお元気ですか?",
"speaker": "discord_user_123456789",
"source_lang": "ja",
"target_lang": "en",
"priority": "normal"
}
}
レスポンス:
{
"jsonrpc": "2.0",
"id": "550e8400-e29b-41d4-a716-446655440000",
"result": {
"translated": "Hello, how are you today?",
"processing_time_ms": 234.56,
"speaker": "discord_user_123456789"
}
}
translate_textテキストを翻訳します。
パラメータ:
text (string, required): 翻訳対象テキストsource_lang (string, optional): 源言語(デフォルト: "en")target_lang (string, optional): 目標言語(デフォルト: "ja")speaker (string, optional): 話者IDpriority (string, optional): 優先度(デフォルト: "normal")health_checkサーバーの健康状態を確認します。
パラメータ: なし
レスポンス例:
{
"jsonrpc": "2.0",
"id": "...",
"result": {
"status": "healthy",
"models_loaded": 2,
"device": "cuda:0",
"supported_pairs": ["en-ja", "ja-en"]
}
}
get_stats翻訳統計情報を取得します。
パラメータ: なし
list_methods利用可能なメソッド一覧を取得します。
パラメータ: なし
JSON-RPC形式のテストには、付属のテストスクリプトを使用できます:
python test_jsonrpc_client.py
using System;
using System.Threading.Tasks;
using UnityEngine;
using WebSocketSharp;
public class FuguMTClient : MonoBehaviour
{
private WebSocket ws;
void Start()
{
ws = new WebSocket("ws://127.0.0.1:55002");
ws.OnMessage += OnMessage;
ws.Connect();
}
public void TranslateText(string text, string sourceLang = "en", string targetLang = "ja")
{
var request = new
{
jsonrpc = "2.0",
id = Guid.NewGuid().ToString(),
method = "translate_text",
@params = new
{
text = text,
source_lang = sourceLang,
target_lang = targetLang
}
};
ws.Send(JsonUtility.ToJson(request));
}
private void OnMessage(object sender, MessageEventArgs e)
{
var response = JsonUtility.FromJson<TranslationResponse>(e.Data);
Debug.Log($"翻訳結果: {response.translated}");
}
}
[Serializable]
public class TranslationResponse
{
public string jsonrpc;
public string id;
public TranslationResult result;
}
[Serializable]
public class TranslationResult
{
public string translated;
public float processing_time_ms;
}
import asyncio
import websockets
import json
import uuid
async def translate_text_jsonrpc(text, source_lang="en", target_lang="ja", speaker=None):
"""JSON-RPC 2.0形式で翻訳"""
uri = "ws://127.0.0.1:50001"
async with websockets.connect(uri) as websocket:
request = {
"jsonrpc": "2.0",
"id": str(uuid.uuid4()),
"method": "translate_text",
"params": {
"text": text,
"source_lang": source_lang,
"target_lang": target_lang,
"speaker": speaker
}
}
await websocket.send(json.dumps(request))
response = await websocket.recv()
result = json.loads(response)
if "result" in result:
return result["result"]["translated"]
else:
raise Exception(result.get("error", {}).get("message", "Translation failed"))
# 使用例
async def main():
translation = await translate_text_jsonrpc(
"Hello world!",
speaker="user_123"
)
print(f"翻訳結果: {translation}")
asyncio.run(main())
# GPU環境をチェック
python check_gpu.py
# NVIDIA GPU
nvidia-smi
# 依存関係を再インストール
pip install torch --index-url https://download.pytorch.org/whl/cu118
設定ファイルを調整:
[TRANSLATION]
device = cuda # または mps
num_beams = 2 # ビーム数を減らす
max_length = 256 # 最大長を短縮
[PERFORMANCE]
batch_size = 4 # バッチサイズを増加
メモリ不足の場合:
[TRANSLATION]
num_beams = 1
max_length = 128
# Windows
netstat -an | findstr :55002
# Linux/macOS
lsof -i :55002
# キャッシュクリア
rm -rf ~/.cache/huggingface/
# 手動ダウンロード
python -c "from transformers import MarianTokenizer, MarianMTModel; MarianTokenizer.from_pretrained('staka/fugumt-en-ja'); MarianMTModel.from_pretrained('staka/fugumt-en-ja')"
MenZ-FuguMT/
├── FuguMTTranslator/ # メインパッケージ
│ ├── __init__.py
│ ├── config.py # 設定管理
│ ├── translator.py # 翻訳エンジン
│ └── websocket_server.py # WebSocketサーバー
├── config/
│ └── fugumt_translator.ini # 設定ファイル
├── logs/ # ログファイル
├── main.py # エントリーポイント
├── setup.py # セットアップスクリプト
├── requirements.txt # 依存関係
├── setup.bat / setup.sh # 自動セットアップ
├── run.bat / run.sh # 実行スクリプト
├── check_gpu.py # GPU環境チェック
└── README.md # このファイル
ログは以下の場所に出力されます:
logs\\fugumt_translator.loglogs/fugumt_translator.logGPU最適化:
[TRANSLATION]
device = cuda
use_cache = true
[PERFORMANCE]
worker_threads = 2
batch_size = 8
CPU最適化:
[TRANSLATION]
device = cpu
num_beams = 1
max_length = 256
[PERFORMANCE]
worker_threads = 4
batch_size = 1
このプロジェクトはMITライセンスの下で公開されています。
ただし、使用するFuguMTモデルはCC BY-SA 4.0ライセンスの下で配布されており、研究用途での使用が前提となっています。商用利用の際は、モデルライセンスを十分にご確認ください。
プルリクエストやイシューの報告を歓迎します。
問題が発生した場合は、GitHub Issues でお知らせください。
FuguMT翻訳サーバー - 高品質なオフライン翻訳サービスをあなたのアプリケーションに 🌸