Closed9

「PLaMo翻訳CLI」を試す

kun432kun432

https://x.com/PLaMoLLM/status/1932305113735184886

公式記事
https://tech.preferred.jp/ja/blog/plamo-translate-cli/

先日(2025年5月27日)、Preferred Networksは「PLaMo翻訳」を発表しました。このモデルは、翻訳タスクに特化した大規模言語モデルであり、PLaMo Community License(ライセンス文解説記事)のもとで一般公開(Hugging Face)されています。この度、このモデルをより手軽にローカル環境で利用できるようにするためのコマンドラインツール「PLaMo翻訳CLI」をOSSとして公開*1しました。
plamo-translate-cli: https://github.com/pfnet/plamo-translate-cli
*1: プログラムコード・ツール自体はOSSライセンスですが、内部で利用するPLaMo翻訳モデルがPLaMo Community Licenseであるため、合わせて利用する際にはモデルライセンスの制約が加わることにご注意ください。

独自ライセンスだけど、自分の使い方的にはZennで記事書いたりする際の翻訳で使うことがメインになると思う。その用途なら、このモデル由来であることを明示するだけで良さそう。その他はライセンスを確認されたし。

kun432kun432

GitHubレポジトリ

https://github.com/pfnet/plamo-translate-cli

plamo-translate-cli

plamo-2-translateモデルをローカル実行で使用するためのコマンドラインインターフェイス

機能

  • 16以上の言語(日本語、英語、中国語、韓国語など)間でテキストを翻訳
  • スクリプトやワークフローへの統合が容易なシンプルなコマンドラインインターフェイス
  • 複数のサーバーバックエンドをサポート(MLX、今後OllamaおよびvLLMを予定)
    • 現在はApple Silicon搭載macOS向けにMLXフレームワークで最適化済み

要件

  • Python 3.10以上
    • 共通依存関係:
      • mcp[cli]
      • numba
    • macOSの場合:
      • mlx-lm

対応言語

  • 日本語
  • 日本語(簡易)
  • 英語

実験的にサポートされている言語

  • 中国語
  • 台湾語
  • 韓国語
  • アラビア語
  • イタリア語
  • インドネシア語
  • オランダ語
  • スペイン語
  • タイ語
  • ドイツ語
  • フランス語
  • ベトナム語
  • ロシア語
kun432kun432

インストール

Mac(M2 Pro)で。

uv init -p 3.12 plamo-translate-cli && cd plamo-translate-cli
uv add plamo-translate
出力
 + plamo-translate==1.0.2
kun432kun432

CLI

まずUsage。

uv run plamo-translate --help
出力
usage: plamo-translate [-h] [--version] [--input INPUT]
                       [--from {Japanese,Japanese(easy),English,Chinese,Taiwanese,Korean,Arabic,Italian,Indonesian,Dutch,Spanish,Thai,German,French,Vietnamese,Russian,English|Japanese}]
                       [--to {Japanese,Japanese(easy),English,Chinese,Taiwanese,Korean,Arabic,Italian,Indonesian,Dutch,Spanish,Thai,German,French,Vietnamese,Russian,English|Japanese,}]
                       [--backend-type {mlx}] [--precision {4bit,8bit,bf16}] [--no-stream]
                       [--interactive]
                       {server,show-claude-config} ...

PLaMo Translate CLI

positional arguments:
  {server,show-claude-config}
                        Command to run
    server              Run the server
    show-claude-config  Show the MCP server config for Claude Desktop

options:
  -h, --help            show this help message and exit
  --version, -v         Show program's version number and exit.
  --input INPUT         Input text to translate
  --from {Japanese,Japanese(easy),English,Chinese,Taiwanese,Korean,Arabic,Italian,Indonesian,Dutch,Spanish,Thai,German,French,Vietnamese,Russian,English|Japanese}
                        Input language for translation
  --to {Japanese,Japanese(easy),English,Chinese,Taiwanese,Korean,Arabic,Italian,Indonesian,Dutch,Spanish,Thai,German,French,Vietnamese,Russian,English|Japanese,}
                        Output language for translation
  --backend-type {mlx}  Server backend to use (default: mlx on macOS, transformers elsewhere)
  --precision {4bit,8bit,bf16}, -p {4bit,8bit,bf16}
                        Model parameter's precision to use (default: 4bit)
  --no-stream           Enable batch processing mode for translation
  --interactive, -i     Enable interactive mode for translation

