Открыть меню
Платформа Эра. Документация
Toggle preferences menu
Открыть персональное меню
Вы не представились системе
Your IP address will be publicly visible if you make any edits.

Установка сервисов голосового робота

Материал из Платформа Эра. Документации

Установка и настройка голосового робота Эра (SecondChain)

Пошаговая инструкция по развёртыванию голосового робота. Процесс разбит на четыре этапа:

  1. Подготовка — Docker, PostgreSQL, настройки в системе телефонии.
  2. Установка сервисов инференса — ASR, LLM, TTS. Опционально, только для развёртывания на собственном сервере с GPU.
  3. Настройка .env — параметры подключения.
  4. Запуск контейнера и создание робота — старт сервиса и конфигурация робота.

Этап 1. Подготовка

Установка Docker, базы данных и настройка проброса заголовков и абонента в системе телефонии.

1.1. Установка Docker

apt install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

1.2. Создать БД в PostgreSQL

Установить или взять существующий инстанс Postgres, создать нового пользователя и базу для робота.

Пример с Docker:

docker run -d \
  --name postgres \
  --network host \
  -e POSTGRES_USER=secondchain \
  -e POSTGRES_PASSWORD=changeme \
  -e POSTGRES_DB=secondchain \
  -v pgdata:/var/lib/postgresql/data \
  postgres:17

1.3. Настройка проброса заголовка в B2B

Мастер-домен → приложение Настройки. В конфигурации, в нодах B2B добавить проброс заголовка X-Robot-Session:

"fwd_headers": ["X-Robot-Session"],

Активировать новую конфигурацию.

1.4. Создать абонента для робота

Проектный домен → приложение Настройки. Создать нового абонента, под которым будет регистрироваться робот.

1.5. Создать канал интеграции для робота

Проектный домен → приложение Настройки. Создать новый канал интеграции:

  • Тип — Подписчик
  • Праваai_admin, ai_voicebot_admin
  • Режим активности — постоянный

Шаблон:Note

1.6. Создать движок в приложении ИИ

Задать произвольные название и код. В поле Номер телефона указать внутренний номер абонента, созданного на шаге 1.4.

Количество сессий по умолчанию = 8. Точное число зависит от оборудования, на котором размещаются сервисы робота.

Этап 2. Установка сервисов инференса (опционально)

Шаблон:Note

Инструкция для Ubuntu Server 24.04. Стек: ASR (T-one/Triton) → LLM (Qwen3.5-35B-A3B на vLLM) → TTS (LightTTS + CosyVoice3).

Целевая машина — сервер с GPU: RTX PRO 5000 (48GB) или RTX PRO 6000 Blackwell (96GB).

2.1. Предварительные требования

Убедиться, что установлены драйверы NVIDIA, Docker и NVIDIA Container Toolkit:

nvidia-smi                          # драйвер и GPU видны
docker --version                    # Docker установлен
docker run --rm --gpus all ubuntu nvidia-smi   # GPU проброшен в контейнер

Если последняя команда не отображает GPU, требуется установить NVIDIA Container Toolkit и перезапустить Docker.

Бюджет VRAM

Компонент VRAM
ASR (T-one/Triton) 600–800 MB
LLM (Qwen3.5-35B-A3B) 24–48 GB (зависит от числа сессий и длины контекста)
TTS (LightTTS/CosyVoice3) 11 GB

Суммарное потребление в пике — ~36–60 GB.

RTX PRO 6000 (96GB): объёма достаточно с большим запасом. Допустимо использование максимального числа сессий и длинного контекста.

RTX PRO 5000 (48GB): запас минимальный. Фиксированная сумма ASR (~0.8 GB) и TTS (11 GB) составляет ~12 GB, на LLM остаётся ~36 GB. Это покрывает только нижнюю границу диапазона LLM (24 GB). Требуется ограничение параметров --max-num-seqs и --max-model-len во избежание ошибки OOM. Значение --gpu-memory-utilization 0.50 (~24 GB на карте 48GB) для данного сценария допустимо при условии, что ASR и TTS инициализированы до старта LLM.

