Llamadas y voz

Las llamadas y los canales de voz envían audio, vídeo y compartir pantalla directamente al servidor en su propio puerto. Esta página cubre la parte de red, las configuraciones que debes comprobar después de la instalación y la transcripción con un modelo de voz a texto que ejecutes tú mismo.

Cómo funcionan las llamadas

Las llamadas las proporciona la aplicación Llamadas (id com.mattermost.calls), que se instala y habilita de forma predeterminada. Los canales de voz (la aplicación Canales de voz, imagen antimatter-next) son salas de llamada permanentes basadas en Llamadas: requieren que Llamadas esté habilitada y usan la misma configuración, puertos y servidores.

La aplicación Llamadas ejecuta un servidor de medios dentro de Antimatter. La aplicación web, la aplicación de escritorio y las aplicaciones móviles se conectan a él mediante WebRTC:

  • la señalización pasa por la conexión web normal (tu proxy HTTPS);
  • los medios (audio, vídeo, compartir pantalla) no: van directamente al servidor en el puerto de llamadas, 8443 UDP y TCP de forma predeterminada.

La configuración se encuentra en Consola de sistema › Plugins › Llamadas. Cada una de ellas también se puede configurar con una variable de entorno AM_CALLS_ en el servicio antimatter, que tiene prioridad sobre la Consola de sistema y bloquea la configuración allí. Los nombres heredados MM_CALLS_ también funcionan.

Comprueba esto después de la instalación

  1. Abre el puerto de llamadas. Permite 8443/udp y 8443/tcp en el cortafuegos del servidor y de tu proveedor de nube.
  2. Comprueba el modo de prueba. El modo de prueba (DefaultEnabled) está desactivado por defecto, por lo que todo el mundo puede iniciar llamadas. Actívalo (Encendido) en Consola de sistema › Plugins › Llamadas para que solo los administradores del sistema puedan iniciar llamadas en los canales mientras verificas que funcionen, y luego desactívalo de nuevo. La variable es AM_CALLS_DEFAULT_ENABLED: true significa que el modo de prueba está desactivado. Un servidor migrado desde Mattermost conserva la elección guardada en su configuración.
  3. Decidir sobre el video. Activar video (EnableVideo, AM_CALLS_ENABLE_VIDEO) está activado por defecto: las personas pueden encender su cámara en cualquier lugar donde las llamadas estén habilitadas, en mensajes directos y de grupo y en canales. En los canales de voz, la opción Permitir video en canales de voz de la aplicación de canales de voz es la que decide. Si se desactiva, nadie podrá encender la cámara, ni siquiera en los canales de voz.
  4. Detrás de NAT, configura la dirección pública (sección siguiente).

Dónde están activadas las llamadas

Cada comunidad tiene un tipo, Espacio de trabajo o Gremio (consulta Gremio o espacio de trabajo). Un canal cuyos administradores no hayan activado ni desactivado las llamadas sigue el tipo de su comunidad:

  • en un espacio de trabajo, los canales siguen el valor predeterminado del servidor: las llamadas están activadas para todos mientras el modo de prueba esté desactivado;
  • en un gremio, las llamadas están desactivadas en los canales: las personas hablan en canales de voz en su lugar. Los administradores del canal y de la comunidad aún pueden activar las llamadas en un canal.

La configuración propia de un canal siempre tiene prioridad. Los mensajes directos y de grupo no pertenecen a una comunidad: las llamadas allí están activadas para todo el mundo mientras el modo de prueba está desactivado. Un cambio del tipo de una comunidad se aplica a las llamadas en un plazo de 30 segundos.

Puertos, NAT y STUN

