Дзвінки та голос

Дзвінки та голосові канали передають аудіо, відео та демонстрацію екрана напряму на сервер через його власний порт. На цій сторінці описано мережевий бік, налаштування, які варто перевірити після встановлення, а також транскрипцію за допомогою моделі розпізнавання мовлення, яку ви запускаєте самостійно.

Як працюють дзвінки

Дзвінки забезпечує додаток Дзвінки (id com.mattermost.calls), який встановлено та ввімкнено за замовчуванням. Голосові канали (додаток Голосові канали, образ antimatter-next) — це постійні кімнати для дзвінків, побудовані на базі Дзвінків: для них потрібно, щоб Дзвінки були ввімкнені, і вони використовують ті самі налаштування, порти та сервери.

Додаток Дзвінки запускає медіа-сервер всередині Antimatter. Веб-додаток, десктопний додаток та мобільні додатки підключаються до нього за допомогою WebRTC:

  • сигналізація проходить через звичайне веб-з’єднання (ваш HTTPS-проксі);
  • медіа (аудіо, відео, демонстрація екрана) — ні: воно передається напряму на сервер через порт дзвінків, за замовчуванням 8443 UDP і TCP.

Налаштування розташовані в Системна консоль › Плагіни › Дзвінки. Кожне з них також можна встановити за допомогою змінної середовища AM_CALLS_ для служби antimatter, яка тоді має пріоритет над Системною консоллю і блокує налаштування там. Назви застарілого формату 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порожньо: всі адреси
Заміна адреси вузла ICEAM_CALLS_ICE_HOST_OVERRIDEпорожньо: знайдено за допомогою STUN
Заміна порту вузла ICEAM_CALLS_ICE_HOST_PORT_OVERRIDEпорожньо: порт сервера
Налаштування серверів ICEAM_CALLS_ICE_SERVERS_CONFIGS[{"urls":["stun:stun.cloudflare.com:3478"]}]
(Дослідний) Увімкнути підтримку IPv6(Системна консоль)Вимкнено

Порти мають бути в межах від 80 до 49151. У файлі compose сайту змініть CALLS_PORT в .env: він встановлює обидві змінні та публікує порт, той самий номер на хості та в контейнері. Клієнти спочатку намагаються використовувати UDP, а за неможливості переходять на TCP на тому самому порту.

Яку адресу клієнти використовують для відправки медіа

Сервер повідомляє кожному клієнту адресу, на яку слід надсилати медіа (його «кандидат вузла»). За замовчуванням він визначає свою публічну адресу, запитуваючи STUN-сервер — публічний сервіс, який відповідає адресою та портом, з яких надійшов запит. За замовчуванням використовується публічний STUN-сервер Cloudflare, stun:stun.cloudflare.com:3478. Не лише сервер користується ним: кожен клієнт, що приєднується до дзвінка, також запитує його, щоб дізнатися свою публічну адресу. STUN-сервер бачить лише IP-адреси та порти, ніколи — аудіо, відео чи повідомлення дзвінка.

Сервер, у якому в Налаштування серверів ICE досі збережено STUN-сервер Mattermost (stun.global.calls.mattermost.com), наприклад після переходу з Mattermost, замість нього використовує STUN-сервер Cloudflare. Збережене налаштування не змінюється.

Встановіть адресу вручну, якщо:

  • сервер перебуває за NAT або має кілька публічних адрес: встановіть Заміна адреси вузла ICE на публічну IP-адресу (або на іменник хоста, який розв’язується в неї);
  • NAT відображає інший публічний порт на 8443: також встановіть Заміна порту вузла ICE на той публічний порт;
  • сервер не має доступу до Інтернету, або ви не хочете, щоб сервер і клієнти контактували з зовнішнім STUN-сервером: встановіть Заміна адреси вузла ICE та очистіть список STUN за допомогою AM_CALLS_ICE_SERVERS_CONFIGS=[]. Якщо встановлено Заміна адреси вузла 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) і вкажіть його в Налаштування серверів ICE замість іншого, як у прикладі TURN нижче.