2.2. Порядок запуска

Модели независимы. Рекомендуемый порядок развёртывания для упрощения диагностики: ASR → LLM → TTS.

2.3. ASR (T-one на Triton)

Сборка выполняется из исходных файлов в каталоге /home/secondchain через venv и скрипт сборки контейнера.

# Python 3.12 + venv
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install -y python3.12 python3.12-venv

# Корень проекта
cd /home/secondchain

# Установка зависимостей
./setup.sh

# Активация окружения
source venv/bin/activate

# Сборка и запуск контейнера T-one на Triton
./scripts/run_tone_triton.sh

Проверка: после старта Triton слушает gRPC (стандартно 8001) и HTTP (стандартно 8000). Потребление VRAM — 600–800 MB. Статус контейнера:

docker ps | grep -i tone

Шаблон:Note

2.4. LLM (Qwen3.5-35B-A3B на vLLM)

Шаблон:Note

docker run -d \
  --name vllm-qwen35-moe \
  --gpus all \
  --ipc=host \
  -v ~/vllm-cache:/root/.cache \
  -p 16080:8000 \
  vllm/vllm-openai:cu130-nightly \
  --model Qwen/Qwen3.5-35B-A3B-GPTQ-Int4 \
  --served-model-name qwen35-35b-a3b \
  --quantization moe_wna16 \
  --max-num-seqs 6 \
  --max-model-len 8192 \
  --kv-cache-memory 3221225472 \
  --gpu-memory-utilization 0.50 \
  --enable-prefix-caching \
  --host 0.0.0.0 --port 8000 \
  --reasoning-parser qwen3 \
  --enable-auto-tool-choice \
  --tool-call-parser qwen3_coder \
  --language-model-only

Ключевые параметры:

  • --max-model-len 8192 — максимальное окно контекста в токенах.
  • --max-num-seqs 6 — максимум одновременно обрабатываемых запросов.
  • --gpu-memory-utilization 0.50 — 50% VRAM выделено под LLM.
  • --kv-cache-memory 3221225472 — 3 GiB под KV-кэш.

Минимальный объём VRAM для запуска — 24 GB. Фактическое потребление — 24–48 GB в зависимости от числа допустимых сессий (--max-num-seqs) и длины контекста (--max-model-len).

Проверка: после загрузки весов проверить OpenAI-совместимый эндпоинт на порту 16080:

docker logs -f vllm-qwen35-moe        # ожидать "Application startup complete"

curl http://localhost:16080/v1/models

curl http://localhost:16080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen35-35b-a3b",
    "messages": [{"role": "user", "content": "Привет"}]
  }'

2.5. TTS (LightTTS + CosyVoice3)

Сборка двухфазная: на первой фазе интерактивно подготавливается образ с TRT-движком и весами с последующим коммитом, на второй — выполняется запуск в режиме демона.

Фаза 1 — подготовка образа

docker pull lighttts/light-tts:latest

docker run -it --gpus all -p 8080:8080 --shm-size 4g --name lighttts \
  -v ~/lighttts-models:/data \
  lighttts/light-tts:latest /bin/bash

Внутри контейнера:

git checkout main && git pull
pip install huggingface_hub

python -c "
from huggingface_hub import snapshot_download
snapshot_download('FunAudioLLM/Fun-CosyVoice3-0.5B-2512', local_dir='/data/Fun-CosyVoice3-0.5B')
"

# первый запуск собирает TRT-движок (float16)
python -m light_tts.server.api_server \
  --model_dir /data/Fun-CosyVoice3-0.5B \
  --data_type float16 \
  --load_trt True

exit

Фаза 2 — коммит и запуск в режиме демона

docker commit lighttts lighttts/light-tts:ready
docker rm lighttts

