eスポーツチームの練習を、毎日10分で総括レポートにする。
人手ゼロ、24時間稼働、日本語と韓国語で自動配信。
人間が触るのは「Discordで練習する」「朝にレポートを読む」だけ。
Botが Discord 内で発言・読み取りをするには、
Discord社から発行される専用ID番号が必要。これが Bot Token。
⚠️ 漏洩したら即「リセット」して新しい番号に切り替え。我々の運用でも複数回切り替え経験あり。
左: Discord Developer Portal で Bot を作成・トークンを発行する画面。 / 右: 作った Bot を実際のサーバーに招待・参加させる承認画面。
🔗 https://discord.com/developers/applications
アプリ名・アイコン・アプリID(社員ID)・公開キー(パスポート番号)などを管理。 ここで 「Reset Token」を押すと、新しい Bot Token(=社員証)が発行される。
管理者が 「Bot の管理者を追加」「ファンを管理する」「新しいロールでサーバーを管理」 等の権限を確認して承認。 これでようやく Bot がチャットに発言できる状態になる。
普段はマウスでクリックして操作するが、
その裏側には文字でコンピュータに命令する方法がある。
実際の例 — 我々がAIに分析を依頼するときのコマンド:
Mac のターミナル(黒い画面)に文字を1行打つだけで、翻訳Botが起動する。
マウス・GUIは使わない。「python main.py」と打って Enter を押すだけ。
タイトルバー「miyoshi — -zsh — 80×24」。zshシェル上で python main.py を入力。 Enter を押すと Bot が Discord に接続して動き始める。
人間がやることは「Enterキーを押す」だけ。残りはコードに書かれた手順を Python が順番に実行する。
毎日決まった時間に決まった作業をやらせる仕組み。
人間が眠っている間にも動くのが特徴。
Batch(バッチ) = 一連の作業を一気にこなすこと
例: ①古いログを取りに行く → ②必要な部分を切り出す → ③AIに分析させる → ④結果をDiscordに送る
普通の人がDiscordを使うときは画面でメッセージを打つ。
プログラムは画面を持っていないので、専用の業者用入口から操作する。
身近な例: 天気予報アプリ ← 気象庁API / 経路検索 ← Maps API / LINE通知 ← LINE API
現代のサービスの裏側は、ほぼすべてAPIで繋がっている。
Discord が公開している API ドキュメントを、私たちはマニュアル代わりに読む。 実際の通信を curl コマンドで再現すると、Bot がやっていることが「ただの HTTP リクエスト」だと分かる。
🔗 公式ドキュメント: https://discord.com/developers/docs/resources/message#create-message
Bot は内部でこれと同じ HTTP リクエストを毎日 20 回前後、自動で送り続けている。
4つの用語が、ここで全部使われている。
flowchart LR
classDef discord fill:#23272A,stroke:#5865F2,color:#fff,stroke-width:2px
classDef windows fill:#1a2332,stroke:#0078D4,color:#fff,stroke-width:2px
classDef mac fill:#202020,stroke:#A8A8A8,color:#fff,stroke-width:2px
classDef ai fill:#2a1f1a,stroke:#CC785C,color:#fff,stroke-width:2px
classDef api fill:#2a2f10,stroke:#E6FF3D,color:#fff,stroke-width:2px
subgraph D[" 🎮 DISCORD "]
direction TB
VC["🎙️ Voice Channel
(練習中の会話)"]:::discord
JA["💬 #ai-summary-jp"]:::discord
KR["💬 #ai-summary-kr"]:::discord
end
subgraph W[" 🪟 WINDOWS PC + 🎮 NVIDIA RTX 2080 "]
direction TB
TB["🌐 翻訳Bot
(Whisper v3 Turbo)"]:::windows
GPU["⚡ RTX 2080 (CUDA)
Whisper ローカル推論"]:::windows
LG[("📝 transcript_*.txt
練習ログ")]:::windows
end
subgraph M[" 🍎 MAC MINI "]
direction TB
CR["⏰ Cron
毎日 12:00"]:::mac
SH["📜 自動分析
スクリプト"]:::mac
CL["💻 Claude CLI
(claude -p)"]:::mac
end
subgraph AI[" ☁️ ANTHROPIC "]
AIA["🤖 Claude Opus
分析エンジン"]:::ai
end
subgraph AP[" 🔌 DISCORD API "]
EP["api/v10/channels
+ Bot Token"]:::api
end
VC ==>|"① 音声"| TB
TB -.->|"翻訳テキスト表示"| VC
TB ==>|"② 全発言追記"| LG
CR ==>|"③ 起動"| SH
SH -->|"④ SSH取得"| LG
SH -->|"⑤ プロンプト"| CL
CL <==>|"⑥ 推論"| AIA
SH -->|"⑦ JA レポート"| EP
SH -->|"⑧ KR 翻訳→送信"| EP
EP -->|"HTTP POST"| JA
EP -->|"HTTP POST"| KR
flowchart TB
classDef discord fill:#23272A,stroke:#5865F2,color:#fff,stroke-width:2px
classDef bot fill:#1a2332,stroke:#0078D4,color:#fff,stroke-width:2px
classDef gpu fill:#1f3a1f,stroke:#76B900,color:#fff,stroke-width:2px
classDef openai fill:#1a2a23,stroke:#10A37F,color:#fff,stroke-width:2px
classDef storage fill:#202020,stroke:#A8A8A8,color:#fff,stroke-width:2px
subgraph User[" 👤 USER "]
Speaker["話者
日本語 / 韓国語"]:::discord
end
subgraph Discord[" 🎮 DISCORD "]
VoiceCh["🎙️ Voice Channel"]:::discord
TextCh["💬 Text Channel
(翻訳結果表示)"]:::discord
end
subgraph Bot[" 🤖 翻訳Bot (Windows PC) "]
AudioCap["📡 音声キャプチャ"]:::bot
STT["🎧 STT 呼び出し"]:::bot
LangDet["🌐 言語判定"]:::bot
Trans["🔄 翻訳呼び出し"]:::bot
Sender["📤 メッセージ送信"]:::bot
Logger["📝 ログ追記"]:::bot
end
subgraph LocalGPU[" ⚡ ローカル GPU (RTX 2080) "]
Whisper["Whisper v3 Turbo
(faster-whisper)"]:::gpu
end
subgraph OpenAI[" ☁️ OPENAI "]
GPT["ChatGPT 4o mini
(ja ↔ ko 翻訳)"]:::openai
end
subgraph Storage[" 💾 LOCAL STORAGE "]
Log[("📝 transcript_*.txt")]:::storage
end
Speaker -.->|発話| VoiceCh
VoiceCh ==>|Opus 音声| AudioCap
AudioCap ==> STT
STT <==>|ローカル推論| Whisper
STT ==> LangDet
LangDet ==> Trans
Trans <==>|REST API| GPT
Trans ==> Sender
Trans ==> Logger
Sender ==>|Discord SDK| TextCh
Logger ==> Log
sequenceDiagram autonumber participant U as 👤 話者 participant V as 🎙️ Voice Ch participant B as 🤖 翻訳Bot participant W as ⚡ Whisper v3 Turbo
(ローカル GPU) participant G as ☁️ ChatGPT 4o mini
(OpenAI API) participant T as 💬 Text Ch participant L as 📝 Log U->>V: 発話「ガンクお願い」 V->>B: Opus 音声ストリーム B->>W: faster-whisper.transcribe() W-->>B: text: 「ガンクお願い」 B->>B: 言語判定 → ja B->>G: POST /v1/chat/completions (ja→ko) G-->>B: 「갱크 부탁해요」 par 並列処理 B->>T: POST messages Note over T: ユーザー画面に表示 and B->>L: 追記 (タイムスタンプ付き) Note over L: 後のAI分析の原料 end
flowchart TB classDef stage fill:#1a1a1a,stroke:#5865F2,color:#fff,stroke-width:2px classDef payload fill:#000,stroke:#E6FF3D,color:#E6FF3D,stroke-dasharray:5 3 S1["① 音声入力 ( ≈ 0.8 秒 )"]:::stage P1["🔊 「ガンクお願い」
Opus 40kbps / Discord Voice"]:::payload S2["② Whisper v3 Turbo ( ≈ 200ms )
ローカル GPU 推論 (RTX 2080)"]:::stage P2["text: 「ガンクお願い」
confidence: 0.94"]:::payload S3["③ 言語判定 ( ≈ 20ms )"]:::stage P3["lang: ja
score: 0.98"]:::payload S4["④ ChatGPT 4o mini ( ≈ 250ms )
OpenAI API"]:::stage P4["text: 「갱크 부탁해요」"]:::payload S5a["⑤a Discord に投稿"]:::stage S5b["⑤b Log に追記"]:::stage P5["💬 表示メッセージ
HRK (ja): ガンクお願い
→ ko: 갱크 부탁해요"]:::payload P6["📝 transcript_2026-06-13.txt
[2026-06-13 21:42:18] HRK (ja):
ガンクお願い -> ko: 갱크 부탁해요"]:::payload S1 --> P1 --> S2 --> P2 --> S3 --> P3 --> S4 --> P4 P4 --> S5a --> P5 P4 --> S5b --> P6
flowchart TB
classDef trigger fill:#202020,stroke:#A8A8A8,color:#fff,stroke-width:2px
classDef source fill:#1a2332,stroke:#0078D4,color:#fff,stroke-width:2px
classDef mac fill:#1f1f1f,stroke:#A8A8A8,color:#fff,stroke-width:2px
classDef ai fill:#2a1f1a,stroke:#CC785C,color:#fff,stroke-width:2px
classDef api fill:#2a2f10,stroke:#E6FF3D,color:#fff,stroke-width:2px
classDef discord fill:#23272A,stroke:#5865F2,color:#fff,stroke-width:2px
subgraph T[" ⏰ TRIGGER "]
LaunchD["launchd
StartCalendarInterval"]:::trigger
Script["📜 scrim-report-cron.sh"]:::trigger
end
subgraph Src[" 🪟 WINDOWS PC "]
WLog[("📝 transcript_
YYYY-MM-DD.txt")]:::source
end
subgraph Mac[" 🍎 MAC MINI "]
SSHC["🔐 ssh / scp"]:::mac
Grep["✂️ grep
(時間範囲抽出)"]:::mac
CLI["💻 claude -p
(分析依頼)"]:::mac
KrCLI["💻 claude -p
(韓国語翻訳)"]:::mac
Curl["📤 curl POST
+ Bot Token"]:::mac
end
subgraph AI[" ☁️ ANTHROPIC "]
Claude["🤖 Claude Opus"]:::ai
end
subgraph Api[" 🔌 DISCORD API "]
EP["api/v10/channels/
{channel_id}/messages"]:::api
end
subgraph Discord[" 🎮 DISCORD "]
JaCh["💬 #ai-summary-jp"]:::discord
KrCh["💬 #ai-summary-kr"]:::discord
end
LaunchD ==>|12:00 JST 起動| Script
Script ==>|① SSH 接続| SSHC
SSHC <==>|SCP取得| WLog
Script ==>|② 抽出| Grep
Grep ==>|6,500行| CLI
CLI <==>|③ Messages API| Claude
CLI ==>|④ JA MD| Curl
Curl ==>|⑤ HTTP POST| EP
EP ==> JaCh
CLI ==>|⑥ MD 渡し| KrCLI
KrCLI <==>|⑦ 翻訳| Claude
KrCLI ==>|⑧ KR MD| Curl
Curl ==>|⑨ HTTP POST| EP
EP ==> KrCh
sequenceDiagram
autonumber
participant LD as ⏰ launchd
participant SH as 📜 cron.sh
participant WP as 🪟 Windows
participant FS as 💾 /tmp
participant CL as 💻 claude
participant CA as ☁️ Claude
participant DA as 🔌 Discord API
participant DC as 🎮 Discord
Note over LD: 12:00:00 JST
LD->>SH: 起動
SH->>WP: SSH PowerShell
WP-->>SH: 最新ファイル名
SH->>WP: SCP 取得
WP-->>FS: transcript_full.txt
SH->>FS: grep 18:00 - 翌06:00
FS-->>SH: transcript_target.txt
SH->>CL: claude -p "分析せよ"
CL->>CA: POST /v1/messages
CA-->>CL: Markdown レポート
CL-->>SH: report_*.md
SH->>SH: --- でセクション分割
loop 各セクション
SH->>DA: POST /channels/JA/messages
DA-->>SH: 200 OK
DA->>DC: メッセージ配信
end
SH->>CL: claude -p "韓国語に翻訳"
CL->>CA: POST /v1/messages
CA-->>CL: 韓国語版 MD
CL-->>SH: report_*_kr.md
loop 各セクション
SH->>DA: POST /channels/KR/messages
DA-->>SH: 200 OK
DA->>DC: メッセージ配信
end
flowchart TB classDef stage fill:#1a1a1a,stroke:#5865F2,color:#fff,stroke-width:2px classDef payload fill:#000,stroke:#E6FF3D,color:#E6FF3D,stroke-dasharray:5 3 S1["① launchd 起動 (12:00:00)"]:::stage P1["scrim-report-cron.sh 実行開始"]:::payload S2["② Windows → Mac mini 転送"]:::stage P2["📂 transcript_2026-06-12.txt
21,113 行 / 4.2 MB"]:::payload S3["③ 時間範囲抽出 (grep)"]:::stage P3["📄 transcript_target.txt
6,549 行 / 1.2 MB
(18:00 〜 翌 06:00)"]:::payload S4["④ Claude Opus に分析依頼"]:::stage P4["📄 report_2026-06-12_discord.md
179 行 / 12 KB"]:::payload S5["⑤ セクション分割 (---)"]:::stage P5["11 セクション
(各 1,800 文字以下)"]:::payload S6a["⑥a JA Discord 投稿"]:::stage S6b["⑥b 韓国語翻訳 (Claude)"]:::stage P6["💬 #ai-summary-jp
11 メッセージ配信
HTTP 200 × 11"]:::payload P7["📄 report_*_kr.md
9 セクション"]:::payload S7["⑦ KR Discord 投稿"]:::stage P8["💬 #ai-summary-kr
9 メッセージ配信
HTTP 200 × 9"]:::payload S1 --> P1 --> S2 --> P2 --> S3 --> P3 --> S4 --> P4 --> S5 --> P5 P5 --> S6a --> P6 P5 --> S6b --> P7 --> S7 --> P8
OpenAI gpt-4o-mini に対して、1発話ごとに送られる system プロンプト。 変数: {target_lang_name}("Japanese" or "Korean")/ {context_block}(直近10発言)
Anthropic Claude Opus に渡される、6,000行のログを読ませて Markdown レポートに変換する指示。
★ 「テーブル禁止」「ASCII art 禁止」などは過去の事故から逆算した安全装置。
毎日 6,000行 → 12KB / 11セクションの Markdown に圧縮される。
人間の操作: ゼロ
これを毎日 10分以内 に、選手・コーチ・関係者全員に届く形で生成。
1. コーチが練習を全部録画する
2. 翌日に2-3時間かけて見返してメモ
3. 各選手にコメントを書く
4. 全員にメッセージを送る
1. 練習は普段通り
2. 翌朝には全員が読める形で
Discordにレポートがある
コーチは「レポートのクオリティを上げる」「次の戦略を練る」など、
人間にしかできない仕事に時間を使えるようになる。
Discord BotとAIエージェントの応用領域を、4つのジャンルに分けて。
人間1人が3〜4時間/日かけていた業務を、
この金額で自動化できる計算。
この4つを正しく組み合わせるだけで、
人手の業務が自動化できる。
我々のBotは「練習ログから翌朝までに分析レポートを出す」を
完全無人で実現しています。
同じ仕組みは、あらゆる音声・テキスト業務に応用可能です。
Thank you · New Meta Inc.