통화와 음성
통화와 음성 채널은 오디오, 비디오, 화면 공유를 전용 포트에서 서버로 직접 전송합니다. 이 페이지에서는 네트워크 측면, 설치 후 확인해야 할 설정, 자체적으로 실행하는 음성 인식 모델로 녹취록을 생성하는 방법을 다룹니다.
통화 작동 방식
통화는 기본적으로 설치 및 활성화된 통화 앱(id com.mattermost.calls)에서 제공됩니다. 음성 채널(음성 채널 앱, antimatter-next 이미지)은 통화 위에 구축된 영구 통화 룸입니다. 음성 채널은 통화가 활성화되어 있어야 하며, 동일한 설정, 포트, 서버를 사용합니다.
통화 앱은 Antimatter 내부에서 미디어 서버를 실행합니다. 웹 앱, 데스크톱 앱, 모바일 앱은 WebRTC로 이 서버에 연결합니다:
- 시그널링은 일반 웹 연결(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 뒤에서 공용 주소 설정(다음 섹션).
통화가 켜져 있는 위치
Every community has a kind, Workplace or Community (see Kind of new communities). A channel whose admins haven't turned calls on or off follows its community's kind:
- 업무 공간에서는 채널이 서버 기본 설정을 따릅니다. 테스트 모드가 꺼져 있는 동안에는 모든 사용자에게 통화가 켜져 있습니다.
- 커뮤니티에서는 채널에서 통화가 꺼져 있습니다. 대신 음성 채널에서 대화합니다. 채널 및 커뮤니티 관리자는 채널에서 통화를 켤 수 있습니다.
채널 자체의 설정이 항상 우선합니다. 다이렉트 메시지와 그룹 메시지는 커뮤니티에 속하지 않습니다. 테스트 모드가 꺼져 있는 동안에는 해당 메시지에서 모든 사용자에게 통화가 켜져 있습니다. 커뮤니티 유형 변경은 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의 STUN 서버를 사용합니다. 저장된 설정은 변경되지 않습니다.
다음과 같은 경우 주소를 직접 설정하세요:
- 서버가 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 서버(TURN 서버인 coturn과 같은 경우에도 STUN 요청에 응답합니다)를 실행하고, 아래 TURN 예시처럼 ICE 서버 구성에 이를 대신 나열하세요.
로컬 네트워크만 사용하는 경우 서버의 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 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가 켜져 있는 동안에는 무시됩니다. |
음성 채널 앱에는 관리자 도구 › 플러그인 › 음성 채널에 두 가지 설정이 있습니다: 음성 채널을 열 때 참여(기본값: 켜짐)와 음성 채널에서 비디오 허용(기본값: 켜짐, 단, 위 비디오 참고). 커뮤니티 관리자는 채널 설정에서 채널을 음성 채널로 전환합니다.
AM_CALLS_DISABLE=true를 설정하세요. 그러면 음성 채널도 작동하지 않습니다.대형 서버: 외부 rtcd
기본적으로 하나의 Antimatter 서버가 모든 통화 미디어를 처리합니다. 동시 통화가 많거나 미디어를 채팅 서버에서 분리하려면, Calls 앱이 미디어를 rtcd라는 별도 미디어 서버(Mattermost의 오픈소스 rtcd, 버전 0.17 이상)에 전달할 수 있습니다. RTCD 서비스 URL(AM_CALLS_RTCD_SERVICE_URL)을, 예를 들어 https://rtcd.example.com처럼 설정하면 모든 통화가 이를 통해 이루어지며, 클라이언트는 Antimatter의 포트 대신 rtcd의 자체 포트에 미디어를 전송합니다. 자격 증명은 AM_CALLS_RTCD_CLIENT_ID와 AM_CALLS_RTCD_AUTH_KEY로 제공할 수 있으며, 제공하지 않으면 앱이 rtcd에 자체를 등록합니다. 라이선스는 필요하지 않습니다. 서버에 동시에 50명 이상이 통화하는 경우가 많으면 Calls 앱이 관리자에게 rtcd 사용을 권장하는 경고를 표시합니다.
녹취록 및 실시간 자막
Antimatter는 자체적으로 실행하는 음성 인식 모델로 통화를 녹취하고, 사람들이 말하는 동안 실시간 자막을 표시할 수 있습니다. Antimatter는 Whisper 서버와 같이 OpenAI 호환 /v1/audio/transcriptions 엔드포인트를 제공하는 모든 서버를 사용할 수 있습니다. Antimatter의 추가 서비스는 필요하지 않습니다.
동작 방식
- 통화 호스트는 통화 컨트롤의 통화 녹취로 녹취를 시작합니다. 녹취 중 배지가 모든 참가자에게 표시됩니다.
- 각 참가자의 앱은 자신의 마이크를 듣고, 음성을 짧은 조각(최대 12초, 음소거 중에는 절대)으로 잘라서 Antimatter에 전송하며, Antimatter는 이를 음성 인식 서버로 전달합니다.
- 실시간 자막이 켜져 있으면 각 조각의 텍스트가 즉시 자막으로 참가자들에게 표시됩니다.
- 녹취가 중단되거나 통화가 끝나면, Calls 봇이 녹취록을 텍스트 파일과 WebVTT 자막 파일로 통화가 이루어진 글타래(음성 채널의 경우 채널)에 게시합니다.
- 녹취록 요약이 켜져 있으면, 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
| 설정 | 변수 | 입력 내용 |
|---|---|---|
| 통화 녹취 활성화 (베타) | AM_CALLS_ENABLE_TRANSCRIPTIONS | true |
| 통화 녹취기 API | AM_CALLS_TRANSCRIBE_API | openai("OpenAI 호환 API (잡 서비스 없음)"으로 표시됨) |
| 음성 인식 API URL | AM_CALLS_TRANSCRIBE_API_OPEN_AIURL | API의 기본 URL, /v1까지 포함. |
| 음성 인식 모델 | AM_CALLS_TRANSCRIBE_API_OPEN_AI_MODEL | API가 인식하는 모델 이름, 예를 들어 whisper-1. 필수. |
| 음성 인식 API 키 | AM_CALLS_TRANSCRIBE_API_OPEN_AI_KEY | 베어러 토큰으로 전송됩니다. API가 키를 필요로 하지 않으면 비워 두세요. |
| 실시간 자막 사용 (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 녹취기를 사용한 녹취 포함)는 Antimatter 옆에 직접 배포하는 Mattermost의 오픈소스 잡 서비스인 calls-offloader가 시작하는 별도 컨테이너에서 실행됩니다. 관련 설정은 통화 녹화 사용(AM_CALLS_ENABLE_RECORDINGS, 기본값: 끔), 잡 서비스 URL(AM_CALLS_JOB_SERVICE_URL), 최대 통화 녹화 시간(기본값: 60분, 15~180분) 및 통화 녹화 품질(낮음, 중간 또는 높음; 기본값: 중간)입니다. 라이선스가 필요 없습니다. 녹화가 활성화되면 통화 호스트는 통화 컨트롤의 통화 녹화로 녹화를 시작하고 중지합니다. 통화 참여자 모두 녹화 중임을 알 수 있으며, 녹화가 중지되면 해당 녹화가 통화의 글타래에 게시됩니다. 음성 채널의 통화에는 글타래가 없으므로 녹화할 수 없습니다. 녹취록과 자막만 필요한 경우, 위의 음성 인식 설정이 더 간단합니다. 잡 서비스가 필요 없기 때문입니다.