Chamadas e voz

As chamadas e os canais de voz enviam áudio, vídeo e partilha de ecrã diretamente para o servidor na respetiva porta. Esta página aborda a parte de rede, as definições a verificar após a instalação, e a transcrição com um modelo de reconhecimento de voz que executa por sua conta.

Como funcionam as chamadas

As chamadas são fornecidas pela aplicação Chamadas (id com.mattermost.calls), que é instalada e ativada por omissão. Os canais de voz (a aplicação Canais de voz, imagem antimatter-next) são salas de chamada permanentes construídas sobre as Chamadas: necessitam que as Chamadas estejam ativadas e utilizam as mesmas definições, portas e servidores.

A aplicação Chamadas executa um servidor de media dentro do Antimatter. A aplicação web, a aplicação de desktop e as aplicações móveis ligam-se a ele com WebRTC:

  • a sinalização passa pela ligação web normal (o seu proxy HTTPS);
  • o media (áudio, vídeo, partilha de ecrã) não: vai diretamente para o servidor na porta de chamadas, 8443 UDP e TCP por omissão.

As definições estão em Consola do sistema › Plugins › Chamadas. Cada uma delas também pode ser definida com uma variável de ambiente AM_CALLS_ no serviço antimatter, que então tem prioridade sobre a Consola do sistema e bloqueia a definição lá. Os nomes legados MM_CALLS_ também funcionam.

Verifique estas após a instalação

  1. Abra a porta de chamadas. Permita 8443/udp e 8443/tcp no firewall do servidor e do seu provedor de cloud.
  2. Verifique o modo de teste. O modo de teste (DefaultEnabled) está desativado por defeito, pelo que todos podem iniciar chamadas. Ative-o (Ligado) em Consola do sistema › Plugins › Chamadas para permitir que apenas os administradores do sistema iniciem chamadas nos canais enquanto verifica se as chamadas funcionam, e desative-o novamente. A variável é AM_CALLS_DEFAULT_ENABLED: true significa que o modo de teste está desativado. Um servidor migrado do Mattermost mantém a opção guardada na respetiva configuração.
  3. Decida sobre o vídeo. O Ativar vídeo (EnableVideo, AM_CALLS_ENABLE_VIDEO) está ativado por defeito: as pessoas podem ativar a câmara sempre que as chamadas estiverem ativas, em mensagens diretas e de grupo, bem como nos canais. Nos canais de voz, é a opção Permitir vídeo nos canais de voz da aplicação Canais de voz que decide. Se a desativar, ninguém poderá ativar a câmara, nem mesmo nos canais de voz.
  4. Por trás de NAT, defina o endereço público (secção seguinte).

Onde as chamadas estão ativas

Cada comunidade tem um tipo, Local de trabalho ou Comunidade (veja Tipo de novas comunidades). Um canal cujos administradores não tenham ativado ou desativado as chamadas segue o tipo da respetiva comunidade:

  • num local de trabalho, os canais seguem o valor por defeito do servidor: as chamadas estão ativas para todos enquanto o modo de teste estiver desativado;
  • numa comunidade, as chamadas estão desativadas nos canais: as pessoas conversam nos canais de voz. Os administradores do canal e da comunidade podem, no entanto, ativar as chamadas num canal.

A configuração própria de um canal tem sempre prioridade. As mensagens diretas e de grupo não pertencem a uma comunidade: as chamadas nesses contextos estão ativas para todos enquanto o modo de teste estiver desativado. Uma alteração do tipo de uma comunidade aplica-se às chamadas no prazo de 30 segundos.

Portas, NAT e STUN

DefiniçãoVariávelPadrão
Porta do servidor RTC (UDP)AM_CALLS_UDP_SERVER_PORT8443
Porta do servidor RTC (TCP)AM_CALLS_TCP_SERVER_PORT8443
Endereço do servidor RTC (UDP), (TCP)AM_CALLS_UDP_SERVER_ADDRESS, AM_CALLS_TCP_SERVER_ADDRESSvazio: todos os endereços
Sobrescrever o anfitrião ICEAM_CALLS_ICE_HOST_OVERRIDEvazio: encontrado através do STUN
Sobrescrever a porta do anfitrião ICEAM_CALLS_ICE_HOST_PORT_OVERRIDEvazio: a porta do servidor
Configurações dos servidores ICEAM_CALLS_ICE_SERVERS_CONFIGS[{"urls":["stun:stun.cloudflare.com:3478"]}]
(Experimental) Ativar suporte IPv6(Consola do sistema)desativado

As portas devem estar entre 80 e 49151. Com o ficheiro compose do site, altere CALLS_PORT em .env: define ambas as variáveis e publica a porta, o mesmo número no anfitrião e no contentor. Os clientes tentam primeiro UDP e recorrem a TCP na mesma porta.

O endereço para onde os clientes enviam os dados multimédia

