OpenClawでDiscordボイスのユーザーを追いかける
選んだ人を追う常駐、3つの参加モード、STT-TTSパイプライン、agent-proxyのセッションとターゲット、音声によるライブ実行制御、エコーの多い部屋向けのバージイン調整
個人用やオペレーター用の構成では、ボットがいつもあなたのいる場所にいる、というのが音声の自然な振る舞いです。OpenClawのフォローモードでは、Discordのボイスボットが選んだユーザーを追跡し、ボイスチャンネル間の移動についていきます。フォロー中のユーザーが許可されたチャンネルに参加すれば参加し、移動すれば移動し、切断すれば退出します。ここでは、その設定とルール、ほかの参加モードとの比較、音声パイプライン、ボイスセッションとエージェントのセッションおよびターゲットの対応関係、委任された実行が話しかけられたときに何を理解するか、そして自分の再生音を拾ってしまう部屋向けの調整を紹介します。
フォローのルール
- フォロー対象ユーザーのリストは、生のDiscordユーザーIDとプレフィックス付きのIDのどちらも受け付け、両方を正規化します。有効化フラグはリストが設定されているとデフォルトでオンになり、オフにすれば自動フォローなしでリストだけを残せます。また、このリストが制御するのはボイスへの常駐だけで、話者としてのアクセス権もオーナー権限も与えません。それらはコマンドのオーナー設定と、ギルド(サーバー)やチャンネルのユーザーとロールから決まります。
- 1つのギルドに複数のフォロー中ユーザーがいて、アクティブなユーザーが抜けた場合、ボットはギルドを離れる前に、別の追跡対象ユーザーのチャンネルへ移動します。複数のユーザーが同時に移動したときは、最新のボイスステートイベントが優先されます。許可チャンネルのリストは引き続き適用されるため、許可されていないチャンネルにいるフォロー中ユーザーは無視され、セッションは別のユーザーへ移るか退出します。
- 取りこぼしたボイスステートイベントは、起動時と、上限の決まった一定間隔で再照合されます。その際は設定済みのギルドをサンプリングし、1回あたりのRESTルックアップ数に上限を設けるため、非常に大きなリストでは収束までに複数の間隔がかかることがあります。Discordや管理者によって移動させられたボットは、移動先が許可されていればセッションを再構築し、フォローの所有権を維持します。同じチャンネルから退出して再参加する暗号化の復旧処理でも、所有権は維持されます。
- 参加モードは3つあります。あなたがボイスにいるときはボットもいるべき個人用やオペレーター用の構成にはフォロー、人間がいる間だけボットがいるべき固定の部屋には「在室時のみ」フラグを付けた自動参加、そして自動で現れると驚かれるような一度きりの部屋には手動の参加コマンドです。
followUsersが制御するのはボイスへの常駐だけです。話者としてのアクセス権やオーナー権限は与えないため、commands.ownerAllowFromと、ギルドやチャンネルのユーザーとロールは別途設定してください。
パイプラインとセッション
音声の受信は同梱のWebAssembly版Opusコーデックでデコードし、リアルタイム再生は同じパッケージで48キロヘルツのステレオ生PCMをOpusにエンコードします。ファイルやプロバイダーのストリームを再生する場合は、まずffmpegでトランスコードします。STT-TTSパイプラインでは、キャプチャしたPCMはWAVの一時ファイルになり、文字起こしはメディアの音声設定が担当します。バッチキャプチャは適用される音声入力制限のうち最大のものに従い、サイズを超えたキャプチャは、部分的な音声を文字起こしするのではなく、警告を出して停止します。文字起こし結果はDiscordの受信処理とルーティングを通り、その間、応答モデルは、エージェントのTTSツールを隠してテキストを求める音声出力ポリシーの下で動作します。ボイス用のモデルが上書きするのはこの応答モデルだけで、ボイスのTTSブロックはグローバルのTTSブロックの上にマージされ、ストリーミング対応のプロバイダーはプレイヤーに直接音声を送ります。エージェントセッションのブロックがない場合、各ボイスチャンネルには専用のルーティングされたセッションが割り当てられ、リアルタイムモデルはフロントエンドにすぎず、実質的なリクエストは設定済みのエージェントに送られます。相談ツールを使わずに最終的な文字起こしが生成された場合は、フォールバックとして相談が強制されます。ターゲットにチャンネルIDの形式または素のIDを指定すると、音声はそのテキストチャンネルのセッションを経由してルーティングされ、DMやユーザーの形式を指定すると、そのダイレクトメッセージのセッションを経由します。どちらの場合も、スーパーバイザーエージェントはメッセージツールを自由に使え、それが適切な場合は別途Discordメッセージを送ることもできます。
実行制御とエコー
- 委任された実行が進行中の間、コマンドの権限を持つ人の音声の文字起こしは、次のターンを始める前に、ライブの実行制御として扱われます。「状況は?」「それはキャンセルして」「小さいほうの修正でいいよ」「終わったらテストも確認して」といったフレーズは、ステータス確認、キャンセル、軌道修正、フォローアップのいずれかに分類され、その結果が読み上げで返されるので、話し手は処理されたかどうかがわかります。キャンセルされた相談は失敗ではなくキャンセルとして記録され、遅れて届いたプロバイダーのツール呼び出しにも同じく最終的なキャンセルが適用され、セッションは次のリクエストに使える状態のまま残ります。
- 開いたマイク越しに自分の再生音を聞いてしまうモデル向けに、エコーの多い環境の設定例では、プロバイダーが生の入力音声で自動的に割り込まないようにしつつ、バージインによって、Discordの発話開始イベントとアクティブな話者の音声で応答をキャンセルできるようにしています。さらに、音声終了の最小しきい値(例では500ミリ秒)によって、非常に早いシグナルはエコーの可能性が高いものとして扱われるため、モデルが再生の最初のフレームで遮られることはありません。
- ドキュメントには、出力されるはずのログ行が列挙されています。ボイス、スーパーバイザー、セッションモード、モデルを伴う参加、自動応答・割り込み・バージインの各フラグを伴うリアルタイムブリッジの起動、バイト数を伴う話者ターンの開始と終了、理由を伴う古い発話のスキップ、再生の完了・バッファリング・停止、相談の要求と回答、プレイヤーがアイドル状態のときの、そのまま読み上げる発話のキューへの追加と取り出し、バージインの検出と要求、そしてモデルの割り込みの要求・切り詰め・確定、またはエコーとしての無視です。
これらのモードが属する音声機能の全体像はDiscordのボイスチャンネルでのOpenClawの記事で、チャネルとしてのDiscordと必要なインテントはDiscordでのOpenClawの記事で解説しています。
操作手段としての音声
フォローモードの面白さは、ついてくること自体ではなく、それによって可能になることにあります。あなたがいるときには部屋にいて、実行の途中でも話しかけるだけで軌道修正、キャンセル、問い合わせができ、答えが同じチャンネルに返ってくるエージェントです。音声による実行制御フレーズのテキスト版は実行中のOpenClawの軌道修正の記事で、ターゲットの形式によって選ばれるルーティング済みセッションについてはOpenClawのセッションの記事で説明しています。
Dialiでは
Dialiでは、フォローモードはDiscordボイスのほかの部分と同じく、自分で設定して運用するボイスのブロックの一部です。一方、Discordボットそのものはダッシュボードから接続します。ボイスを有効にすれば、常駐のルールはそのまま適用されます。アシスタントについてはDialiのマネージドOpenClawホスティングのページを、それを囲む境界についてはDialiのセキュリティのページをご覧ください。
- フォロー、自動参加、手動参加:部屋に入る3つの方法。
- 常駐は何の権限も与えません。決めるのは引き続きオーナーとロールです。
- ステータス確認、キャンセル、軌道修正、フォローアップ、すべて音声で。
読むだけでなく、作ってみましょう
エージェントを設定してチャネルを選べば、いつも開いているアプリの中でエージェントが働き始めます。
