Установка и настройка голосового робота Эра (SecondChain)
Пошаговая инструкция по развёртыванию голосового робота. Процесс разбит на четыре этапа:
- Подготовка — Docker, PostgreSQL, настройки в системе телефонии.
- Установка сервисов инференса — ASR, LLM, TTS. Опционально, только для развёртывания на собственном сервере с GPU.
- Настройка .env — параметры подключения.
- Запуск контейнера и создание робота — старт сервиса и конфигурация робота.
Этап 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 - Режим активности — постоянный
1.6. Создать движок в приложении ИИ
Задать произвольные название и код. В поле Номер телефона указать внутренний номер абонента, созданного на шаге 1.4.
Количество сессий по умолчанию = 8. Точное число зависит от оборудования, на котором размещаются сервисы робота.
Этап 2. Установка сервисов инференса (опционально)
Инструкция для 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
2.4. LLM (Qwen3.5-35B-A3B на vLLM)
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
Базовые параметры:
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)
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. Осуществить звонок
Настройка завершена. Можно совершить звонок в очередь и протестировать работу робота.