AjusteVariablePredeterminado
Puerto del servidor RTC (UDP)AM_CALLS_UDP_SERVER_PORT8443
Puerto del servidor RTC (TCP)AM_CALLS_TCP_SERVER_PORT8443
Dirección del servidor RTC (UDP), (TCP)AM_CALLS_UDP_SERVER_ADDRESS, AM_CALLS_TCP_SERVER_ADDRESSvacío: todas las direcciones
Sustitución de host ICEAM_CALLS_ICE_HOST_OVERRIDEvacío: se detecta mediante STUN
Sustitución de puerto de host ICEAM_CALLS_ICE_HOST_PORT_OVERRIDEvacío: el puerto del servidor
Configuraciones de servidores ICEAM_CALLS_ICE_SERVERS_CONFIGS[{"urls":["stun:stun.cloudflare.com:3478"]}]
(Experimental) Habilitar soporte para IPv6(Consola de sistema)desactivado

Los puertos deben estar entre 80 y 49151. Con el archivo compose del sitio, cambie CALLS_PORT en .env: esto establece ambas variables y publica el puerto, el mismo número en el host y en el contenedor. Los clientes primero intentan UDP y, si no funciona, usan TCP en el mismo puerto.

La dirección a la que los clientes envían los medios

El servidor indica a cada cliente la dirección a la que debe enviar los medios (su "candidato de host"). De forma predeterminada, encuentra su dirección pública consultando un servidor STUN, un servicio público que responde con la dirección y el puerto desde los que se envió la solicitud. El valor predeterminado es el servidor STUN público de Cloudflare, stun:stun.cloudflare.com:3478. El servidor no es el único que lo utiliza: cada cliente que se une a una llamada también consulta su propia dirección pública. El servidor STUN solo ve direcciones IP y puertos, nunca el audio, el video o los mensajes de la llamada.

Un servidor que aún tiene el servidor STUN de Mattermost (stun.global.calls.mattermost.com) guardado en Configuraciones de servidores ICE, por ejemplo después de migrar desde Mattermost, usa el de Cloudflare en su lugar. La configuración guardada no se modifica.

Establezca la dirección manualmente cuando:

  • el servidor esté detrás de NAT o tenga varias direcciones públicas: establezca Sustitución de host ICE en la dirección IP pública (o un nombre de host que se resuelva a ella);
  • el NAT mapea un puerto público diferente al 8443: establezca también Sustitución de puerto de host ICE en ese puerto público;
  • el servidor no tiene acceso a Internet, o no desea que el servidor y los clientes contacten con un servidor STUN externo: establezca Sustitución de host ICE y vacíe la lista de STUN con AM_CALLS_ICE_SERVERS_CONFIGS=[]. Con Sustitución de host ICE establecido, el servidor ya no consulta un servidor STUN para obtener su dirección; la lista vacía impide que los clientes consulten uno.
services:
  antimatter:
    environment:
      AM_CALLS_ICE_HOST_OVERRIDE: 203.0.113.10
      AM_CALLS_ICE_SERVERS_CONFIGS: "[]"

Para mantener STUN sin un tercero, ejecute su propio servidor STUN (un servidor TURN como coturn también responde a solicitudes STUN) y inclúyalo en Configuraciones de servidores ICE en su lugar, como en el ejemplo de TURN a continuación.

En una red local, use la dirección LAN del servidor. Reinicie el servidor después de cambiar puertos, direcciones o configuraciones ICE, o desactive y active la app de Llamadas: el servidor de medios se configura cuando la app se inicia.

TURN, para cortafuegos estrictos

Algunas redes bloquean tanto UDP como las salidas a puertos TCP inusuales. Las personas que se encuentran en estas redes necesitan un servidor TURN, que reenvía los medios por un puerto al que pueden acceder (a menudo el 443). Antimatter no incluye uno; ejecute un servidor TURN como coturn y agréguelo a ICE Servers Configurations, una lista JSON:

