通話と音声

通話と音声チャンネルは、オーディオ、動画、画面共有を独自のポート経由でサーバーに直接送信します。このページでは、ネットワーク側、インストール後に確認すべき設定、そして自分で実行する音声認識モデルによる文字起こしについて説明します。

通話の仕組み

通話はCallsアプリ(ID com.mattermost.calls)によって提供され、デフォルトでインストールおよび有効化されています。音声チャンネル(Voice Channelsアプリ、antimatter-nextイメージ)はCallsに基づいて構築された永続的な通話ルームです。Callsが有効である必要があり、同じ設定、ポート、サーバーを使用します。

CallsアプリはAntimatter内でメディアサーバーを実行します。Webアプリ、デスクトップアプリ、モバイルアプリはWebRTCでこれに接続します:

  • シグナリングは通常のWeb接続(HTTPSプロキシ)を介して行われます。
  • メディア(オーディオ、動画、画面共有)はそうではありません。通話ポート(デフォルトは8443 UDPおよびTCP)経由でサーバーに直接送信されます。

設定はシステムコンソール › プラグイン › Callsにあります。これらはすべて、antimatterサービス上のAM_CALLS_環境変数でも設定でき、その場合システムコンソールよりも優先され、設定が固定されます。従来のMM_CALLS_名も動作します。

インストール後にこれらを確認してください

  1. 通話ポートを開く。サーバーおよびクラウドプロバイダーのファイアウォールで8443/udpと8443/tcpを許可します。
  2. テストモードを確認します。 テストモード(DefaultEnabled)はデフォルトでオフに設定されており、すべてのユーザーが通話を開始できます。通話の動作を確認している間、システムコンソール › プラグイン › Calls で オン にすると、チャンネル内での通話開始はシステム管理者のみ可能になります。確認が完了したら、再度オフにしてください。変数は AM_CALLS_DEFAULT_ENABLED で、true はテストモードがオフであることを意味します。Mattermostから移行したサーバーでは、設定に保存された選択が保持されます。
  3. 動画の使用を決定します。 動画の有効化(EnableVideo、AM_CALLS_ENABLE_VIDEO)はデフォルトでオンです。通話の有効な場所(ダイレクトメッセージ、グループメッセージ、チャンネル)では、ユーザーはカメラをオンにできます。音声チャンネルでは、Voice Channels アプリの 音声チャンネルでの動画の許可 が決定します。これをオフにすると、音声チャンネルであっても誰もカメラをオンにできなくなります。
  4. NATの背後にある場合、パブリックアドレスを設定します(次のセクション)。

通話の有効な場所

すべてのコミュニティには ワークプレイス または コミュニティ という種類があります(新規コミュニティの種類を参照)。管理者が通話のオン/オフを切り替えていないチャンネルは、所属するコミュニティの種類に従います。

  • ワークプレイス では、チャンネルはサーバーのデフォルトに従います。テストモードがオフの間は、すべてのユーザーに対して通話がオンになります。
  • コミュニティ では、チャンネルでの通話はオフです。代わりに、ユーザーは音声チャンネルで会話します。チャンネル管理者とコミュニティ管理者は、チャンネル内で通話をオンにすることができます。

チャンネル独自の設定が常に優先されます。ダイレクトメッセージとグループメッセージはコミュニティに属さないため、テストモードがオフの間はすべてのユーザーに対して通話がオンになります。コミュニティの種類の変更は、通話に対して30秒以内に反映されます。

ポート、NATとSTUN

設定項目変数デフォルト値
RTC Server Port (UDP)AM_CALLS_UDP_SERVER_PORT8443
RTC Server Port (TCP)AM_CALLS_TCP_SERVER_PORT8443
RTC Server Address (UDP)、(TCP)AM_CALLS_UDP_SERVER_ADDRESS, AM_CALLS_TCP_SERVER_ADDRESS空:すべてのアドレス
ICE ホストオーバーライドAM_CALLS_ICE_HOST_OVERRIDE空欄: STUN によって検出されます
ICE ホストポートオーバーライドAM_CALLS_ICE_HOST_PORT_OVERRIDE空欄: サーバーポート
ICE サーバー設定AM_CALLS_ICE_SERVERS_CONFIGS[{"urls":["stun:stun.cloudflare.com:3478"]}]
(実験的) IPv6 サポートを有効にする(システムコンソール)オフ