インタラクティブモード

uv run plamo-translate

初回はモデルがダウンロードされるので少し時間がかかる~~・・・というかびっくりするぐらい遅いな。自分の環境起因なのかもしれないけど。気長に待つとする。~~ どこかで詰まっていたのかもしれない。途中で一気に進んで完了した。

出力
special_tokens_map.json: 100%|███████████████████████████████████| 587/587 [00:00<00:00, 367kB/s]
model.safetensors.index.json: 100%|█████████████████████████| 57.2k/57.2k [00:00<00:00, 27.1MB/s]
config.json: 100%|██████████████████████████████████████████| 1.43k/1.43k [00:00<00:00, 1.78MB/s]
generation_config.json: 100%|████████████████████████████████████| 132/132 [00:00<00:00, 142kB/s]
modeling_plamo.py: 100%|████████████████████████████████████| 66.8k/66.8k [00:00<00:00, 4.75MB/s]
tokenization_plamo.py: 100%|████████████████████████████████| 16.9k/16.9k [00:00<00:00, 71.3MB/s]
tokenizer_config.json: 100%|████████████████████████████████| 1.87k/1.87k [00:00<00:00, 8.59MB/s]
tokenizer.jsonl: 100%|██████████████████████████████████████| 10.6M/10.6M [00:02<00:00, 5.07MB/s]
tokenization_plamo.py:   0%|                                         | 0.00/16.9k [00:00<?, ?B/s]
model.safetensors:   0%|                                   | 758k/5.36G [00:05<10:21:54, 144kB/s]

以下のように表示されればOK。

出力
History file /Users/kun432/.plamo_translate_history not found. Starting a new history file.
Interactive mode enabled. Type your input below (Ctrl+D to exit).
>

では適当に入力してみる。

> おはようございます。今日はいいお天気ですね。こんな日は競馬に行きたくなりますね。
出力
Good morning. It's such a nice day today, isn't it? Days like this make me want to go to the horse races.
今週末は春GIの締めくくり、宝塚記念がありますね。楽しみです。
出力
This weekend marks the final spring GI race, the Takarazuka Kinen. I'm looking forward to it.

デフォルトはどうやら日⇔英で、初回入力した文字列を元に以後は翻訳が行われるみたい。なので上の例だと日→英になってるので、英語を入力してもそのまま返ってくる。

> Good morning. It's such a nice day today, isn't it? Days like this make me want to go to the horse races.
出力
Good morning. It's such a nice day today, isn't it? Days like this make me want to go to the horse races.

Ctrl+Cで一旦止めて再度起動。今度は英語を入力してみる。

uv run plamo-translate
出力
> Good morning. It's such a nice day today, isn't it? Days like this make me want to go to the horse races.
おはようございます。今日はとてもいい天気ですね。こんな日は競馬に行きたくなります。
> This weekend marks the final spring GI race, the Takarazuka Kinen. I'm looking forward to it.
今週末は春のGIレース最終戦、宝塚記念です。楽しみにしています。

起動時に--from/--toを指定すれば、言語を指定できる。

uv run plamo-translate --from Japanese --to Spanish
出力
> おはようございます。今日はいいお天気ですね。こんな日は競馬に行きたくなりますね。
Buenos días. Es un día muy bueno, no es cierto? En días como este, te apetece ir al hipódromo, ¿no es así?
> 今週末は春GIの締めくくり、宝塚記念がありますね。楽しみです。
Esta fin de semana tendrá lugar el Gran Premio de Primavera, el Premio Takarazuka. Estoy muy entusiasmado.

パイプを使って標準入力から受けることもできる。

echo -n "おはようございます。今日はいいお天気ですね。こんな日は競馬に行きたくなりますね。\n今週末は春GIの締めくくり、宝塚記念がありますね。楽しみです。" \
    | uv run plamo-translate
出力
Good morning! It's such a beautiful day today, isn't it? Days like this make me want to go to the horse races.\nThis weekend, we'll see the conclusion of the spring GI season with the Takarazuka Kinen race. I'm looking forward to it.

ファイルからも。

cat << EOF > sample.txt 
おはようございます。今日はいいお天気ですね。こんな日は競馬に行きたくなりますね。
今週末は春GIの締めくくり、宝塚記念がありますね。楽しみです。
EOF 
cat sample.txt  | uv run plamo-translate
出力
Good morning! It's such a nice day today, isn't it? Days like this make me want to go to the horse races.
This weekend, we have the Takarazuka Kinen race - the final GI event of spring. I'm really looking forward to it.

