通话与语音

通话和语音频道会将音频、视频和屏幕共享直接发送到服务器的独立端口。本页介绍网络配置、安装后需检查的设置,以及使用自行运行的语音转文本模型进行转录的方法。

通话的工作原理

通话由 通话 应用(id com.mattermost.calls)提供,该应用默认已安装并启用。语音频道(语音频道 应用,antimatter-next 镜像)是基于通话构建的永久通话房间:它们需要启用通话,并使用相同的设置、端口和服务器。

通话应用会在 Antimatter 内部运行一个媒体服务器。Web 应用、桌面应用和移动应用通过 WebRTC 连接到它:

  • 信令通过常规 Web 连接(您的 HTTPS 代理)传输;
  • 媒体(音频、视频、屏幕共享)则不经过代理:它直接通过通话端口发送到服务器,默认为 8443 UDP 和 TCP。

设置位于 系统控制台 › 插件 › 通话。这些设置也可以通过 antimatter 服务上的 AM_CALLS_ 环境变量进行设置,此时环境变量优先于系统控制台,并锁定该设置。旧版的 MM_CALLS_ 名称也有效。

安装后请检查这些设置

  1. 开放通话端口。 在服务器和云提供商的防火墙中允许 8443/udp 和 8443/tcp。
  2. 检查测试模式。测试模式(DefaultEnabled)默认处于关闭状态,因此所有人都可以发起通话。在系统控制台 › 插件 › 通话中将其设为开启,以便在检查通话功能是否正常时,仅允许系统管理员在频道中发起通话,检查完成后请再次将其关闭。该变量为 AM_CALLS_DEFAULT_ENABLED:true 表示测试模式已关闭。从 Mattermost 迁移过来的服务器会保留其配置中保存的设置。
  3. 决定视频设置。启用视频(EnableVideo,AM_CALLS_ENABLE_VIDEO)默认处于开启状态:在允许通话的地方(私信、群组消息和频道中),用户都可以开启摄像头。在语音频道中,由语音频道应用的允许在语音频道中使用视频设置决定。如果关闭此设置,则任何人都无法开启摄像头,即使在语音频道中也是如此。
  4. 在 NAT 后面,设置公共地址(下一节)。

通话开启的位置

每个社区都有类型,工作场所或社区(参见新社区的类型)。如果频道管理员未明确开启或关闭通话,则频道将遵循其所属社区的类型:

  • 在工作场所中,频道遵循服务器默认设置:当测试模式关闭时,所有人都可以发起通话;
  • 在社区中,频道内的通话默认关闭:人们改为在语音频道中交流。频道和社区管理员仍可以在特定频道中开启通话。

频道自身的设置始终优先。私信和群组消息不属于任何社区:当测试模式关闭时,其中的通话对所有人开放。社区类型的变更将在 30 秒内应用于通话设置。

端口、NAT 和 STUN

设置项变量默认值
RTC 服务器端口 (UDP)AM_CALLS_UDP_SERVER_PORT8443
RTC 服务器端口 (TCP)AM_CALLS_TCP_SERVER_PORT8443
RTC 服务器地址 (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 服务器询问其地址;空列表则阻止客户端进行询问。
services:
  antimatter:
    environment:
      AM_CALLS_ICE_HOST_OVERRIDE: 203.0.113.10
      AM_CALLS_ICE_SERVERS_CONFIGS: "[]"

若要保留 STUN 但不使用第三方服务,请运行您自己的 STUN 服务器(如 coturn 这样的 TURN 服务器也能响应 STUN 请求),并在 ICE 服务器配置 中列出它,如下方的 TURN 示例所示。

仅在本地网络上使用时,请使用服务器的局域网地址。更改端口、地址或 ICE 设置后,请重启服务器,或禁用再启用 Calls 应用:媒体服务器在应用启动时进行配置。

用于严格防火墙的 TURN

有些网络会同时阻止 UDP 和发往非标准 TCP 端口的出站连接。使用这些网络的用户需要 TURN 服务器,该服务器会通过他们可访问的端口(通常是 443)中继媒体流。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(无限制)单次通话中允许的最大人数。
Allow screen sharing(系统控制台)开启允许参与者共享屏幕。
Enable call ringingAM_CALLS_ENABLE_RINGING开启当在私信或群组消息中发起通话时,会向其他参与者发送铃声。
Enable simulcast for screen sharing (Experimental)(系统控制台)关闭以多种质量发送屏幕共享流。
Enable AV1 codec for screen sharing (Experimental)(系统控制台)关闭在启用 simulcast 时,此设置将被忽略。

语音频道应用有两个设置,位于 系统控制台 › 插件 › Voice Channels 中:Join when opening a voice channel(默认开启)和 Allow video in voice channels(默认开启,但请参阅上文关于视频的说明)。社区管理员可以在频道设置中将频道转换为语音频道。

若要完全关闭通话功能,请在 系统控制台 › 插件 › 插件管理 中禁用 Calls 应用,或设置 AM_CALLS_DISABLE=true。此时语音频道也将停止工作。

大型服务器:外部 rtcd

默认情况下,一个 Antimatter 服务器承载所有通话媒体。对于大量同时进行的通话,或者为了将媒体流量与聊天服务器隔离,Calls 应用可以将媒体交给 rtcd,这是一个独立的媒体服务器(Mattermost 的开源 rtcd,版本 0.17 或更高)。设置 RTCD service URL(AM_CALLS_RTCD_SERVICE_URL),例如 https://rtcd.example.com:之后所有通话都会通过它进行,客户端会将媒体发送到 rtcd 自己的端口,而不是 Antimatter 的端口。可以使用 AM_CALLS_RTCD_CLIENT_ID 和 AM_CALLS_RTCD_AUTH_KEY 提供凭据;如果不提供,应用会自行向 rtcd 注册。无需许可证。当服务器经常有超过 50 人同时通话时,Calls 应用会向管理员显示一条建议使用 rtcd 的警告。

转录与实时字幕

Antimatter 可以使用您自行运行的语音转文本模型对通话进行转录,并在人们说话时显示实时字幕。Antimatter 可以使用任何提供 OpenAI 兼容 /v1/audio/transcriptions 端点的服务器,例如您网络上的 Whisper 服务器。无需 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作为 bearer token 发送。如果 API 不需要密钥,请留空。
Enable live captions (Beta)AM_CALLS_ENABLE_LIVE_CAPTIONS通话期间显示实时字幕时设为 true。
实时字幕语言AM_CALLS_LIVE_CAPTIONS_LANGUAGE口语语言,使用两位字母代码表示(默认为 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 分钟)以及通话录制质量(低、中或高;默认为中)。此功能无需许可证。启用录制后,通话主持人可通过通话控制中的录制通话选项开始和停止录制;通话中的所有人都会看到正在录制的提示,录制停止后,录像将发布到该通话的话题中。语音频道中的通话没有话题,因此无法录制。如果仅需转录和字幕,上述语音转文本设置更为简单:它不需要作业服务。