A Docker container that bridges phone calls to ChatGPT's voice interface. Call a phone number, and ChatGPT answers.
┌─────────────────────────────────────────────────────────────────┐
│ Docker Container │
│ │
│ ┌──────────────┐ ┌─────────────────┐ ┌────────────────┐ │
│ │ PulseAudio │───▶│ Baresip SIP │───▶│ /alloc/ │ │
│ │ (audio hub) │ │ (phone) │ │ call_active │ │
│ └──────────────┘ └─────────────────┘ └───────┬────────┘ │
│ │ │ │
│ │ ┌─────────────────┐ │ │
│ └───────────▶│ Chromium + │◀───────────┘ │
│ │ KasmVNC │ │
│ │ (browser) │ │
│ └────────┬────────┘ │
│ │ CDP:9229 │
│ ┌────────▼────────┐ │
│ │ Playwright │ │
│ │ (automation) │ │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
- PulseAudio - Virtual audio routing between browser and SIP client
- Chromium + KasmVNC - Browser for ChatGPT with web-based VNC access
- Baresip - SIP client for handling phone calls
- Playwright Bot - Automation that clicks ChatGPT voice buttons on call events
-
Copy the example environment file:
cp .env.example .env
-
Edit
.envwith your SIP credentials:SIP_USER=your_sip_username SIP_PASS=your_sip_password SIP_SERVER=callcentric.com
-
Build and run:
docker compose up -d
-
Access the web interface at
http://localhost:3000 -
Log into ChatGPT in the browser
-
Call your SIP number - ChatGPT will answer!
| Variable | Description |
|---|---|
SIP_USER |
SIP account username |
SIP_PASS |
SIP account password |
SIP_SERVER |
SIP server address (e.g., callcentric.com) |
| Variable | Default | Description |
|---|---|---|
SIP_TRANSPORT |
tcp |
SIP transport protocol (tcp, udp, tls) |
SIP_OUTBOUND |
- | Outbound proxy (e.g., sip:callcentric.com;transport=tcp) |
SIP_REGINT |
600 |
Registration interval in seconds |
PUID |
1000 |
User ID for file permissions |
PGID |
1000 |
Group ID for file permissions |
TZ |
Etc/UTC |
Container timezone |
CUSTOM_USER |
- | KasmVNC web username |
PASSWORD |
- | KasmVNC web password |
| Port | Protocol | Description |
|---|---|---|
| 3000 | HTTP | KasmVNC web interface |
| 3001 | HTTPS | KasmVNC web interface (SSL) |
| 5060 | UDP/TCP | SIP signaling |
| 9229 | TCP | Chrome debugging (optional) |
| Path | Description |
|---|---|
/config |
Persistent Chrome profile (cookies, login sessions) |
If not using docker compose:
docker run -d \
--name chatgpt-voice-bridge \
--shm-size=1g \
--security-opt seccomp=unconfined \
--cap-add NET_ADMIN \
--cap-add NET_RAW \
-p 3000:3000 \
-p 3001:3001 \
-p 5060:5060/udp \
-p 5060:5060/tcp \
-v ./config:/config \
-e SIP_USER=your_username \
-e SIP_PASS=your_password \
-e SIP_SERVER=callcentric.com \
-e SIP_TRANSPORT=tcp \
-e SIP_OUTBOUND="sip:callcentric.com;transport=tcp" \
chatgpt-voice-bridgeThe container includes health checks for all components:
- PulseAudio daemon and virtual sinks
- Chrome debugging port
- Baresip process
- Automation bot process
- KasmVNC web interface
Check health status:
docker inspect --format='{{.State.Health.Status}}' chatgpt-voice-bridgedocker compose logs -f# Baresip logs
docker exec chatgpt-voice-bridge cat /config/log/baresip/current
# Automation logs
docker exec chatgpt-voice-bridge cat /config/log/automation/currentdocker exec chatgpt-voice-bridge pactl list short sinksLook for "registered" in baresip logs.
- Ensure you're logged into ChatGPT in the browser
- The ChatGPT UI may have changed - check the button selectors in
automation/bot.py
- Incoming Call: When someone calls your SIP number, Baresip auto-answers
- Call Detection: Baresip creates
/alloc/call_activefile - Voice Activation: The Playwright bot detects the file and clicks "Start Voice" in ChatGPT
- Audio Routing:
- Caller audio → Baresip → VirtualMic sink → Chrome (as microphone)
- ChatGPT audio → VirtualSpeaker sink → Baresip → Caller
- Call End: When the call terminates, the bot clicks "End Voice"
MIT