Установка

Требования

Установить NNRTP можно из Docker репозитория или скачав файлы Docker образов вручную. Скачать необходимые образы контейнеров можно на странице загрузки: Downloads

Быстрый старт

Максимально простая настройка и развертывание. В контейнере уже есть Coordinator, Denoiser и SIP Proxy (Kamailio). Все что нужно - установить docker, docker-compose, создать файл docker-compose.yml с содержимым:

            
$ cat docker-compose.yml
version: '3'
services:
  denoiser:
    image: 'nnrtp/quickstart:latest'
    network_mode: "host"
    environment:
    - rnn_model=model_ru
    - internal_ip=192.168.1.167
    - external_ip=192.168.1.167
    - denoise_stream=both
    - license_key=key

rnn_model - используемая модель нейросети (см.ниже).
internal_ip - адрес сервера во внутренней сети. Например 192.168.1.167.
external_ip - адрес сервера во внешней сети, обычно это адрес в интернете, выданный Вам вашим провайдером.
Иногда его называют NAT адресом.
В большинстве случаев его нужно оставить таким же как и internal_ip, ваш SIP провайдер отлично с этим справится.

Запустить контейнер:

            
docker-compose up -d

Прозрачный SIP Proxy с шумоподавлением будет работать на 5061 порту. Вам нужно только указать этот сервер в качестве SIP-Proxy в настройках SIP-клиента. Например: 192.168.1.167:5061

Coordinator

Обратите внимание что Координатор в системе может быть только один. Схема отказоустойчивости с активным и пассивными координаторами не рекомендована, т.к. у пассивных экземпляров отсутствует информация о потоках. При переключении трафика на новый координатор все старые звуковые потоки будут прерваны.

            
$ cat docker-compose.yml
version: '3'
services:
  coordinator:
    image: 'nnrtp/coordinator:latest'
    environment:
    - intranet=192.168.1.0/24
    - denoise_stream=both
    - license_key=key
    - internal_ip=192.168.1.106
    - external_ip=192.168.1.106
    network_mode: "host"

Подробнее о конфигурации и значении параметров можно прочитать здесь

            
$ docker-compose up

Denoiser

Denoiser хорошо масштабируется. Кол-во работающих образов может быть любым.

            
$ cat docker-compose.yml
version: '3'
services:
  denoiser:
    image: 'nnrtp/denoiser:latest'
    network_mode: "host"
    environment:
    - rnn_model=model_ru
    - server_host=127.0.0.1
    - server_port=1102

Подробнее о конфигурации и значении параметров можно прочитать здесь

            
$ docker-compose up


Настройка NNRTP

Denoiser и Coordinator настраиваются с помощью переменных окружения которые задаются при старте контейнера.

Общий принцип работы

Denoiser и Coordinator могут быть размещены в облаке или на выделенном сервере вместе с корпоративным SIP Сервером (не забудьте изменить порт для Координатора).

Кол-во работающих образов Denoiser может быть любым, в то время как процесс/образ Coordinator может быть только один (будет исправлено в версии 1.3. «Statefull failover»).

Coordinator является простым SIP прокси, на нем нельзя зарегистрироваться/авторизоваться. Для этого в сети должен быть SIP Server/Proxy с возможностью регистрации пользователей (у Вас или у Вашего SIP провайдера).

Потоки данных при шумоподавлении VoIP

Настройка Coordinator
Пример настройки:
            
services:
  coordinator:
    image: 'nnrtp/coordinator:latest'
    environment:
    - intranet=192.168.1.0/24
    - denoise_stream=both
    - license_key=key
    - internal_ip=192.168.1.106
    - external_ip=192.168.1.106
    network_mode: "host"

Параметр Назначение
intranet=адрес Адрес или маска сети, определяет адреса внутренних клиентов/серверов от которых будут приходить пакеты (src_ip). Определяет сторону A в настройках шумоподавления.
denoise_stream=параметр Направление трафика, которое будет очищаться от шумов. Изменять этот параметр имеет смысл если у Вас ограниченная лицензия и Вы хотите максимально эффективно распределить лицензии только на очистку голосового трафика, например, от оператора к клиенту.
параметр:
  • both – очищать трафик в обоих направлениях
  • AtoB – очищать трафик только от А к B
  • BtoA – очищать трафик только от B к A
