通话与语音
通话和语音频道会将音频、视频和屏幕共享直接发送到服务器的独立端口。本页介绍网络配置、安装后需检查的设置,以及使用自行运行的语音转文本模型进行转录的方法。
通话的工作原理
通话由 通话 应用(id com.mattermost.calls)提供,该应用默认已安装并启用。语音频道(语音频道 应用,antimatter-next 镜像)是基于通话构建的永久通话房间:它们需要启用通话,并使用相同的设置、端口和服务器。
通话应用会在 Antimatter 内部运行一个媒体服务器。Web 应用、桌面应用和移动应用通过 WebRTC 连接到它:
- 信令通过常规 Web 连接(您的 HTTPS 代理)传输;
- 媒体(音频、视频、屏幕共享)则不经过代理:它直接通过通话端口发送到服务器,默认为 8443 UDP 和 TCP。
设置位于 系统控制台 › 插件 › 通话。这些设置也可以通过 antimatter 服务上的 AM_CALLS_ 环境变量进行设置,此时环境变量优先于系统控制台,并锁定该设置。旧版的 MM_CALLS_ 名称也有效。
安装后请检查这些设置
- 开放通话端口。 在服务器和云提供商的防火墙中允许 8443/udp 和 8443/tcp。
- 检查测试模式。测试模式(
DefaultEnabled)默认处于关闭状态,因此所有人都可以发起通话。在系统控制台 › 插件 › 通话中将其设为开启,以便在检查通话功能是否正常时,仅允许系统管理员在频道中发起通话,检查完成后请再次将其关闭。该变量为AM_CALLS_DEFAULT_ENABLED:true表示测试模式已关闭。从 Mattermost 迁移过来的服务器会保留其配置中保存的设置。 - 决定视频设置。启用视频(
EnableVideo,AM_CALLS_ENABLE_VIDEO)默认处于开启状态:在允许通话的地方(私信、群组消息和频道中),用户都可以开启摄像头。在语音频道中,由语音频道应用的允许在语音频道中使用视频设置决定。如果关闭此设置,则任何人都无法开启摄像头,即使在语音频道中也是如此。 - 在 NAT 后面,设置公共地址(下一节)。
通话开启的位置
每个社区都有类型,工作场所或社区(参见新社区的类型)。如果频道管理员未明确开启或关闭通话,则频道将遵循其所属社区的类型:
- 在工作场所中,频道遵循服务器默认设置:当测试模式关闭时,所有人都可以发起通话;
- 在社区中,频道内的通话默认关闭:人们改为在语音频道中交流。频道和社区管理员仍可以在特定频道中开启通话。
频道自身的设置始终优先。私信和群组消息不属于任何社区:当测试模式关闭时,其中的通话对所有人开放。社区类型的变更将在 30 秒内应用于通话设置。
端口、NAT 和 STUN
| 设置项 | 变量 | 默认值 |
|---|---|---|
| RTC 服务器端口 (UDP) | AM_CALLS_UDP_SERVER_PORT | 8443 |
| RTC 服务器端口 (TCP) | AM_CALLS_TCP_SERVER_PORT | 8443 |
| 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 participants | AM_CALLS_MAX_CALL_PARTICIPANTS | 0(无限制) | 单次通话中允许的最大人数。 |
| Allow screen sharing | (系统控制台) | 开启 | 允许参与者共享屏幕。 |
| Enable call ringing | AM_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(默认开启,但请参阅上文关于视频的说明)。社区管理员可以在频道设置中将频道转换为语音频道。
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)。

设置方法
在 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_TRANSCRIPTIONS | true |
| Call transcriber API | AM_CALLS_TRANSCRIBE_API | openai(显示为“OpenAI-compatible API (no job service)”) |
| Speech-to-text API URL | AM_CALLS_TRANSCRIBE_API_OPEN_AIURL | API 的基础 URL,包含 /v1 在内。 |
| Speech-to-text model | AM_CALLS_TRANSCRIBE_API_OPEN_AI_MODEL | API 所识别的模型名称,例如 whisper-1。必填。 |
| Speech-to-text API key | AM_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 分钟)以及通话录制质量(低、中或高;默认为中)。此功能无需许可证。启用录制后,通话主持人可通过通话控制中的录制通话选项开始和停止录制;通话中的所有人都会看到正在录制的提示,录制停止后,录像将发布到该通话的话题中。语音频道中的通话没有话题,因此无法录制。如果仅需转录和字幕,上述语音转文本设置更为简单:它不需要作业服务。