Discourse VoiceとLiveKitの統合

このガイドでは、Discourse の Voice プラグインを LiveKit メディアサーバーに接続する方法を説明します。デフォルトでは、音声通話はピアツーピアで実行されます。つまり、各参加者は自分の音声を他のすべての参加者に直接送信します。これは小規模なルームでは問題ありませんが、ルームの規模が拡大すると帯域幅の消費量も増加します。LiveKit を経由して通話をルーティングすることで、参加人数に関係なく、各参加者のアップロード帯域幅を一定に保つことができます。

前提条件

開始前に、以下の条件を満たしていることを確認してください。

  • Voice プラグインが有効化された状態で動作している Discourse サイト
  • 到達可能な LiveKit サーバーと、その API 認証情報。LiveKit をセルフホストするか、LiveKit Cloud のようなマネージドサービスを利用できます。
  • Discourse サイトの管理者アクセス権限

ステップ 1 — Voice プラグインの有効化

Voice は Discourse にバンドルされています。管理画面 → 設定 → プラグイン に移動し、Voice (voice_enabled) の設定をオンにしてください。

ステップ 2 — LiveKit サーバーのプロビジョニングと認証情報の記録

LiveKit デプロイメントから以下の3つが必要です:WebSocket URLAPI キーAPI シークレット

LiveKit Cloud を使用する場合、これらの手順は比較的簡単です。

  1. LiveKit Cloud ダッシュボードでプロジェクトを作成します。
  2. プロジェクトの 設定 → キー ページから、API キーAPI シークレット を表示します。
  3. WebSocket URL を記録します(例: wss://my-project.livekit.cloud)。

セルフホストされた LiveKit インストールの場合、それぞれのドキュメントを参照してください。

ステップ 3 — Discourse での LiveKit 接続の設定

管理画面 → プラグイン → Voice に移動し、設定を開いて LiveKit セクションに以下の情報を記入します。

設定項目 入力内容
voice_livekit_url WebSocket URL。例: wss://livekit.example.com(プレーン HTTP 環境では ws:// を使用)。
voice_livekit_api_key ステップ 2 で取得した API キー。
voice_livekit_api_secret ステップ 2 で取得した API シークレット。
voice_livekit_room_policy LiveKit を使用するルームの指定方法。

voice_livekit_room_policy 設定は、ルームがどのトランスポートを選択するかを決定します。

ポリシー 動作
disabled すべての通話がピアツーピアで実行されます(デフォルト)。
per_room ルームの作成者/管理者が、ルームフォーム内の メディアサーバー (SFU) を使用する チェックボックスを個別にオンにしてルームを有効にします。
all_rooms すべてのルームが LiveKit を経由してルーティングされます。

ステップ 5 — オプションの追加設定

これらの設定は統合を微調整するために使用します。

設定項目 目的
voice_livekit_room_prefix LiveKit 上のルーム名のネームスペースプレフィックス。複数のサイトが 1 つの LiveKit サーバーを共有している場合、サイトごとに一意のプレフィックスを設定してください。空の場合は、サイトのデータベース名がデフォルトとして使用されます。
voice_livekit_mesh_fallback LiveKit トークンの発行ができず、ルームが空の場合、参加の失敗ではなくピアツーピアメッシュで開始します。デフォルトではオフです — 静かな劣化は LiveKit の障害を隠す可能性があります。
voice_livekit_recording_enabled LiveKit で実行される通話の録音をルームモデレーターに許可します。録音は LiveKit Egress によって生成され、LiveKit デプロイメントのストレージ(S3、GCS、ローカルディスクなど)に保存されます。Discourse にアップロードされることはありません。
voice_livekit_recording_filepath LiveKit Egress に渡されるファイルパス。例: voice/{room_name}-{utc}{room_name}{room_id}{time}{utc} などのプレースホルダーをサポートします。ファイル拡張子は自動的に追加されます。

ステップ 6 — オプション: LiveKit ウェブフックの有効化

ウェブフックは、調整(リコンサイル)専用のバックストップです。参加者の接続が突然切断された場合やルームが終了した場合、ウェブフックにより、プラグインはハートビート TTL の経過を待たずに数秒以内にプレゼンスとルーム状態をクリーンアップできます。これらはオプションです — 配信できない場合でも通話は機能しますが、クリーンアップに少し時間がかかるようになります。

LiveKit サーバーで、ウェブフックエンドポイントを追加します(プラグインは、最初のウェブフックが到着するまで、その正確なスニペットを管理ダッシュボードに表示します):

# livekit.yaml
webhook:
  api_key: <your-api-key>
  urls:
    - https://forum.example.com/voice/livekit/webhook

LiveKit を再起動します。配信は API シークレットで認証されるため、追加の共有シークレットを設定する必要はありません。

ステップ 7 — 統合の検証

Discourse Voice 管理ダッシュボードの確認

管理画面 → プラグイン → Voice → ダッシュボード に移動します。LiveKit の設定が 1 つでも存在すると、ダッシュボードにはライブチェック付きの LiveKit メディアサーバー ステータスカードが表示されます。

  • 設定ステータス(どの設定が存在し、どのポリシーが有効か)
  • キーペアでアクセストークンを署名できるかどうか
  • サーバーに到達可能かどうか、およびアクティブなルームの数
  • 最後の自動接続チェック
  • ウェブフックが受信されているかどうか

更新 を使用して、オンデマンドでプローブを実行できます。

LiveKit が有効化された Voice プラグインのダッシュボードのスクリーンショットは以下の通りです:

LiveKit ダッシュボードの確認

LiveKit ダッシュボードにも通話の詳細が表示されます。例:

「いいね!」 3