internal_ip=адрес Aдрес сервера, на котором запущен контейнер с NNRT Coordinator, во внутренней сети. Например 192.168.1.167
external_ip=адрес Aдрес сервера во внешней сети, обычно это адрес в интернете, выданный Вам вашим провайдером.
Иногда его называют NAT адресом.
В большинстве случаев его нужно оставить таким же как и internal_ip, ваш SIP провайдер отлично с этим справится.
license_key=key Строка лицензионного ключа. Без кавычек.

network_mode: "host" – является обязательной настройкой, т.к. Координатор использует 30 000 портов для пропуска голосового трафика. При другом значении могут возникать ошибки iptables.

Координатор принимает SIP пакет, просматривает его содержимое, и, если требуется – вносит необходимые изменения. Если пакет имеет неизвестный формат или в нем не нужно производить изменений – пакет прозрачно отправляется дальше.

В случае если SIP пакет нужно изменить – в пакете отбрасываются все кодеки кроме [поддерживаемых], адрес RTP трафика изменяется на адрес координатора, порт RTP трафика выбирается произвольный, добавляется поле Via.

Настройка Denoiser
Пример настройки:
            
services:
  denoiser:
    environment:
    - rnn_model=model_ru
    - server_host=127.0.0.1
    - server_port=1102
    
Параметр Назначение
rnn_model=имя NN Название модели нейросети, используемой для очистки голосового трафика от шумов. имя NN:
  • model_ru – для русской речи.
  • model_multilanguage – для речи на других основных европейских языках.
  • default – то же что и model_multilanguage.
По умолчанию – model_multilanguage

Специфические модели хорошо подходят для шумоподавления на конкретном языке, речь на других языках тоже может быть успешно обработана, но иногда возникают «артефакты» шумоподавления (произношение некоторых звуков может быть распознано как шум)

model_multilanguage подходит для большинства основных европейских языков, но качество шумоподавления у нее немного хуже чем у специфических моделей.
server_host=IPv4 Определяет адрес и порт координатора, сервиса k8s, или NAT за которым находится координатор.
Между координатором и Denoiser может находится NAT/dNAT/sNAT, принцип работы таков, что трансляция адресов не влияет на их взаимодействие.
server_port=порт

Настройка SIP Proxy

Общие принципы настройки SIP Proxy

При настройке корпоративного SIP Сервера/Proxy следует руководствоваться следующими принципами:

  • Нужно настроить новый SIP Trunk с Координатором, использовав его IP адрес и порт в качестве адреса назначения SIP Trunk.
  • Настроить проверку доступности SIP Trunk. Подробнее об этом можно [почитать здесь]
  • Сделать новый SIP Trunk основным каналом телефонии, а старый запасным.

Эти настройки должны обеспечить хорошую отказоустойчивость и работоспособность.

Пример настройки шумоподавления для SIP Softphone + SIP Provider

Требования:

  • Статический IP-адрес для SoftPhone.
  • Статический IP-адрес для сервера с NNTRP.
  • Статический «белый» (публичный) IP-адрес для подключения к интернету.

Схема использования шумоподавления в связке с SoftPhone и SIP Provider

Установка и настройка NNRTP на сервере Ubuntu 20.04 (192.168.1.167)

Нужно установить необходимые пакеты на сервер:

            
$ sudo apt install docker docker-compose
    

Создадим 2 файла docker-compose.coordinator.yml и docker-compose.denoiser.yml со следующим содержимым:

docker-compose.coordinator.yml:

            
version: '3'
services:
  coordinator:
    image: 'nnrtp/coordinator:latest'
    environment:
    - intranet=192.168.1.0/24
    - denoise_stream=both
    - license_key=key
    - internal_ip=192.168.1.167
    - external_ip=100.64.56.12
    network_mode: "host"
 