docker run -d --gpus all -p 8080:8080 --shm-size 4g \
  --restart unless-stopped \
  --name lighttts \
  -v ~/lighttts-models:/data \
  lighttts/light-tts:ready \
  python -m light_tts.server.api_server \
    --model_dir /data/Fun-CosyVoice3-0.5B \
    --data_type float16 \
    --load_trt True

Проверка: TTS слушает порт 8080, потребление VRAM — 11 GB:

docker ps | grep lighttts
docker logs -f lighttts          # ожидать готовности сервера

2.6. Итоговая карта портов

Сервис Контейнер Внешний порт
ASR (Triton HTTP) *tone* 8000
ASR (Triton gRPC) *tone* 8001
LLM (vLLM) vllm-qwen35-moe 16080
TTS (LightTTS) lighttts 8080

2.7. Финальная проверка стека

docker ps        # все три контейнера (ASR / vLLM / TTS) в статусе Up

После проверки выполняется подключение пайплайна PjSIP → VAD → ASR → LLM → TTS с указанием эндпоинтов в конфигурации: ASR — :8000/:8001, LLM — :16080, TTS — :8080.

Этап 3. Настройка .env

Шаблон:TODO

Базовые параметры:

EXTERNAL_TEMPLATES_URL=https://[адрес инстанса эры]/rest/v1/model/ai/robot
EXTERNAL_TEMPLATES_TOKEN=[локальный токен из шага 1.5]

А также настройки Postgres (из шага 1.2) и подключения SIP к учётной записи абонента (из шага 1.4).


Этап 4. Запуск контейнера и создание робота

4.1. Загрузка образа и запуск контейнера

Скопировать на сервер архив с образом контейнера и файл .env в одну директорию.

docker load -i secondchain-1.0.3a-cpu.tar.gz
mkdir -p ./logs
docker run -d --name secondchain \
  --network host \
  --env-file .env \
  --restart unless-stopped \
  -v secondchain-data:/data \
  -v ./logs:/app/logs \
  secondchain:1.0.3a-cpu

docker logs secondchain -f

Когда сервис загрузится и проинициализируется, в консоли появится сообщение:

Registration: OK (code=200)    [pjsip.account]
[info     ] SIP client registered successfully [voip.sip]
[info     ] VoIP health monitor started    [src.api.app]
[info     ] SecondChain started successfully [src.api.app]
[info     ] Application startup complete.  [uvicorn.error]
[info     ] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

Шаблон:Note

4.2. Создать робота в приложении ИИ

Загрузить голос

Необходим аудиофайл .mp3 или .wav длительностью ~10 секунд, без лишних шумов и эхо. При загрузке указать точную транскрипцию произнесённого текста (со знаками препинания).

Для быстрого старта можно импортировать демо-голос (импорт + загрузка файла).

Создать инструменты

Базовые инструменты работы со звонком.

drop_call

Параметр Значение
Имя drop_call
Код drop_call
description Завершение звонка по инициативе робота
toolType callManagement
callAction drop
enabled Да

transfer_call

Параметр Значение
Имя transfer_call
Код transfer_call
description Перевод звонка на оператора
toolType callManagement
callAction transfer
transferDestination Короткий номер для перевода звонков (например, номер очереди)
enabled Да

Создать робота

Импортировать шаблон (Роботы.json). На вкладке Инструкции изучить рекомендуемый шаблон системного промпта, а также промпта пост-обработки звонка.

4.3. Проверить создание пользователя

После создания робота должен автоматически создаться пользователь Робот_имяРобота.

4.4. Проверить и установить статус пользователя

Приложение Супервизор контакт-центра → раздел Операторы → Текущие статусы. Убрать фильтры, найти пользователя робота и убедиться, что у него установлен статус Готов. При необходимости установить этот статус.

4.5. Добавить робота в очередь

Приложение Администратор контакт-центра → добавить робота как участника очереди. Тип участника = Робот. В остальном настройки идентичны.

4.6. Осуществить звонок

Настройка завершена. Можно совершить звонок в очередь и протестировать работу робота.

Содержание