O servidor indica a cada cliente o endereço para onde enviar os dados multimédia (o seu "candidato de anfitrião"). Por omissão, encontra o seu endereço público ao perguntar a um servidor STUN, um serviço público que responde com o endereço e a porta de origem de uma solicitação. A omissão é o servidor STUN público da Cloudflare, stun:stun.cloudflare.com:3478. O servidor não é o único a usá-lo: cada cliente que entra numa chamada também lhe pergunta o seu próprio endereço público. O servidor STUN vê apenas endereços IP e portas, nunca áudio, vídeo ou mensagens da chamada.

Um servidor que ainda tem o servidor STUN do Mattermost (stun.global.calls.mattermost.com) guardado em Configurações dos servidores ICE, por exemplo após uma migração do Mattermost, usa o da Cloudflare. A configuração guardada não é alterada.

Defina o endereço manualmente quando:

  • o servidor estiver atrás de NAT, ou tiver vários endereços públicos: defina Sobrescrever o anfitrião ICE com o endereço IP público (ou um nome de anfitrião que resolva para ele);
  • o NAT mapear uma porta pública diferente para a 8443: defina também Sobrescrever a porta do anfitrião ICE com essa porta pública;
  • o servidor não tiver acesso à Internet, ou não quiser que o servidor e os clientes contactem um servidor STUN externo: defina Sobrescrever o anfitrião ICE e esvazie a lista STUN com AM_CALLS_ICE_SERVERS_CONFIGS=[]. Com Sobrescrever o anfitrião ICE definido, o servidor deixa de perguntar a um servidor STUN o seu endereço; a lista vazia impede os clientes de o fazerem.
services:
  antimatter:
    environment:
      AM_CALLS_ICE_HOST_OVERRIDE: 203.0.113.10
      AM_CALLS_ICE_SERVERS_CONFIGS: "[]"

Para manter o STUN sem uma terceira parte, execute o seu próprio servidor STUN (um servidor TURN, como o coturn, também responde a pedidos STUN) e liste-o em Configurações dos servidores ICE em vez disso, como no exemplo de TURN abaixo.

Numa rede local, use o endereço LAN do servidor. Reinicie o servidor após alterar portas, endereços ou configurações ICE, ou desative e ative a app de Chamadas: o servidor de dados multimédia é configurado quando a app inicia.

TURN, para firewalls restritivos

Algumas redes bloqueiam tanto o UDP como as ligações de saída para portas TCP incomuns. As pessoas que as utilizam necessitam de um servidor TURN, que reencaminha os meios através de uma porta acessível (frequentemente a 443). O Antimatter não inclui um; execute um servidor TURN, como o coturn, e adicione-o a Configurações dos Servidores ICE, uma lista JSON:

[
  {"urls": ["stun:turn.example.com:3478"]},
  {"urls": ["turn:turn.example.com:3478?transport=udp", "turns:turn.example.com:443?transport=tcp"]}
]
  • Com um segredo partilhado (o use-auth-secret do coturn), coloque o mesmo segredo em Segredo de Autenticação Estática do TURN (AM_CALLS_TURN_STATIC_AUTH_SECRET): o servidor fornece a cada cliente credenciais de curta duração, válidas durante o período definido em Expiração das Credenciais do TURN (minutos) (240 por omissão).
  • Com credenciais fixas, adicione "username" e "credential" à entrada do TURN, em vez disso.
  • TURN no Lado do Servidor (desativado por omissão) também utiliza os servidores TURN para as ligações iniciadas pelo servidor.

Outras definições de chamadas

DefiniçãoVariávelPadrãoO que faz
Máximo de participantes por chamadaAM_CALLS_MAX_CALL_PARTICIPANTS0 (sem limite)Número máximo de pessoas numa única chamada.
Permitir partilha de ecrã(Consola do sistema)ligadoPermite aos participantes partilharem o seu ecrã.
Ativar toque de chamadaAM_CALLS_ENABLE_RINGINGligadoFaz tocar os outros participantes de uma mensagem direta ou de grupo quando uma chamada é iniciada.
Ativar simulcast para partilha de ecrã (Experimental)(Consola do sistema)desativadoEnvia as partilhas de ecrã em várias qualidades.
Ativar o codec AV1 para partilha de ecrã (Experimental)(Consola do sistema)desativadoIgnorado enquanto o simulcast estiver ativado.

A aplicação Canais de Voz tem duas definições, em Consola do Sistema › Plugins › Canais de Voz: Entrar ao abrir um canal de voz (ativado por omissão) e Permitir vídeo em canais de voz (ativado por omissão, mas veja o vídeo acima). Os administradores da comunidade transformam um canal num canal de voz nas respetivas definições.

Para desativar completamente as chamadas, desative a aplicação Chamadas em Consola do Sistema › Plugins › Gestão de Plugins, ou defina AM_CALLS_DISABLE=true. Os canais de voz também deixam de funcionar.

Servidores maiores: um rtcd externo