Основные настройки:
192.168.1.0/24 - внутренние адреса сети, с которых мы будем принимать SIP пакееты.
192.168.1.167 – адрес сервера NNRTP с координатором, на который SoftPhone будет отправлять SIP-пакеты. 100.64.56.12 – адрес нашего роутера в интернете. Это необходимо для преодоления NAT. На этот адрес сервер SIP Provider’а будет слать SIP пакеты, затем роутер, перешлет их нашему серверу NNRTP (192.168.1.167). Этот же адрес будет установлен для получения RTP пакетов от SIP Provider’а. Вам не нужно заботиться о «пробрасывании» портов для RTP трафика – NNRTP использует симметричные порты для передачи голосового трафика, поэтому роутер автоматически создаст трансляции для входящего трафика от SIP Provider’а.
NNRTP будет прозрачно пересылать все пакеты от SoftPhone к SIP Provider’у и если потребуется он будет вносить правки в SIP пакеты обеспечивающие прохождение SIP и RTP трафика через NNRTP. Вы можете использовать разные способы подключения к вашему SIP Provider: с регистрацией или со статическим транком.

Остальные настройки:
- denoise_stream=both
both – включает шумоподавление в обоих направлениях – от SoftPhone к серверу SIP Provider’а и от SIP Provider’а к SoftPhone

docker-compose.denoiser.yml:

            
version: '3'
services:
  denoiser:
    image: 'nnrtp/denoiser:latest'
    network_mode: "host"
    environment:
    - rnn_model=model_ru
    - server_host=127.0.0.1
    - server_port=1102
 

Т.к. Denoiser у нас располагается на том же сервере что и Координатор то адрес server_host будет 127.0.0.1. 1102 порт по умолчанию для подключения Denoiser к Координатору. model_ru – будем использовать модель наиболее подходящую для русской речи.
Нет необходимости запускать на одном сервере несколько копий Denoiser (кроме случая когда контейнеру доступно ограниченное кол-во процессоров), т.к. при старте он определит кол-во доступных процессоров и создаст по одному потоку шумоподавления на каждый процессор.

Настройка SoftPhone
В качестве SoftPhone будем использовать microsip.
Откройте настройки аккаунта (Settings – Edit Account)
Укажите ваши учетные данные и адрес SIP сервера вашего SIP Provider’а. В качестве SIP Proxy укажите адрес сервера NNRTP, а так же порт на котором работает координатор – 5060.
У вас должно получиться как на картинке ниже:

Настройки microsip

Подтвердите настройки нажав кнопку «Save».
После этого SoftPhone должен зарегистрироваться на сервере SIP Provider’а.
Сделайте ваш первый тестовый звонок с шумоподавлением :) .

Отказоустойчивость NNRTP

Сходимость компонентов

probes

Denoiser’ы и Coordinator обмениваются друг с другом пакетами, определяющими их состояние, каждые 100 мс.

Переключение при выходе из строя Denoiser

Denoiser регистрируется Координатором при получении первого пакета от него.
В случае если Coordinator не получил 5 пакетов (500 мс) от Denoiser, то Denoiser считается отключившимся и все RTP потоки переключаются на оставшиеся рабочие Denoiser.

Координатор передает RTP трафик прозрачно если нет ни одного работающего Denoiser

В случае отключения всех Denoiser от Координатора, Координатор начинает прозрачно передавать RTP непосредственному получателю без изменений (без шумоподавления).

В случае если подключится хотя бы один Denoiser – RTP трафик будет перенаправлен на него и шумоподавление продолжится для текущих звонков.

В случае если координатор выйдет из строя – передача SIP и RTP пакетов будет прервана (будет исправлено в версии 1.3. «Statefull failover» ), абоненты перестанут слышать друг друга.

Отказоустойчивость SIP "Trunk"

На корпоративном SIP Server необходимо настроить проверку доступности основного провайдера телефонии через Координатор. Для этого нужно настроить отправку SIP OPTIONS через Координатор.

Координатор пересылает все пакеты OPTIONS следующему пиру, а все ответы перешлет обратно SIP Server. Таким образом будет проверена работоспособность и Координатора, и сетевая связность Координатора с провайдером телефонии (SIP Provider).

Проверка работы Координатора

В случае выхода из строя Координатора – статус SIP Trunk на корпоративном SIP Сервере изменится на Down и новые звонки должны пойти по запасному пути.

Координатор не доступен