Install PrismVox
PrismVox runs independently of Prism. The default stack uses ElevenLabs for recognition and synthesis, a model API for conversation, and Asterisk for SIP. It installs no local STT or TTS engine.
For telephony, PrismVox is a single-line SIP Centrex endpoint, like a Yealink or Grandstream IP phone. It registers a line on your operator’s network through a publicly reachable SBC that handles NAT traversal. PrismVox itself does not need a public Internet-facing address.
1. Gather the prerequisites
- Git, Docker and Docker Compose; no GPU is needed if model and speech inference run elsewhere.
- A SIP Centrex line from your operator: registrar/SBC address, signaling IPs, SIP domain, authentication username/password and supported transport. Use the line settings supplied for an IP phone.
- An OpenAI-compatible model endpoint supporting streaming and structured tool calls. Text-only answers cannot execute a transfer or hang up.
- An ElevenLabs key with speech-to-text/text-to-speech access and an available voice. Models Read and Voices Read enable catalogue loading. Provider usage is billed separately.
2. Download and protect configuration
git clone https://github.com/blazux/PrismVox.git
cd PrismVox
cp .env.example .env
chmod 600 .env
openssl rand -hex 24Generate three distinct random values and replace ARI_PASS, DB_PASS and UI_PASSWORD. Keep COMPOSE_PROJECT_NAME=prismvox and COMPOSE_FILE=docker-compose.yml for a new standard installation. Never publish your completed .env.
3. Configure the SIP line and model
In .env, replace these example values with your operator’s line settings and fill in SIP_PASSWORD. SIP_DOMAIN is the SIP service domain, which can differ from the registrar hostname. SIP_REGISTRAR_MATCH identifies the operator’s inbound signaling sources; leave it equal to the registrar IP unless your operator supplies a different source.
SIP_REGISTRAR=sbc.example.com
SIP_REGISTRAR_IP=192.0.2.10
SIP_REGISTRAR_MATCH=192.0.2.10
SIP_DOMAIN=example.com
SIP_USERNAME=your-line-login
SIP_PASSWORD=
SIP_TRANSPORT_MODE=tls
SIP_TLS_PORT=5061
SIP_TLS_VERIFY_SERVER=yesChoose the transport your operator supports. The tls profile uses TLS signaling with SDES-SRTP audio; udp uses unencrypted SIP/RTP and SIP_UDP_PORT (5060 by default). These settings initialize the line on first startup. Later changes are made in the SIP form, then applied to Asterisk.
SIP fields and applying changes →Replace the SIP_* example values with the provider’s real account details. Set OPENAI_BASE_URL to the reachable /v1 API root and OPENAI_MODEL to the exact served ID. Add OPENAI_API_KEY only if the server requires it. These fields do not deploy the model server.
OPENAI_BASE_URL=http://host.docker.internal:4000/v1
OPENAI_MODEL=assistant
OPENAI_API_KEY=
STT_PROVIDER=elevenlabs
TTS_PROVIDER=elevenlabs
UI_BIND=127.0.0.1This example assumes a model gateway on the Docker host, reachable on port 4000 and serving assistant. Replace both values for your own server. host.docker.internal is mapped to the host gateway on Linux; the server must listen on a reachable interface.
4. Build and start
docker compose up -d --build
docker compose ps
docker compose logs --tail=50 agentOpen http://localhost:7860 and sign in with UI_USER / UI_PASSWORD. The alternate https://localhost:7861 uses a self-signed certificate. For remote access, use a trusted HTTPS proxy and retain console authentication. The default loopback bind is not remotely reachable.
The first startup downloads the CPU embedding model. Wait for the database and embeddings health checks before diagnosing the call agent. The base stack has five services: asterisk, agent, ui, embeddings and db.
5. Save the speech configuration
Open Configuration → Agent and expand Speech providers. Select ElevenLabs for recognition and synthesis, enter the key, click Connect, then choose the recognition model, synthesis model and voice. Save voice settings persists them. A blank key field preserves a saved key. Changes apply to new calls.
Alternatively seed ELEVENLABS_API_KEY and ELEVENLABS_VOICE_ID in .env before startup. The defaults are scribe_v2_realtime and eleven_flash_v2_5, with French speech. Adapt language, greeting, persona and fixed phrases together for another language.
Validate your first call →Full PrismVox environment reference →