ポートは 80 から 49151 の範囲で指定してください。サイトの compose ファイルでは、.env の CALLS_PORT を変更します。これにより両方の変数が設定され、ホストとコンテナ内で同じ番号のポートが公開されます。クライアントはまず UDP を試み、同じポートで TCP にフォールバックします。

クライアントがメディアを送信するアドレス

サーバーは各クライアントに、メディアを送信するアドレス(「ホスト候補」)を通知します。デフォルトでは、STUN サーバー(リクエストの送信元であるアドレスとポートに応答する公開サービス)に問い合わせることで、パブリックアドレスを検出します。デフォルトの STUN サーバーは Cloudflare の公開 STUN サーバー stun:stun.cloudflare.com:3478 です。使用するのはサーバーだけではありません。通話に参加するすべてのクライアントも、自分自身のパブリックアドレスを取得するためにこれに問い合わせます。STUN サーバーが確認するのは IP アドレスとポートのみであり、通話の音声、動画、メッセージは確認されません。

例えば Mattermost から移行した後に ICE サーバー設定 に Mattermost の STUN サーバー (stun.global.calls.mattermost.com) が保存されているサーバーは、代わりに Cloudflare のものを使用します。保存された設定は変更されません。

次の場合は、アドレスを自分で設定してください:

  • サーバーが NAT の背後にある場合、または複数のパブリックアドレスを持っている場合:ICE ホストオーバーライド にパブリック IP アドレス(またはそれへ解決されるホスト名)を設定します;
  • NAT が 8443 に異なるパブリックポートをマッピングしている場合:ICE ホストポートオーバーライド もそのパブリックポートに設定します;
  • サーバーがインターネットにアクセスできない場合、またはサーバーとクライアントが外部の STUN サーバーに連絡したくない場合:ICE ホストオーバーライド を設定し、AM_CALLS_ICE_SERVERS_CONFIGS=[] で STUN リストを空にします。ICE ホストオーバーライド が設定されると、サーバーは STUN サーバーにアドレスを問い合わせなくなります。空のリストはクライアントが STUN サーバーに問い合わせるのを防ぎます。
services:
  antimatter:
    environment:
      AM_CALLS_ICE_HOST_OVERRIDE: 203.0.113.10
      AM_CALLS_ICE_SERVERS_CONFIGS: "[]"

サードパーティを使わずに STUN を維持するには、独自の STUN サーバー(coturn のような TURN サーバーも STUN リクエストに応答します)を稼働させ、ICE サーバー設定 に TURN の例のようにリストアップしてください。

ローカルネットワークのみを使用する場合は、サーバーの LAN アドレスを使用してください。ポート、アドレス、または ICE 設定を変更した後は、サーバーを再起動するか、Calls アプリを無効にしてから再度有効にしてください。メディアサーバーはアプリが起動したときにセットアップされます。

厳格なファイアウォール向けの TURN

一部のネットワークでは、UDP と非標準 TCP ポートへの送信接続の両方がブロックされます。これらのネットワーク上のユーザーには、到達可能なポート(多くの場合 443)経由でメディアを中継する TURN サーバーが必要です。Antimatter には TURN サーバーは含まれていません。coturn のような TURN サーバーを構築し、ICE Servers Configurations(JSON リスト)に追加してください。

