Система автоматизации телефонных звонков с использованием AI: SIP-телефония через Asterisk, распознавание речи, диалоговая модель и синтез голоса в реальном времени.
Репозиторий: gitlab.assistantsolo.com/solo-backend/sip-voice
Production-путь: /var/www/telephony
Деплой: автоматический при push в main (GitLab CI → SSH на solo-prod)
sip-voice решает задачу автоматизированного голосового взаимодействия с абонентами по телефону. Используется для:
Система состоит из 5 микросервисов в Docker Compose:
| Сервис | Стек | Порты | Назначение |
|---|---|---|---|
| app | Python 3.11, asyncio | 9092, 9093 | Ядро: AudioSocket → STT → AI → TTS |
| admin-api | Python 3.11, FastAPI | 8000 | REST API управления звонками и очередями |
| admin-frontend | React 18, Vite | 18501 | Веб-админка для операторов |
| ws-tunnel | Python 3.11, websockets | 9094, 9095 | Туннелирование AudioSocket через WebSocket (для удалённого Asterisk) |
| asterisk | Asterisk 21+ | 5060, 9092 | SIP-коммутатор, ARI, MixMonitor |
[Абонент] ──SIP/RTP──► [Asterisk] ──AudioSocket──► [app]
│
├──gRPC──► [STT 82.202.197.147:50051]
├──WS────► [AI Dialog 176.109.82.96:3000]
└──TTS───► обратно в Asterisk
[Operator UI] ──HTTP──► [admin-frontend] ──REST──► [admin-api] ──ARI──► [Asterisk]
│
└──SQL──► [PostgreSQL 90.156.150.208:5433]
[Записи .wav] ──► S3 storage.sologpt.ru/voice-api
[ERROR логи] ──► Telegram alerts
POST /api/calls/external в admin-api с параметрами: номер, голос, промпт, первое сообщениеadmin-api шлёт config в app (порт 9093), сохраняется по call_uuidapp:9092app принимает PCM 16-bit 8kHz чанками 20msapp отправляет first_message в TTS, аудио идёт абонентуfinish_reason=hangup, таймауту неактивности или hangup абонента.wav (MixMonitor) → S3, dialog_history → PostgreSQL, callback в voice-prompt, скоринг номера в CarouselBackend:
Frontend:
Инфра:
storage.sologpt.ru)| Сервис | Endpoint | Роль |
|---|---|---|
| AI Dialog | ws://176.109.82.96:3000/ws/dialog |
Диалоговая модель + TTS |
| STT | 82.202.197.147:50051 (gRPC) |
Распознавание речи (ru-RU) |
| PostgreSQL | 90.156.150.208:5433 |
CDR, dialog_history, конфигурации |
| S3 | storage.sologpt.ru/voice-api |
Хранилище записей разговоров |
| MTS Carousel/Exolve | OAuth API | Получение/ротация исходящих A-номеров, скоринг |
| Telegram | Bot API | Алерты ERROR+ логов |
| voice-prompt | https://sologpt.ru/voice-prompt |
Callback с результатами звонков |
app/ — ядро обработки звонковapp/src/session/manager.py — VoiceAISession, оркестрация всего жизненного циклаapp/src/session/manager_parts/flows/ — фазы диалога (amd_flow, assistant_flow, barge_in, user_interjections_flow)app/src/session/clients/ai_client.py — WebSocket клиент AI Dialogapp/src/session/clients/stt_client.py — gRPC клиент STTapp/src/session/media/audio_receiver.py / audio_sender.py — приём/передача аудио в Asteriskapp/src/services/call/recording_uploader.py — загрузка записей в S3app/src/services/call/carousel_client.py — интеграция с MTS Carouselapp/src/runtime/multiprocess.py — multi-worker архитектураapp/src/config.py — конфигурация (AudioSocket, STT, AI, BargeIn)admin-api/ — REST APIadmin-api/src/api/admin_api.py — FastAPI appadmin-api/src/api/calls/orchestrator.py — оркестрация звонков (регистрация, ARI вызов)admin-api/src/api/routes/calls/external.py — POST /api/calls/externaladmin-api/src/services/call_queue_service.py — очередь звонков с leader electionadmin-api/src/services/asterisk_pjsip.py — управление PJSIP-конфигомadmin-api/src/db/models/ — SQLAlchemy моделиadmin-frontend/ — веб-админкаsrc/components/MakeCall.jsx — форма исходящего звонкаsrc/components/TelephonyManagement.jsx — управление SIP-trunkssrc/components/AmdManagement.jsx — настройка AMDws-tunnel/tunnel.py — TCP 9095 ↔ WebSocket 9094 для проксирования AudioSocketasterisk/asterisk/config/ — pjsip.conf, extensions.conf, audiosocket.conf, ari.confdocs/ — внутренняя документация0-full-scheme.md — полная схема управления номерами1-spam-scoring.md — алгоритм спам-скоринга2-number-carousel.md — интеграция с Carousel3-number-inventory.md — статусы номеров (ACTIVE/DEGRADE/REST)4-number-warmup.md — прогрев номеровanswering-machine-detection.md — техника AMDbyo-sip-trunks.md — собственные SIP-магистралиrkn-compliance.md — соответствие требованиям РКН.gitlab-ci.yml)main$PROD_HOST, $PROD_USER, $PROD_PATH = /var/www/telephony)git fetch && git reset --hard origin/main && git clean -fdrequirements.txt, Dockerfile, docker-compose*.yml, admin-frontend/package.json → docker compose up -d --builddocker compose up -d --force-recreate⚠️ Важно: не нужно вручную пуллить или рестартить контейнеры на проде после push — всё происходит автоматически.
PROD_SSH_PRIVATE_KEY — приватный SSH-ключPROD_HOST, PROD_USER, PROD_PATH — координаты сервераgit clone https://gitlab.assistantsolo.com/solo-backend/sip-voice.git
cd sip-voice
cp .env.example .env # отредактировать при необходимости
docker compose up -d
docker compose ps
docker compose logs -f app
Endpoints для проверки:
http://localhost:8000/api/system/info — admin-apihttp://localhost:9093/health — voice-ai apphttp://localhost:18501 — admin frontendТестовый исходящий звонок:
curl -X POST http://localhost:8000/api/calls/external \
-H "Content-Type: application/json" \
-d '{
"phone_number": "79991234567",
"voice_id": "Dh1qCTB0v3Iq0orIcmsp",
"prompt_text": "Ты вежливый помощник компании.",
"first_message": "Здравствуйте!"
}'
APP_MULTIPROCESS_ENABLED=true) — несколько worker-процессов в app9092 + N * WORKER_PORT_STEP)TARGET_CONCURRENT_CALLS, MAX_ACTIVE_SESSIONS_PER_WORKER, WORKER_REPLICAS_MAX — лимитыrestart: alwaysshared/telegram_handler.pylogs/YYYY/MM/DD/<service>-HH.log, ротация старше 10 дней через cron /etc/cron.d/telephony-log-cleanup.cron