У локальній мережі використовуйте LAN-адресу сервера. Після зміни портів, адрес або налаштувань ICE перезапустіть сервер або вимкніть і увімкніть додаток Дзвінки: медіа-сервер налаштовується під час запуску додатка.

TURN для суворих файрволів

Деякі мережі блокують як UDP, так і вихідні з’єднання на незвичайні порти TCP. Користувачам таких мереж потрібен сервер TURN, який ретранслює медіа через порт, до якого вони можуть отримати доступ (часто 443). Antimatter не містить такого сервера; запустіть сервер TURN, наприклад coturn, і додайте його до Конфігурації серверів ICE — JSON-списку:

[
  {"urls": ["stun:turn.example.com:3478"]},
  {"urls": ["turn:turn.example.com:3478?transport=udp", "turns:turn.example.com:443?transport=tcp"]}
]
  • Якщо використовується спільний секрет (use-auth-secret coturn), введіть той самий секрет у Статичний аутентифікаційний секрет TURN (AM_CALLS_TURN_STATIC_AUTH_SECRET): сервер видаватиме кожному клієнту короткочасні облікові дані, дійсні протягом Терміну дії облікових даних TURN (хвилини) (за замовчуванням 240).
  • Якщо використовуються фіксовані облікові дані, додайте "username" та "credential" до запису TURN замість цього.
  • TURN на стороні сервера (вимкнено за замовчуванням) також використовує сервери TURN для з’єднань, які ініціює сервер.

Інші налаштування дзвінків

НалаштуванняЗміннаТипове значенняПризначення
Максимальна кількість учасників дзвінкаAM_CALLS_MAX_CALL_PARTICIPANTS0 (без обмежень)Найбільша кількість людей в одному дзвінку.
Дозволити демонстрацію екрана(Системна консоль)увімкненоДозволяє учасникам демонструвати свій екран.
Увімкнути дзвінок при старті дзвінкаAM_CALLS_ENABLE_RINGINGувімкненоДзвонить іншим учасникам приватного або групового повідомлення, коли у ньому починається дзвінок.
Увімкнути симукаст для демонстрації екрана (експериментально)(Системна консоль)ВимкненоНадсилає демонстрацію екрана в кількох якостях.
Увімкнути кодек AV1 для демонстрації екрана (експериментально)(Системна консоль)ВимкненоІгнорується, коли симукаст увімкнено.

У додатку Голосові канали є два налаштування в Системна консоль › Плагіни › Голосові канали: Приєднатися при відкритті голосового каналу (ввімкнено за замовчуванням) та Дозволити відео в голосових каналах (ввімкнено за замовчуванням, але див. розділ про відео вище). Адміністратори спільнот перетворюють канал на голосовий у його налаштуваннях.

Щоб повністю вимкнути дзвінки, вимкніть додаток Дзвінки в Системна консоль › Плагіни › Керування плагінами або встановіть AM_CALLS_DISABLE=true. Тоді голосові канали також перестануть працювати.

Крупніші сервери: зовнішній rtcd

