概述
整体架构
RustPBX 采用分体式架构。
职责分离:
- RustPBX:负责音频处理、协议通信, TTS、ASR 等服务集成
- 客户端:负责业务逻辑、AI 交互、流程控制
客户端通过 WebSocket 与服务端连接, 并通过命令/事件机制和服务端交互。
- 客户端 → RustPBX:发送命令(Command)控制通话
- 示例:拨打电话、播放 TTS、挂断通话
- RustPBX → 客户端:推送事件(Event)状态通知
- 示例:语音识别结果、通话状态变化
概念
会话
会话(Session)代表一次完整的语音通话过程,分为呼入(接听来电)和呼出(发起呼叫)两种场景。
会话通过 Session ID 标识。默认由服务端自动生成 UUID,也可以在连接 RustPBX 时自定义。
Track
RustPBX 有多种 Track,主要包括:
- SIP/WebRTC Track:负责媒体传输。
- TTS/Play Track: 负责播放音频流到 SIP/WebRTC Track。
- Media Pass: 接管音频流处理。
每个 Track 的开始和结束都分别会触发 Track Start 和 Track End事件。
连接 RustPBX
客户端和服务端通过 WebSocket 连接, 并通过路径区分不同的通话类型。详细参数参见 连接 RustPBX。
示例ws://localhost:8080/call/sip?id=session123&dump=true:
- 使用 SIP 通话
- 设置 sessionId 为
session123 - 启用 dump
通话建立
通话分为呼入(接听来电)和呼出(发起呼叫)两种场景。在接通之后,可以通过 Refer 命令转接,实现 AI 转人工。
呼入和呼出的参数 CallOption 大部分都相同,除了设置被叫以为,主要用来配置 TTS、ASR、VAD 和 录音功能等功能。
呼出
通过发送 Invite 命令发起呼叫, 支持 SIP 和 WebRTC 两种协议,详见 通话控制。
- SIP 呼叫需要在
CallOption中设置主叫caller被叫calleeSIP 地址 - WebRTC 呼叫需要设置 SDP Offer
当呼叫成功会收到 Answer 事件, 否则会收到 Reject 事件。
SIP 呼叫流程:
呼入
接听呼入有如下几个步骤:
- 配置 Webhook 接收呼入通知
- 有来电时,RustPBX 会向配置的 WebHook 地址发送请求, 请求中包含
dialogId, 用于标识来电。 - 连接 RustPBX 设置
id = dialogId,然后发送Accept命令接听, 或者使用Reject命令拒绝。
接听/拒绝流程:
转接
在通话中使用 Refer 命令可以将通话转接到另一个 SIP 地址,可用于"转人工"场景。流程:
- 发送
Refer命令 - RustPBX 呼叫转接目标
- 目标接听后,RustPBX 转发两端音频
详见:通话控制
音频处理
播放 (Play/TTS)
通过 Play 命令播放音频文件,TTS 命令将文本转换成语音播放。
TTS 和 Play 命令会创建对应的 Track。
和其他 Track 一样,TTS Track 和 Play Track 的开始和结束都分别会触发 Track Start 和 Track End事件。
如果 TTS/Play 命令中包含了 playId 参数,则对应的 TrackEnd 事件中会包含该 playId,用于获取播放完毕通知。
-
Play 命令支持 http 和 https 地址,支持 wav 和 mp3 两种格式。
-
TTS 支持阿里云、腾讯云、Deepgram 和 VoiceApi 四种供应商,支持流式和非流式两种 API,支持 base64 编码音频。
详见:TTS/Play
自动语音识别 (ASR)
在通话建立的命令 Invite/Accept/Refer 的 CallOption 中配置 ASR 功能。
可以实时将语音转换为文字,通过事件通知识别结果。
- AsrDelta: 中间识别结果,内容可能会变动。
- AsrFinal: 最终识别结果,内容稳定。
事件中包含识别的文本结果,以及开始和结束时间。
支持腾讯云、阿里云、Deepgram 和 VoiceApi 四种供应商。
语音活动检测 (VAD)
语音活动检测同样在 CallOption 中配置。
支持 webrtc、silero 和 ten 三种事件。
当有语音输入时, 会触发 Speaking 事件,或一段事件没有语音输入时, 会触发 Silence 事件。
降噪
降噪功能在 CallOption 中的 denoise 字段配置是否开启,默认关闭。采用 RNNoise 算法实现。
录音
录音功能在 CallOption 中的 recorder 字段配置。支持 wav、mp3、ogg 和 flac 四种格式,默认关闭。
录音文件文件夹及格式,在 RustPBX 的配置文件中设置:
recorder_path = "/tmp/recorders"
recorder_format = "wav"
文件名默认为 session_id, 也可以在 recorderFile 字段中自定义。
Media Pass
除 TTS + ASR 外,还可以通过 Media Pass 将音频处理完全交给外部系统, 用于对接端到端大模型。
和 TTS 和 Play 一样, Media Pass 也会创建对应的 Track。不同的是 Media Pass 的音频转发是双向的。
- 从电话发送的语音将转发到 WebSocket 服务器
- 从 WebSocket 服务器接收到的语音将转发到电话
下一步
📄️ WebSocket API
WebSocket API 规范
📄️ RustPBX Go SDK
RustPBX Go SDK 规范