[
  {"urls": ["stun:turn.example.com:3478"]},
  {"urls": ["turn:turn.example.com:3478?transport=udp", "turns:turn.example.com:443?transport=tcp"]}
]
  • Con un secreto compartido (el use-auth-secret de coturn), coloque el mismo secreto en TURN Static Auth Secret (AM_CALLS_TURN_STATIC_AUTH_SECRET): el servidor otorga a cada cliente credenciales de vida corta, válidas durante TURN Credentials Expiration (minutes) (240 por defecto).
  • Con credenciales fijas, agregue "username" y "credential" a la entrada TURN en su lugar.
  • Server Side TURN (desactivado por defecto) también usa los servidores TURN para las conexiones que inicia el servidor.

Otras configuraciones de llamadas

AjusteVariablePredeterminadoQué hace
Max call participantsAM_CALLS_MAX_CALL_PARTICIPANTS0 (sin límite)Número máximo de personas en una sola llamada.
Allow screen sharing(Consola de sistema)activadoPermite a los participantes compartir su pantalla.
Enable call ringingAM_CALLS_ENABLE_RINGINGactivadoHace sonar el teléfono de las demás personas en un mensaje directo o de grupo cuando se inicia una llamada en él.
Enable simulcast for screen sharing (Experimental)(Consola de sistema)desactivadoEnvía las comparticiones de pantalla en varias calidades.
Enable AV1 codec for screen sharing (Experimental)(Consola de sistema)desactivadoSe ignora mientras simulcast esté activado.

La aplicación de Canales de voz tiene dos configuraciones, en Consola de sistema › Plugins › Canales de voz: Unirse al abrir un canal de voz (activada de forma predeterminada) y Permitir video en canales de voz (activada de forma predeterminada, pero consulta el video anterior). La voz es un tipo de canal, seleccionado al crear el canal (consulta Crear un canal); no hay un paso posterior para "convertirlo en un canal de voz". Estas dos configuraciones siguen aplicándose a todos los canales de voz. Crear uno requiere que la aplicación de Canales de voz esté activa; sin ella, Voz aparece atenuado en el cuadro de diálogo de creación de canales.

The create-channel dialog with Voice picked: the Talk and Stage preset cards, Voice Channels app active
Voz, una vez que la aplicación de Canales de voz está activa: las tarjetas Hablar y Escenario.
Para desactivar las llamadas por completo, deshabilita la aplicación Llamadas en Consola de sistema › Plugins › Gestión de Plugins, o configura AM_CALLS_DISABLE=true. Los canales de voz también dejarán de funcionar.

Servidores más grandes: un rtcd externo

Por defecto, un servidor de Antimatter gestiona todos los medios de las llamadas. Para muchas llamadas simultáneas, o para mantener los medios fuera del servidor de chat, la app de Llamadas puede delegar los medios en rtcd, un servidor de medios independiente (el rtcd de código abierto de Mattermost, versión 0.17 o posterior). Establece la URL del servicio RTCD (AM_CALLS_RTCD_SERVICE_URL), por ejemplo https://rtcd.example.com: entonces todas las llamadas pasan por él, y los clientes envían sus medios al propio puerto de rtcd en lugar de al de Antimatter. Las credenciales pueden proporcionarse con AM_CALLS_RTCD_CLIENT_ID y AM_CALLS_RTCD_AUTH_KEY; si no se proporcionan, la app se registra en rtcd. No se necesita licencia. La app de Llamadas muestra a los administradores una advertencia recomendando rtcd cuando un servidor suele tener más de 50 personas en llamadas al mismo tiempo.

Transcripción y subtítulos en vivo

Antimatter puede transcribir llamadas con un modelo de voz a texto que ejecutes tú mismo, y mostrar subtítulos en vivo mientras la gente habla. Antimatter utiliza cualquier servidor que ofrezca un endpoint /v1/audio/transcriptions compatible con OpenAI, como un servidor Whisper en tu red. No se necesita ningún servicio adicional de Antimatter.