За замовчуванням один сервер Antimatter обробляє всі медіадані дзвінків. Для багатьох одночасних дзвінків або щоб не перевантажувати сервер чату медіаданими, додаток «Дзвінки» може передати їх на rtcd — окремий медіасервер (відкритий із кодом rtcd від Mattermost, версія 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. Ліцензія не потрібна. Додаток «Дзвінки» показує адміністраторам попередження з рекомендацією використовувати rtcd, коли на сервері одночасно в дзвінках буває понад 50 осіб.

Транскрипція та живі субтитри

Antimatter може транскрибувати дзвінки за допомогою власної мовної моделі та показувати живі субтитри, доки люди говорять. Antimatter працює з будь-яким сервером, що пропонує сумісний з OpenAI кінцевий пункт /v1/audio/transcriptions, наприклад сервер Whisper у вашій мережі. Жоден додатковий сервіс від Antimatter не потрібен.

Як це працює

  • Господар дзвінка запускає транскрипцію за допомогою Транскрибувати дзвінок у керуванні дзвінком. Усі учасники бачать значок Транскрипція.
  • Додаток кожного учасника слухає його мікрофон, розрізає мовлення на короткі фрагменти (до 12 секунд, ніколи, коли звук вимкнено) і надсилає їх до Antimatter, який пересилає їх на ваш сервер розпізнавання мовлення.
  • Якщо живі субтитри увімкнено, текст кожного фрагменту одразу показується учасникам як субтитр.
  • Коли транскрипція зупиняється або дзвінок завершується, бот «Дзвінки» публікує транскрипт як текстовий файл і файл субтитрів WebVTT в обговоренні дзвінка (у голосових каналах — в самому каналі).
  • Якщо увімкнено Summarize transcriptions, агент за замовчуванням із додатка «Агенти» також публікує в обговоренні резюме (див. ШІ).
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_AIURLБазовий URL API, включно з /v1.
Speech-to-text modelAM_CALLS_TRANSCRIBE_API_OPEN_AI_MODELНазва моделі, яку використовує API, наприклад whisper-1. Обов’язковий параметр.
Speech-to-text API keyAM_CALLS_TRANSCRIBE_API_OPEN_AI_KEYНадсилається як токен доступу. Залиште порожнім, якщо API не потребує ключа.
Увімкнути живі субтитри (Beta)AM_CALLS_ENABLE_LIVE_CAPTIONStrue для субтитрів під час дзвінка.
Мова живих субтитрівAM_CALLS_LIVE_CAPTIONS_LANGUAGEМова, якою говорять, у форматі дволітерного коду (en за замовчуванням). Цей параметр також передається до API розпізнавання мови для створення транскриптів, тому встановіть його навіть без увімкнення субтитрів.
Створювати резюме транскриптівAM_CALLS_SUMMARIZE_TRANSCRIPTIONStrue для створення резюме за допомогою ШІ після дзвінка.
У Системній консолі налаштування транскрипції з’являються лише після того, як увімкнено Увімкнути запис дзвінків, хоча для цього типу транскрипції запис не потрібен. Встановлення цих параметрів за допомогою змінних, описаних вище, дозволяє уникнути цієї проблеми. Не вмикайте запис дзвінків разом із транскрибером openai: у такому разі спроба розпочати запис запустить транскрибер job-service, що призведе до помилки.

Аудіо всіх учасників, які говорять, поки транскрипція увімкнена, надсилається на сервер розпізнавання мови, який ви налаштували, а транскрипт публікується там, де його можуть прочитати всі учасники каналу. Попередьте про це своїх користувачів і, якщо дзвінки є конфіденційними, розмістіть цей сервер у власній мережі.

Запис дзвінків

Запис дзвінків (а також транскрипція за допомогою вбудованих засобів whisper.cpp або Azure) виконується в окремих контейнерах, які запускає служба завдань calls-offloader від Mattermost. Ви розгортаєте її поруч із Antimatter самостійно. Налаштування: Увімкнути запис дзвінків (AM_CALLS_ENABLE_RECORDINGS, вимкнено за замовчуванням), URL служби завдань (AM_CALLS_JOB_SERVICE_URL), Максимальна тривалість запису дзвінка (за замовчуванням 60 хвилин, від 15 до 180) та Якість запису дзвінка (низька, середня або висока; за замовчуванням — середня). Ліцензія не потрібна. Після увімкнення запису господар дзвінка запускає та зупиняє запис за допомогою Записати дзвінок у керуванні дзвінком. Усі учасники бачать, що дзвінок записується, а після зупинки записується в обговоренні дзвінка. Дзвінки в голосових каналах не мають обговорень, тому їх неможливо записати. Якщо потрібні лише транскрипти та субтитри, налаштування розпізнавання мови, описані вище, простіше: служба завдань не потрібна.