doc READMEに画像を添付
This commit is contained in:
299
README.md
299
README.md
@@ -1,236 +1,117 @@
|
|||||||
# VRC_OSC
|
# VRC_OSC
|
||||||
|
|
||||||
VRChat の OSC パラメータを受けて、Discord ミュート、VRChat ログ監視、OCR、翻訳を実行するローカルツール。
|
VRC_OSC は、VRChat の状態を見て Discord やログ連携を行うためのツールです。
|
||||||
|
|
||||||
## 起動
|
一番の使い方は、VRChat の `ExMenu` から操作することです。
|
||||||
|
`ExMenu` は VRChat のメニュー画面に出る、追加の操作メニューです。
|
||||||
|
|
||||||
依存関係を入れる。
|
## できること
|
||||||
|
|
||||||
```powershell
|
- VRChat のログを見て Discord に通知する
|
||||||
python -m pip install -r requirements.txt
|
- Discord のミュートを VRChat 側の操作に合わせて切り替える
|
||||||
```
|
- VRChat 画面を読み取って OCR する
|
||||||
|
- OCR した文字を翻訳してコピーする
|
||||||
|
|
||||||
PowerShell から起動する。
|
## 画面イメージ
|
||||||
|
|
||||||
|
### ExMenu
|
||||||
|
|
||||||
|
VRChat のメニュー画面から、このツールの機能を操作します。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### VRC Log
|
||||||
|
|
||||||
|
VRChat のログ確認や通知の流れは、次のようなイメージです。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 使い方
|
||||||
|
|
||||||
|
1. 必要な設定ファイルを用意します。
|
||||||
|
2. ツールを起動します。
|
||||||
|
3. VRChat を開きます。
|
||||||
|
4. VRChat の `ExMenu` から必要な機能を選びます。
|
||||||
|
|
||||||
|
### Discord のミュート連動
|
||||||
|
|
||||||
|
VRChat 側で特定の操作が行われたときに、Discord のミュート状態を切り替えます。
|
||||||
|
通話中に VRChat を使うとき、Discord の音声操作を手で切り替える手間を減らすための機能です。
|
||||||
|
|
||||||
|
### OCR と翻訳
|
||||||
|
|
||||||
|
VRChat 画面の文字を読み取って、必要に応じて翻訳します。
|
||||||
|
見た文字や翻訳結果はコピーできるので、内容をそのまま使いやすくなります。
|
||||||
|
|
||||||
|
## 起動方法
|
||||||
|
|
||||||
|
PowerShell から起動する場合:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
bin\vrc_osc.ps1
|
bin\vrc_osc.ps1
|
||||||
```
|
```
|
||||||
|
|
||||||
Python から直接起動する場合。
|
Python から直接起動する場合:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
python src\app.py
|
python src\app.py
|
||||||
```
|
```
|
||||||
|
|
||||||
OSC は `127.0.0.1:9001` で待ち受ける。
|
## 事前準備
|
||||||
|
|
||||||
## 構成
|
依存関係を入れます。
|
||||||
|
|
||||||
```text
|
```powershell
|
||||||
bin/ PowerShell 起動スクリプト
|
python -m pip install -r requirements.txt
|
||||||
config/ example とローカル設定置き場
|
|
||||||
src/app.py アプリ本体のエントリ
|
|
||||||
src/common/ パス、設定ロード、runtime ログなどの共通基盤
|
|
||||||
src/discord_control/ Discord ウィンドウ操作
|
|
||||||
src/ocr/ OCR 実行
|
|
||||||
src/osc/ OSC gateway
|
|
||||||
src/screen/ VRChat ウィンドウ検出とキャプチャ
|
|
||||||
src/tools/ 単体実行用の補助ツール
|
|
||||||
src/translate/ 翻訳
|
|
||||||
src/vrc_log/ VRChat ログ解析と名簿照合
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 設定ファイル
|
## 設定ファイル
|
||||||
|
|
||||||
実設定は `config/config.toml` に置く。このファイルは Git に入れない。
|
設定は `config/` に置きます。
|
||||||
|
|
||||||
雛形は `config/config.example.toml`。
|
|
||||||
|
|
||||||
```toml
|
|
||||||
[self]
|
|
||||||
name = "自分のVRChat表示名"
|
|
||||||
|
|
||||||
[staff]
|
|
||||||
names = [
|
|
||||||
"StaffUserA"
|
|
||||||
]
|
|
||||||
|
|
||||||
[guest]
|
|
||||||
file = "config/guests.txt"
|
|
||||||
|
|
||||||
[notice]
|
|
||||||
missing_count = 3
|
|
||||||
|
|
||||||
[ocr.crop]
|
|
||||||
left = 0.05
|
|
||||||
top = 0.35
|
|
||||||
right = 0.95
|
|
||||||
bottom = 0.95
|
|
||||||
|
|
||||||
[ocr]
|
|
||||||
preprocess = true
|
|
||||||
scale = 1.5
|
|
||||||
use_angle_cls = false
|
|
||||||
```
|
|
||||||
|
|
||||||
`self.name` は Discord 自動ミュート判定に使う。
|
|
||||||
|
|
||||||
`staff.names` は表示対象だが guest 人数には含めない。
|
|
||||||
|
|
||||||
`guest.file` は guest 名簿ファイル。guest 人数の母数と在室判定に使う。
|
|
||||||
|
|
||||||
`notice.missing_count` は「あと何人以内で全員集合か」の通知範囲。例えば guest が 23 人で `missing_count = 3` の場合、20〜22 人のときに未入室 guest を出す。
|
|
||||||
|
|
||||||
OCR 設定は速度と精度の調整用。
|
|
||||||
|
|
||||||
`ocr.crop` は VRChat ウィンドウ内の相対座標。`0.0` から `1.0` で指定する。デフォルトは画面下側の中央寄りだけを読む。
|
|
||||||
|
|
||||||
フル画面 OCR に戻す場合。
|
|
||||||
|
|
||||||
```toml
|
|
||||||
[ocr.crop]
|
|
||||||
left = 0
|
|
||||||
top = 0
|
|
||||||
right = 1
|
|
||||||
bottom = 1
|
|
||||||
```
|
|
||||||
|
|
||||||
`ocr.preprocess = true` はグレースケール化、コントラスト補正、シャープ化、拡大を行う。
|
|
||||||
|
|
||||||
`ocr.scale` は前処理時の拡大率。大きいほど小さい文字に強くなるが遅くなる。
|
|
||||||
|
|
||||||
`ocr.use_angle_cls = false` は角度分類を切って高速化する。縦書きや回転文字を読む必要がある場合だけ `true` にする。
|
|
||||||
|
|
||||||
## guest 名簿
|
|
||||||
|
|
||||||
`config/guests.txt` に 1 行 1 名で書く。このファイルは Git に入れない。
|
|
||||||
|
|
||||||
雛形は `config/guests.example.txt`。
|
|
||||||
|
|
||||||
```text
|
|
||||||
GuestUserA
|
|
||||||
GuestUserB
|
|
||||||
GuestUserC
|
|
||||||
```
|
|
||||||
|
|
||||||
空行と `#` で始まる行は無視する。
|
|
||||||
|
|
||||||
## 秘密情報
|
|
||||||
|
|
||||||
秘密情報は `config/secrets.toml` に置く。このファイルは Git に入れない。
|
|
||||||
|
|
||||||
雛形は `config/secrets.example.toml`。
|
|
||||||
|
|
||||||
```toml
|
|
||||||
[discord]
|
|
||||||
webhook_url = ""
|
|
||||||
|
|
||||||
[vrchat]
|
|
||||||
username = ""
|
|
||||||
password = ""
|
|
||||||
```
|
|
||||||
|
|
||||||
`discord.webhook_url` は VRC ログ結果の Discord Webhook 通知に使う。
|
|
||||||
|
|
||||||
`vrchat.username` / `vrchat.password` は `src/tools/resolve_vrchat_user.py` を使う場合だけ必要。
|
|
||||||
|
|
||||||
## OSC パラメータ
|
|
||||||
|
|
||||||
Avatar Parameters 側の名前と一致させる。
|
|
||||||
|
|
||||||
| Parameter | 動作 |
|
|
||||||
| --- | --- |
|
|
||||||
| `DiscordSend` | 押した瞬間に Discord の mute hotkey を送る |
|
|
||||||
| `vrc_log` | VRC ログ監視の on/off |
|
|
||||||
| `ocrEnabled` | VRChat 画面を撮って OCR |
|
|
||||||
| `translation` | OCR して日本語翻訳 |
|
|
||||||
|
|
||||||
## VRC ログ監視
|
|
||||||
|
|
||||||
`vrc_log` を押すと、現在の VRChat ログを一度解析して Discord Webhook に送る。その後はログファイル末尾を追い、新しい join / leave / world 系ログが追記されたタイミングで即再解析する。
|
|
||||||
|
|
||||||
以前のような `output_log = 10` の秒数ポーリング設定は使わない。
|
|
||||||
|
|
||||||
解析対象は昼 12:00 以降。実行時刻が昼 12:00 前なら前日 12:00 以降を見る。
|
|
||||||
|
|
||||||
インスタンスが変わったら在室状態はリセットする。
|
|
||||||
|
|
||||||
出力例。
|
|
||||||
|
|
||||||
```text
|
|
||||||
ワールド入室: Midnight Rooftop
|
|
||||||
現在Guest: 0/3
|
|
||||||
[01:20] [join] GuestUserA 1/3
|
|
||||||
[01:21] [join] GuestUserB 2/3
|
|
||||||
[01:25] [leave] GuestUserA 1/3
|
|
||||||
[01:26] [join] [staff] StaffUserA 1/3
|
|
||||||
```
|
|
||||||
|
|
||||||
notice 条件に入った場合。
|
|
||||||
|
|
||||||
```text
|
|
||||||
現在Guest: 2/3
|
|
||||||
未入室Guest:
|
|
||||||
- GuestUserC
|
|
||||||
```
|
|
||||||
|
|
||||||
## Discord 自動ミュート
|
|
||||||
|
|
||||||
常時 self monitor が VRChat ログの新規追記だけを見る。
|
|
||||||
|
|
||||||
新しく追記されたログの中で、自分の最後のイベントが `OnPlayerJoined` なら Discord を mute、`OnPlayerLeft` なら unmute する。
|
|
||||||
|
|
||||||
過去ログ全体の最後が self leave / join だっただけでは反応しない。
|
|
||||||
|
|
||||||
`setDiscordMuted()` にはロックがあり、同時実行で mute hotkey が連続送信されないようにしている。
|
|
||||||
|
|
||||||
## OCR / 翻訳
|
|
||||||
|
|
||||||
`ocrEnabled` は VRChat ウィンドウを撮影して PaddleOCR にかける。結果はクリップボードへコピーする。
|
|
||||||
|
|
||||||
`translation` は OCR 結果を翻訳し、翻訳結果をクリップボードへコピーする。
|
|
||||||
|
|
||||||
OCR はデフォルトで画面全体ではなく、画面下側の中央寄りを切り出して読む。会話ログや字幕を読む用途では速く、余計な UI 文字を拾いにくい。
|
|
||||||
|
|
||||||
## runtime
|
|
||||||
|
|
||||||
新規の実行ログは基本的に以下へまとめる。
|
|
||||||
|
|
||||||
```text
|
|
||||||
runtime/runtime.log
|
|
||||||
runtime/latest_ocr.png
|
|
||||||
runtime/latest_screenshot.png
|
|
||||||
```
|
|
||||||
|
|
||||||
`runtime/` は Git に入れない。
|
|
||||||
|
|
||||||
OCR text、翻訳 text、VRC ログ結果は `runtime/runtime.log` に追記する。
|
|
||||||
|
|
||||||
画像は最新ファイルに上書きする。日時別ファイルを増やさない。
|
|
||||||
|
|
||||||
## ユーザー名照合
|
|
||||||
|
|
||||||
`src/vrc_log/member_name_matcher.py` は TOML 登録名と VRChat 表示名を安全な順番で紐づける補助実装。
|
|
||||||
|
|
||||||
照合順。
|
|
||||||
|
|
||||||
1. 完全一致
|
|
||||||
2. 正規化一致
|
|
||||||
3. 高信頼 fuzzy
|
|
||||||
4. guest のみ低信頼 fuzzy
|
|
||||||
5. pending / ambiguous / unmatched
|
|
||||||
|
|
||||||
完全一致・正規化一致で確定した名前は fuzzy 候補から除外する。
|
|
||||||
|
|
||||||
## Git に入れないもの
|
|
||||||
|
|
||||||
以下はローカル専用。
|
|
||||||
|
|
||||||
- `config/config.toml`
|
- `config/config.toml`
|
||||||
- `config/secrets.toml`
|
- `config/secrets.toml`
|
||||||
- `config/guests.txt`
|
- `config/guests.txt`
|
||||||
- `runtime/`
|
|
||||||
- `__pycache__/`
|
|
||||||
- `*.pyc`
|
|
||||||
- `.vrchat_cookie.txt`
|
|
||||||
|
|
||||||
|
サンプルはそれぞれ `*.example.*` を使って作成できます。
|
||||||
|
|
||||||
|
## 初期セットアップ
|
||||||
|
|
||||||
|
最初は、`config/` のサンプルファイルを実ファイルにしてから中身を埋めます。
|
||||||
|
|
||||||
|
1. `config/config.example.toml` を `config/config.toml` にコピーします。
|
||||||
|
2. `config/secrets.example.toml` を `config/secrets.toml` にコピーします。
|
||||||
|
3. `config/guests.example.txt` を `config/guests.txt` にコピーします。
|
||||||
|
4. `config/config.toml` の `self.name` を自分の VRChat 表示名にします。
|
||||||
|
5. `config/secrets.toml` の `discord.webhook_url` を設定します。
|
||||||
|
6. `config/secrets.toml` の `vrchat.username` と `vrchat.password` を設定します。
|
||||||
|
7. `config/guests.txt` に、あらかじめ guest として見たい参加者名を 1 行ずつ書きます。
|
||||||
|
8. 自分の名前も guest 扱いしたい場合は、`guests.txt` に自分の名前も 1 行追加します。
|
||||||
|
|
||||||
|
`guests.txt` は、例として次のように書きます。
|
||||||
|
|
||||||
|
```text
|
||||||
|
GuestUserA
|
||||||
|
GuestUserB
|
||||||
|
YourNameHere
|
||||||
|
```
|
||||||
|
|
||||||
|
## よく使う設定
|
||||||
|
|
||||||
|
- `discord.webhook_url`
|
||||||
|
- Discord に通知を送るための Webhook URL
|
||||||
|
- `vrchat.username`
|
||||||
|
- VRChat のアカウント名
|
||||||
|
- `vrchat.password`
|
||||||
|
- VRChat のパスワード
|
||||||
|
- `staff.names`
|
||||||
|
- スタッフとして扱う名前
|
||||||
|
- `guest.file`
|
||||||
|
- guest 名簿のファイル
|
||||||
|
|
||||||
|
## 補足
|
||||||
|
|
||||||
|
この README は、まず使い方が分かることを優先して簡単にまとめています。
|
||||||
|
細かい内部仕様が必要な場合は、ソースコードと `config/*.example.*` を見てください。
|
||||||
|
|||||||
Reference in New Issue
Block a user