CLIの場合、毎実行時にモデルがロードされるので少し時間がかかる。

uv run plamo-translate
出力
Fetching 9 files: 100%|████████████████████████████████████████| 9/9 [00:00<00:00, 104567.14it/s]
Interactive mode enabled. Type your input below (Ctrl+D to exit).
>

サーバモードを使うとモデルをロードして常駐するので高速に使える。

uv run plamo-translate server
出力
Fetching 9 files: 100%|████████████████████████████████████████| 9/9 [00:00<00:00, 121378.57it/s]
INFO:     Started server process [21085]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:30000 (Press CTRL+C to quit)

なるほど。30000番ポートで待ち受けている。

で別のターミナルでCLIを実行してみる。

uv run plamo-translate

モデルロードなく、すぐにプロンプトが返ってくる。

出力
Interactive mode enabled. Type your input below (Ctrl+D to exit).
>
kun432kun432

とりあえずサーバーモードで常駐させると良さそう。LaunchAgentの設定をo4-miniに教えてもらった。

起動スクリプトをplamo-translate-cliをインストールしたパスに作成

start-plamo-translate-server.sh
#!/usr/bin/env bash

set -e

cd /Users/kun432/work/plamo-translate-cli
exec /opt/homebrew/bin/uv run plamo-translate server
chmod +x start-plamo-translate-server.sh

LaunchAgentのplistを作成

~/Library/LaunchAgents/jp.preferred.plamotranslate.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
   "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <!-- ユニークなラベル -->
    <key>Label</key>
    <string>jp.preferred.plamotranslate</string>

    <!-- 起動スクリプトへのパス -->
    <key>ProgramArguments</key>
    <array>
      <string>/Users/kun432/work/plamo-translate-cli/start-plamo-translate-server.sh</string>
    </array>

    <!-- macOS起動時/plist読み込み時に自動起動 -->
    <key>RunAtLoad</key>
    <true/>

    <!-- プロセスが落ちたら再起動 -->
    <key>KeepAlive</key>
    <true/>

    <!-- 標準出力・標準エラーのリダイレクト先 -->
    <key>StandardOutPath</key>
    <string>/Users/kun432/Library/Logs/plamo-translate.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/kun432/Library/Logs/plamo-translate.log</string>
  </dict>
</plist>

plistをロードしたら起動しているはず。

launchctl load ~/Library/LaunchAgents/jp.preferred.plamotranslate.plist
cat ~/Library/Logs/plamo-translate.log
出力
Fetching 9 files: 100%|██████████| 9/9 [00:00<00:00, 63019.59it/s]
INFO:     Started server process [21984]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:30000 (Press CTRL+C to quit)
kun432kun432

MCP

plamo-translate-cliはMCPでも使える。サーバは上ですでに起動しているので、CLIでshow-claude-configというサブコマンドを実行すると設定が表示されるらしい。

uv run plamo-translate show-claude-config
出力
{
  "mcpServers": {
    "plamo-translate": {
      "command": "/opt/homebrew/bin/npx",
      "args": [
        "-y",
        "mcp-remote",
        "http://localhost:30000/mcp",
        "--allow-http",
        "--transport",
        "http-only"
      ],
      "env": {
        "PATH": "/Users/kun432/work/plamo-translate-cli/.venv/bin:(snip)"
      }
    }
  }
}

なるほど、これをMCPクライアントに設定すればよいと。自分はClaude Desktopに設定してみた。最初なぜか上手く繋がらなくてツールが有効にならなかったのだけど、何度か試してたら有効になった。

こんな感じで使える。

kun432kun432

起動時に--precisionでモデルの重みのフォーマットを指定できるみたい。デフォルトは4ビット量子化されてる様子。

出力
  --precision {4bit,8bit,bf16}, -p {4bit,8bit,bf16}
                        Model parameter's precision to use (default: 4bit)
kun432kun432

自分はClaude Desktopに設定してみた。最初なぜか上手く繋がらなくてツールが有効にならなかったのだけど、何度か試してたら有効になった。

うーん、結構な頻度で「無効」になる。Claude Desktopは0.10.14 。

サーバ側のログを見るとこんな感じ

出力
RuntimeError: Unexpected ASGI message 'http.response.start' sent, after response already completed.
このスクラップは3ヶ月前にクローズされました