Documentation
¶
Overview ¶
SIP RTP media server — runs separately from the signaling server.
Exposes an HTTP control API; the signaling server allocates legs on INVITE and activates them on ACK.
Usage:
# Terminal A: RTP media plane RTP_MEDIA_IP=192.168.28.128 RTP_CONTROL_PORT=8090 go run ./examples/sip-rtp-server # Terminal B: SIP signaling (RTP nodes register here) SIP_CONTROL_PORT=8080 go run ./examples/sip-signaling-server # Terminal C: second RTP node on the same host (must use a different control port) RTP_NODE_ID=rtp-b RTP_CONTROL_PORT=8091 RTP_MEDIA_IP=192.168.28.129 \ SIP_REGISTRY_URL=http://192.168.28.128:8080 go run ./examples/sip-rtp-server
On one machine, each RTP instance needs a unique RTP_CONTROL_PORT (8090, 8091, …) or set RTP_CONTROL_PORT=0 to let the OS pick a free port.
Env:
- SIP_REGISTRY_URL signaling registry base URL (required for multi-node)
- RTP_NODE_ID node id (default rtp-<bound-port>)
- RTP_CONTROL_PUBLIC_URL control URL advertised to signaling (default http://<media_ip>:<port>)
- RTP_UDP_HOST UDP bind host (default 0.0.0.0)
- RTP_MEDIA_IP IP advertised in SDP c= line (auto-detect if empty)
- RTP_CONTROL_HOST HTTP bind host (default 0.0.0.0)
- RTP_CONTROL_PORT HTTP control port (default 8090; 0 = auto)
- RTP_MAX_LEGS max concurrent legs (0 = unlimited)
Realtime AI (optional — replaces silence demo when configured):
export REALTIME_CONFIG_JSON='{"provider":"aliyun_omni","api_key":"sk-...","model":"qwen3.5-omni-flash-realtime-2026-03-15"}'
export REALTIME_VOICE=Cherry
Volcengine:
export REALTIME_CONFIG_JSON='{"provider":"volcengine_dialogue","appId":"...","accessKey":"..."}'
Click to show internal directories.
Click to hide internal directories.