[
  {"urls": ["stun:turn.example.com:3478"]},
  {"urls": ["turn:turn.example.com:3478?transport=udp", "turns:turn.example.com:443?transport=tcp"]}
]
  • 共有シークレット(coturn の use-auth-secret)を使用する場合、同じシークレットを TURN Static Auth Secret(AM_CALLS_TURN_STATIC_AUTH_SECRET)に設定します。サーバーは各クライアントに、TURN Credentials Expiration (minutes)(デフォルトは 240)の間有効な短期間の認証情報を発行します。
  • 固定認証情報を使用する場合、TURN エントリに "username" と "credential" を追加します。
  • Server Side TURN(デフォルトでは無効)は、サーバーが開始する接続にも TURN サーバーを使用します。

その他の通話設定

設定項目変数デフォルト値機能
Max call participantsAM_CALLS_MAX_CALL_PARTICIPANTS0(制限なし)1 つの通話に参加できる最大人数。
Allow screen sharing(システムコンソール)on参加者に画面共有を許可します。
Enable call ringingAM_CALLS_ENABLE_RINGINGonダイレクトメッセージまたはグループメッセージで通話を開始した際、相手方に通知音を鳴らします。
Enable simulcast for screen sharing (Experimental)(システムコンソール)オフ画面共有を複数の品質で送信します。
Enable AV1 codec for screen sharing (Experimental)(システムコンソール)オフsimulcast が有効な間は無視されます。

Voice Channels アプリには、システムコンソール › プラグイン › Voice Channels に 2 つの設定があります。音声チャンネルを開いたときに参加する(デフォルトでオン)と 音声チャンネルでの動画使用を許可する(デフォルトでオンですが、上記の動画をご参照ください)。コミュニティ管理者は、チャンネルの設定でチャンネルを音声チャンネルに切り替えます。

通話を完全に無効にするには、システムコンソール › プラグイン › プラグイン管理 で Calls アプリを無効にするか、AM_CALLS_DISABLE=true を設定します。これにより、音声チャンネルも動作しなくなります。

大規模サーバー:外部 rtcd

デフォルトでは、1つのAntimatterサーバーがすべての通話メディアを処理します。多数の同時通話がある場合、またはチャットサーバーからメディアを分離したい場合は、Callsアプリがメディアをrtcd(Mattermostのオープンソースrtcd、バージョン0.17以降)という独立したメディアサーバーに引き渡すことができます。RTCD service URL(AM_CALLS_RTCD_SERVICE_URL)を設定します。例えばhttps://rtcd.example.comのように設定すると、すべての通話がこれを経由するようになり、クライアントはAntimatterのポートではなくrtcd自身のポートにメディアを送信します。認証情報はAM_CALLS_RTCD_CLIENT_IDとAM_CALLS_RTCD_AUTH_KEYで指定できます。指定しない場合、アプリはrtcdに自身を登録します。ライセンスは不要です。Callsアプリは、サーバーで同時に50人以上が通話に参加していることが多い場合、管理者にrtcdの使用を推奨する警告を表示します。

文字起こしとライブ字幕

Antimatterは、自分で実行する音声認識モデルを使用して通話を文字起こしし、発言者の発言中にライブ字幕を表示できます。Antimatterは、Whisperサーバーなど、OpenAI互換の/v1/audio/transcriptionsエンドポイントを提供するサーバーであれば何でも使用できます。Antimatterからの追加サービスは不要です。

仕組み

  • 通話のホストは、通話コントロールの 通話を文字起こし を使用して文字起こしを開始します。文字起こし中 のバッジが表示され、全員に通知されます。
  • 各参加者のアプリは、自分のマイクを聞き取り、発話を短い区切り(ミュート中は除外し、最大12秒)に分割してAntimatterに送信します。Antimatterはこれらを音声認識サーバーへ転送します。
  • ライブ字幕がオンになっている場合、各区切りのテキストは、参加者に対してすぐに字幕として表示されます。
  • 文字起こしが停止したり通話が終わったりすると、Callsボットは文字起こし結果をテキストファイルとWebVTT字幕ファイルとして、通話のスレッドに投稿します(音声チャンネルの場合は、チャンネルに投稿します)。
  • Summarize transcriptionsがオンになっている場合、Agentsアプリのデフォルトのエージェントもスレッドにサマリーを投稿します(AIを参照)。
A call's thread: the Calls bot has posted the transcript as a text file, and an AI agent has posted a summary below it.
通話終了後、通話のスレッド内の文字起こし結果とそのサマリー。

セットアップ

antimatterサービスで以下を設定します:

services:
  antimatter:
    environment:
      AM_CALLS_ENABLE_TRANSCRIPTIONS: "true"
      AM_CALLS_TRANSCRIBE_API: openai
      AM_CALLS_TRANSCRIBE_API_OPEN_AIURL: http://stt.internal:8000/v1
      AM_CALLS_TRANSCRIBE_API_OPEN_AI_MODEL: whisper-1
      AM_CALLS_TRANSCRIBE_API_OPEN_AI_KEY: ""
      AM_CALLS_ENABLE_LIVE_CAPTIONS: "true"
      AM_CALLS_LIVE_CAPTIONS_LANGUAGE: en
設定項目変数入力内容
Enable call transcriptions (Beta)AM_CALLS_ENABLE_TRANSCRIPTIONStrue
Call transcriber APIAM_CALLS_TRANSCRIBE_APIopenai(「OpenAI-compatible API (no job service)」として表示されます)
Speech-to-text API URLAM_CALLS_TRANSCRIBE_API_OPEN_AIURLAPIのベースURL(/v1までを含む)。
Speech-to-text modelAM_CALLS_TRANSCRIBE_API_OPEN_AI_MODELAPIが認識するモデル名。例えばwhisper-1など。必須です。
Speech-to-text API keyAM_CALLS_TRANSCRIBE_API_OPEN_AI_KEYベアラートークンとして送信されます。APIがキーを必要としない場合は空欄にしてください。
ライブ字幕を有効化(ベータ版)AM_CALLS_ENABLE_LIVE_CAPTIONS通話中の字幕を有効にするには true を設定します。
ライブ字幕の言語AM_CALLS_LIVE_CAPTIONS_LANGUAGE話されている言語を2文字のコードで指定します(デフォルトは en)。文字起こしAPIにも送信されるため、字幕を使わない場合でも設定してください。
文字起こしの要約AM_CALLS_SUMMARIZE_TRANSCRIPTIONS通話後にAIによる要約を生成するには true を設定します。
システムコンソールでは、文字起こしの設定は 通話録画を有効化 がオンになっている場合にのみ表示されますが、この種の文字起こしには録画は必要ありません。上記の変数で設定することで、この問題を回避できます。openai 文字起こしツールと録画を同時にオンにしないでください。録画を開始すると、job-serviceの文字起こしツールが起動しようとして失敗します。

文字起こしがオンになっている間、発言したすべての人の音声は設定した音声認識サーバーに送信され、文字起こし結果はチャンネル内の全員が読める場所に投稿されます。ユーザーに周知し、機密性の高い通話の場合は、そのサーバーを自社ネットワーク内に保持してください。

録画

通話の録画(組み込みの whisper.cpp または Azure の文字起こし機能による文字起こしを含む)は、ジョブサービスとして Mattermost のオープンソース製 calls-offloader によって起動される独立したコンテナ内で実行されます。このサービスは Antimatter と並べてご自身でデプロイする必要があります。関連する設定は、通話の録画を有効にする(AM_CALLS_ENABLE_RECORDINGS、デフォルトでは無効)、ジョブサービスの URL(AM_CALLS_JOB_SERVICE_URL)、通話録画の最大時間(デフォルトは 60 分、範囲は 15〜180 分)、通話録画の品質(低・中・高、デフォルトは中)です。ライセンスは不要です。録画を有効にすると、通話のホストは通話コントロールの 通話を録画 を使用して録画を開始・停止できます。通話に参加している全員に録画中であることが表示され、録画が停止されると、その通話のスレッドに録画が投稿されます。音声チャンネルでの通話にはスレッドがないため、録画はできません。文字起こしやライブ字幕のみを使用する場合は、上記の音声認識設定の方がシンプルです。ジョブサービスは不要です。