Skip to content

Latest commit

 

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Taxi Bot Docker Deployment

Полностью контейнеризированное решение для голосового бота заказа такси.

Архитектура

Решение состоит из следующих компонентов:

  • pjsip-proxy (C++) - принимает SIP-звонки и управляет RTP-потоками

  • sip-bot (Java Spring Boot) - логика диалога, распознавание речи (Vosk), интеграция с RunaWFE

  • rhvoice - синтез речи (Text-to-Speech) Выше перечисленное должно стоять вместе так как обмен через socket

  • RunaWFE - система управления бизнес-процессами (может работать отдельно)

Протоколы взаимодействия

  • Телефонный провайдер (SIP-транк, например, Ростелеком) ↔ pjsip-proxy:
    • SIP (UDP, порт 5060) — для сигнализации (установка и завершение звонка).
    • RTP (UDP, порты 4000-4100) — для передачи голосового потока (аудио).
  • pjsip-proxy ↔ sip-bot:
    • Unix Domain Sockets (/tmp/sip_prox/) — сверхбыстрая локальная передача событий звонка (INCOMING, DISCONNECTED) и потокового аудио (PCM) без сетевых накладных расходов Docker.
  • sip-bot ↔ rhvoice:
    • HTTP (внутри Docker-сети, порт 8080) — бот отправляет текст, сервис возвращает аудиофайл (WAV/PCM) для воспроизведения.
  • sip-bot ↔ RunaWFE:
    • HTTPS/HTTP REST API — отправка структурированных данных (телефон, адрес) для запуска бизнес-процесса по завершении диалога.

Схема работы звонка (Workflow)

  1. Входящий вызов: Клиент звонит на SIP-номер. Провайдер отправляет INVITE на pjsip-proxy.
  2. Инициализация: pjsip-proxy принимает звонок, согласовывает медиа-параметры (RTP) и мгновенно создает медиа-сокет в общей папке /tmp/sip_prox/.
  3. Приветствие: sip-bot через управляющий сокет (_control) получает событие INCOMING, формирует приветственную фразу и запрашивает её озвучку у rhvoice по HTTP.
  4. Диалог:
    • Клиент говорит → pjsip-proxy пересылает аудио-пакеты в сокет → sip-bot распознает речь через движок Vosk.
    • sip-bot анализирует смысл, формирует ответ и снова запрашивает синтез речи у rhvoice.
  5. Завершение и интеграция: По итогам диалога sip-bot отправляет HTTP-запрос в RunaWFE (запуск БП "Такси" с переменными "Телефон" и "Адрес"), прощается с клиентом и отправляет команду HANGUP в pjsip-proxy.

Телефония и сетевые требования

  • Тип телефонии: SIP-транк (IP-телефония). Решение совместимо с любыми провайдерами, поддерживающими стандартный стек SIP/RTP (в данной конфигурации успешно протестировано с шлюзами типа Ростелеком).
  • Сетевые настройки сервера:
    • На сервере (и в облачном фаерволе / Security Groups) должны быть открыты входящие UDP-порты:
      • 5060 — для SIP-сигнализации.
      • 4000-4100 — для RTP-медиапотока (голос).
    • На сервере должны быть настроены правила iptables (SNAT), чтобы исходящие пакеты от прокси уходили с корректного публичного IP-адреса (указывается в .env как PUBLIC_IP).

Требования

  • Windows 10/11 с WSL2 или Linux
  • Docker Desktop (для Windows) или Docker Engine (для Linux)
  • Docker Compose v2+
  • Модель Vosk vosk-model-ru-0.42 (~3 ГБ)
  • Работающий сервер RunaWFE на хосте

Подготовка

1. Модель audio

Скачайте модель Vosk

# Создайте директорию для модели
mkdir -p vosk-model-ru-0.42

# Скачайте модель с https://alphacephei.com/vosk/models
# Прямая ссылка: https://alphacephei.com/vosk/models/vosk-model-ru-0.42.zip
wget https://alphacephei.com/vosk/models/vosk-model-ru-0.42.zip

# Распакуйте в директорию vosk-model-ru-0.42
unzip vosk-model-ru-0.42.zip -d vosk-model-ru-0.42/

Итоговая структура:

taxi-bot-docker/
│
├── .env                          # 🔑 Секреты и настройки (SIP, RunaWFE, пароли)
├── .gitignore                    #  Что НЕ нужно коммитить в Git
├── docker-compose.yml            #  Главный файл оркестрации всех контейнеров
├── README.md                     # 📖 Краткая инструкция по запуску
│
├── pjsip_proxy/                  # 📂 Исходники C++ SIP-прокси
│   ├── Dockerfile                # 🛠 Как собирать и запускать прокси в Docker
│   ├── CMakeLists.txt            # (из оригинального репозитория)
│   └── ...                      # (исходный код C++)
│
├── runawfe-sip-bot/              # 📂 Исходники Java-бота
│   ├── Dockerfile                # 🛠 Как собирать и запускать бота в Docker
│   ├── pom.xml                   # (из оригинального репозитория)
│   ├── app/                      # (исходный код Java, application.yaml)
│   ├── stt/                      # (модули распознавания речи)
│   └── ...                      # (исходный код Java)
│
└── vosk-model-ru-0.42/           # 📂 Модель распознавания речи (Vosk)
├── am/
├── conf/
├── graph/
├── ivector/
└── ...

3. RunaWfe

Сервер RunaWfe должен быть запущен отдельно на 8080 порту.

4. Сборка и запуск.

  1. Убедитесь, что в файле .env корректно указаны:
    • Данные SIP-провайдера (SIP_DOMAIN, SIP_USER, SIP_PASS, PUBLIC_IP).
    • Адрес и учетные данные RunaWFE (WFE_API_URL, WFE_LOGIN, WFE_PASS).
    • Важно: URL должен содержать путь к API, например: https://ваш-домен.ru/restapi.
  2. Убедитесь, что в RunaWFE создана группа исполнителей "Водители" и развернут бизнес-процесс "Такси".

Далее в корне проекта выполните

docker-compose up -d --build 

⚠️ Важно для продакшена:

Windows: Убедитесь, что Брандмауэр Windows не блокирует порты Docker или WSL2.
Linux: Проверьте, что порты открыты: sudo ufw allow 5060/udp и sudo ufw allow 4000:4100/udp (или настройте Security Group в облаке).

4.Проблемы

Если запускаете локально на линуксе то надо знать что http://host.docker.internal:8080 по умолчанию не работает. В docker-compose есть настройка:

    extra_hosts:
      - "host.docker.internal:host-gateway"

но она может не сработать тогда нужно будет прописывать реальный ip адрес руны

Если не работает после перезапуска, то:

docker-compose down
docker volume rm taxi-bot-docker-dist_sip-sockets

или

Очищаем папку сокетов на хосте (или внутри контейнера, если volume именованный)

sudo rm -f /var/lib/docker/volumes/taxi-bot-docker-dist_sip-sockets/_data/* или просто всю папку _data

Запускаем заново

docker-compose up -d

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages