OpenClawのAIエージェントだけでDiscordリアルタイム音声チャットBotを作った話
開発環境
開発のやり取りは、すべてDiscordのテキストチャンネルで行った。
OpenClawのAIエージェントがDiscordに常駐していて、そこにメッセージを送ると、エージェントがファイルを読み書きし、コマンドを実行し、コードを書く。IDEもターミナルも開いていない。Discordでチャットしているだけ。
つまり「Voice Botを作る」という開発作業自体が、AIとのチャットで完結した。
やったこと
Discordのボイスチャンネルで、人間と自然に会話できるBotを作った。
- 人間が話す → 文字起こし → LLMが返答生成 → 音声合成 → Botが喋る
リアルタイム双方向の音声チャット。割り込みもできる。会話の記憶も保持される。
そして、このBotの設計・実装・デバッグ・デプロイは、すべてAIエージェントがやった。
人間がやったこと
指示を出しただけ。
- 「Discordのボイスチャットで会話できるBot作りたい」
- 「発話の頭が欠けてる、直して」
- 「割り込みが効くようにして」
- 「OpenClaw経由にして」
- 「返答がチャットっぽい、もっと話し言葉で」
- 「速度上げて」
コードは1行も書いていない。方向性を示して、動作を確認して、フィードバックを返す。それだけ。
AIエージェントがやったこと
全部。
- 構成の設計(STT/LLM/TTSの選定と接続方法)
- Node.jsでの実装(Discord.js、Deepgram、VOICEVOX連携)
- 発話の頭欠け対策(プリロール機構の設計・実装)
- 割り込み検出(barge-in対応)
- OpenClaw Gateway統合(エージェントルーティング、セッション維持)
- システムプロンプトの調整(音声向けの文体チューニング)
- TTS速度パラメータの追加
- systemdでの常駐化
- ドキュメント作成
問題が起きたら原因を調査し、修正案を出し、実装し、テストする。このループを人間の指示なしで回せる。
なぜOpenClawを使ったか
Voice BotのLLM部分をOpenClaw Gateway経由にしたことで、いくつかの利点があった。
1. Botの実装が薄くなる
OpenClaw Gatewayは /v1/chat/completions をOpenAI互換で提供する。Bot側はOpenAI SDKの baseURL を差し替えるだけ。
const openai = new OpenAI({
apiKey: gatewayToken,
baseURL: 'http://127.0.0.1:18789/v1'
});
Bot自体は「音声の入出力」に専念できる。LLMの選定、プロンプト設計、会話の記憶管理はOpenClaw側に任せる。
2. 会話の記憶をOpenClawに寄せられる
OpenClaw Gatewayは user パラメータからセッションを導出してくれる。
await openai.chat.completions.create({
model: 'agent:vc-agent',
user: `discord:${userId}`,
messages: [systemPrompt, { role: 'user', content: userMessage }]
});
Bot側で会話履歴を管理する必要がない。同じユーザーなら、前回の会話を覚えている。
3. エージェント単位でモデルを切り替えられる
model: "agent:vc-agent" のように指定すると、OpenClaw側で定義したエージェントにルーティングされる。
エージェントごとにモデル(Claude、GPT、Geminiなど)を設定できるので、Bot側のコードを変えずにモデルを切り替えられる。
4. テキストチャットと音声チャットで同じエージェントを共有できる
OpenClawエージェントは、Discordのテキストチャンネルでも使える。音声Botと同じエージェントを指定すれば、テキストで話した内容を音声側でも覚えている(逆も同様)。
「さっきテキストで送った件だけど」が通じる。
開発スタイルとしての気づき
AIエージェントによる開発は「プログラミングができなくても作れる」という話ではない。
「何を作りたいか」と「これで良いか」の判断に人間が集中し、実装はAIに任せるという分業。
今回の開発で人間がやったのは:
- ゴールの設定(「ボイスチャットで会話したい」)
- 品質の判断(「頭が欠けてる」「これくらいの速度でいい」)
- 方針の決定(「OpenClawに寄せよう」「細かい制限は要らない」)
実装の詳細(どのAPIを叩くか、どうバッファリングするか、どこでエラーハンドリングするか)はAIエージェントが判断した。
結果として、リアルタイム音声処理という割と難しい領域のシステムが、数日の対話で動くところまで行った。
構成(参考)
最終的な構成はこうなった。
- 音声入力: Discord VC → @discordjs/voice
- STT: Deepgram Streaming API
- LLM: OpenClaw Gateway → Claude Sonnet 4.5(エージェント経由)
- TTS: VOICEVOX(ローカル)
- 実行環境: EC2 (Ubuntu) + systemd user service
まとめ
- Discordでリアルタイム双方向音声チャットBotを作った
- 設計から実装まで、すべてAIエージェントが担当した
- OpenClawを使うことで、Bot実装を薄くし、記憶やモデル管理をGateway側に寄せられた
- 人間は「何を作りたいか」「これで良いか」に集中する開発スタイルが成立した
Discussion