Cómo funciona

  • El anfitrión de una llamada inicia la transcripción con Transcribir la llamada en los controles de la llamada. Una insignia de Transcribiendo lo indica a todos.
  • La app de cada participante escucha su propio micrófono, corta el habla en fragmentos cortos (de hasta 12 segundos, nunca mientras está en silencio) y los envía a Antimatter, que los reenvía a tu servidor de voz a texto.
  • Con los subtítulos en vivo activados, el texto de cada fragmento se muestra a los participantes como subtítulo de inmediato.
  • Cuando la transcripción se detiene o la llamada termina, el bot de Llamadas publica la transcripción como un archivo de texto y un archivo de subtítulos WebVTT, en el hilo de la llamada (en los canales de voz, en el canal).
  • Con Resumir transcripciones activado, el agente predeterminado de la aplicación de chat de IA también publica un resumen en el hilo (consulta 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.
Después de la llamada, la transcripción y su resumen en el hilo de la llamada.

Configúralo

Establece estos valores en el servicio 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
AjusteVariableQué introducir
Enable call transcriptions (Beta)AM_CALLS_ENABLE_TRANSCRIPTIONStrue
Call transcriber APIAM_CALLS_TRANSCRIBE_APIopenai (mostrado como "OpenAI-compatible API (no job service)")
Speech-to-text API URLAM_CALLS_TRANSCRIBE_API_OPEN_AIURLLa URL base de la API, hasta e incluyendo /v1.
Speech-to-text modelAM_CALLS_TRANSCRIBE_API_OPEN_AI_MODELEl nombre del modelo tal como lo conoce la API, por ejemplo whisper-1. Obligatorio.
Speech-to-text API keyAM_CALLS_TRANSCRIBE_API_OPEN_AI_KEYSe envía como un token de portador. Déjalo vacío si la API no lo necesita.
Activar subtítulos en vivo (Beta)AM_CALLS_ENABLE_LIVE_CAPTIONStrue para mostrar subtítulos durante la llamada.
Idioma de los subtítulos en vivoAM_CALLS_LIVE_CAPTIONS_LANGUAGEEl idioma hablado, como un código de dos letras (en por defecto). Se envía a la API de voz a texto también para las transcripciones, así que configúralo incluso si no usas subtítulos.
Resumir transcripcionesAM_CALLS_SUMMARIZE_TRANSCRIPTIONStrue para obtener un resumen con IA después de la llamada.
En la Consola de sistema, la configuración de transcripciones solo aparece cuando Activar grabaciones de llamadas está activado, aunque este tipo de transcripción no requiere grabación. Configurarlas con las variables anteriores evita esto. No actives las grabaciones junto con el transcriptor openai: al iniciar una grabación, se intentaría iniciar el transcriptor del servicio de trabajos y fallaría.

El audio de todas las personas que hablan mientras la transcripción está activada se envía al servidor de voz a texto que configuraste, y la transcripción se publica donde todos en el canal pueden leerla. Informa a tus usuarios y mantén ese servidor en tu propia red si las llamadas son confidenciales.

Grabaciones

La grabación de llamadas (y la transcripción con el transcriptor integrado whisper.cpp o los transcriptores de Azure) se ejecuta en contenedores separados iniciados por un servicio de trabajos, calls-offloader de Mattermost, que debe desplegarse usted mismo junto a Antimatter. Las configuraciones son Enable call recordings (AM_CALLS_ENABLE_RECORDINGS, desactivado por defecto), Job service URL (AM_CALLS_JOB_SERVICE_URL), Maximum call recording duration (60 minutos por defecto, entre 15 y 180) y Call recording quality (baja, media o alta; media por defecto). No se necesita licencia. Una vez activadas las grabaciones, el anfitrión de la llamada inicia y detiene la grabación con Record the call en los controles de la llamada; todos los participantes ven que se está grabando, y la grabación se publica en el hilo de la llamada cuando se detiene. Las llamadas en canales de voz no tienen hilo, por lo que no se pueden grabar. Para transcripciones y subtítulos únicamente, la configuración de voz a texto descrita anteriormente es más sencilla: no requiere un servicio de trabajos.