Por omissão, um servidor Antimatter gere todos os dados de chamadas. Para muitas chamadas simultâneas, ou para manter os dados fora do servidor de chat, a app de Chamadas pode transferir os dados para o rtcd, um servidor de media separado (o rtcd de código aberto do Mattermost, versão 0.17 ou superior). Defina URL do serviço RTCD (AM_CALLS_RTCD_SERVICE_URL), por exemplo https://rtcd.example.com: todas as chamadas passam então por ele, e os clientes enviam os seus dados para a própria porta do rtcd em vez da do Antimatter. As credenciais podem ser fornecidas com AM_CALLS_RTCD_CLIENT_ID e AM_CALLS_RTCD_AUTH_KEY; sem elas, a app regista-se no rtcd. Não é necessária uma licença. A app de Chamadas mostra aos administradores um aviso recomendando o rtcd quando um servidor tem frequentemente mais de 50 pessoas em chamadas ao mesmo tempo.

Transcrição e legendas em direto

O Antimatter pode transcrever chamadas com um modelo de reconhecimento de voz que corre por sua conta, e mostrar legendas em direto enquanto as pessoas falam. O Antimatter utiliza qualquer servidor que ofereça um endpoint /v1/audio/transcriptions compatível com a OpenAI, como um servidor Whisper na sua rede. Não é necessário nenhum serviço adicional do Antimatter.

Como funciona

  • O anfitrião de uma chamada inicia a transcrição com Transcrever a chamada nos controlos da chamada. Um distintivo A transcrever informa todos.
  • A app de cada participante ouve o seu próprio microfone, divide a fala em pedaços curtos (até 12 segundos, nunca quando está em silêncio) e envia-os para o Antimatter, que os reenvia para o seu servidor de reconhecimento de voz.
  • Com as legendas em direto ativadas, o texto de cada pedaço é mostrado aos participantes como legenda de imediato.
  • Quando a transcrição termina ou a chamada acaba, o bot de Chamadas publica a transcrição como um ficheiro de texto e um ficheiro de legendas WebVTT, no tópico da chamada (em canais de voz, no canal).
  • Com Resumir transcrições ativado, o agente predefinido da app de Agentes também publica um resumo no tópico (ver IA).
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.
Após a chamada, a transcrição e o seu resumo no tópico da chamada.

Configuração

Defina estes no serviço 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
DefiniçãoVariávelO que introduzir
Ativar transcrições de chamadas (Beta)AM_CALLS_ENABLE_TRANSCRIPTIONStrue
API do transcritor de chamadasAM_CALLS_TRANSCRIBE_APIopenai (mostrado como "API compatível com OpenAI (sem serviço de tarefas)")
URL da API de reconhecimento de vozAM_CALLS_TRANSCRIBE_API_OPEN_AIURLA URL base da API, até e incluindo /v1.
Modelo de reconhecimento de vozAM_CALLS_TRANSCRIBE_API_OPEN_AI_MODELO nome do modelo como a API o conhece, por exemplo whisper-1. Obrigatório.
Chave da API de reconhecimento de vozAM_CALLS_TRANSCRIBE_API_OPEN_AI_KEYEnviada como token de bearer. Deixe-a vazia se a API não necessitar de uma.
Ativar legendas em direto (Beta)AM_CALLS_ENABLE_LIVE_CAPTIONStrue para legendas durante a chamada.
Língua das legendas em diretoAM_CALLS_LIVE_CAPTIONS_LANGUAGEA língua falada, como um código de duas letras (en por omissão). É enviada para a API de reconhecimento de voz para transcrições também, por isso defina-a mesmo sem legendas.
Resumir transcriçõesAM_CALLS_SUMMARIZE_TRANSCRIPTIONStrue para um resumo por IA após a chamada.
Na Consola do sistema, as definições de transcrição só aparecem quando Ativar gravações de chamadas está ligado, embora este tipo de transcrição não necessite de gravação. Definir as variáveis acima evita isso. Não ligue as gravações em conjunto com o transcritor openai: iniciar uma gravação tentaria então iniciar o transcritor do serviço de tarefas e falharia.

O áudio de todos os que falam enquanto a transcrição está ativa é enviado para o servidor de reconhecimento de voz que configurou, e a transcrição é publicada onde todos no canal a podem ler. Informe os seus utilizadores e mantenha esse servidor na sua própria rede se as chamadas forem confidenciais.

Gravações

As gravações de chamadas (e as transcrições com os transcritores integrados whisper.cpp ou Azure) são executadas em contentores separados iniciados por um serviço de tarefas, o calls-offloader de código aberto da Mattermost, que é implantado por si junto do Antimatter. As definições são Ativar gravações de chamadas (AM_CALLS_ENABLE_RECORDINGS, desativado por omissão), URL do serviço de tarefas (AM_CALLS_JOB_SERVICE_URL), Duração máxima da gravação de chamadas (60 minutos por omissão, entre 15 e 180) e Qualidade da gravação de chamadas (baixa, média ou alta; média por omissão). Não é necessária uma licença. Quando as gravações estão ativas, o anfitrião de uma chamada inicia e termina uma gravação com Gravar a chamada nos controlos da chamada; todos os participantes na chamada veem que está a ser gravada, e a gravação é publicada no tópico da chamada quando esta termina. As chamadas em canais de voz não têm tópico, pelo que não podem ser gravadas. Para transcrições e legendas apenas, a configuração de reconhecimento de voz acima é mais simples: não requer um serviço de tarefas.