跳到主要内容

概述

整体架构

RustPBX 采用分体式架构

职责分离:

  • RustPBX:负责音频处理、协议通信, TTS、ASR 等服务集成
  • 客户端:负责业务逻辑、AI 交互、流程控制
RustPBX
RustPBX
UserAgent
UserAgent
媒体引擎
媒体引擎
TTS
TTS
ASR
ASR
VAD
VAD
电话
电话
网页
网页
LLM
LLM
SDK
SDK
WebRTC
WebRTC
SIP
SIP
Event
Event
Command
Command
WebSocket
WebSocket
AI Agent
AI Agent
Text is not SVG - cannot display

客户端通过 WebSocket 与服务端连接, 并通过命令/事件机制和服务端交互。

  • 客户端 → RustPBX:发送命令(Command)控制通话
    • 示例:拨打电话、播放 TTS、挂断通话
  • RustPBX → 客户端:推送事件(Event)状态通知
    • 示例:语音识别结果、通话状态变化
RustPBX
RustPBX
UserAgent
UserAgent
语音
语音
电话
电话
SDK
SDK
媒体引擎
媒体引擎
TTS 命令
TTS 命令
ASR 事件

ASR 事件
LLM
LLM
Agent
Agent
Text is not SVG - cannot display

概念

会话

会话(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 被叫callee SIP 地址
  • WebRTC 呼叫需要设置 SDP Offer

当呼叫成功会收到 Answer 事件, 否则会收到 Reject 事件。

SIP 呼叫流程:

1: Invite
1: Invite
客户端
客户端
2: INVITE
2: INVITE
RustPBX
RustPBX
电话
电话
3: 200 OK
3: 200 OK
4. Answer
4. Answer
5. ACK
5. ACK
Text is not SVG - cannot display

呼入

接听呼入有如下几个步骤:

  1. 配置 Webhook 接收呼入通知
  2. 有来电时,RustPBX 会向配置的 WebHook 地址发送请求, 请求中包含 dialogId, 用于标识来电。
  3. 连接 RustPBX 设置 id = dialogId,然后发送 Accept 命令接听, 或者使用 Reject 命令拒绝。

接听/拒绝流程:

2: WebHook
http://localhost:8090/webhook?dialogId: 666
2: WebHook...
客户端
客户端
1: INVITE
1: INVITE
RustPBX
RustPBX
电话
电话
5: 200 OK/603 Decline
5: 200 OK/603 Decline
3. 连接
ws://localhost:8080/call/sip?id=666
3. 连接...
5: ACK
5: ACK
4. Accept/Reject
4. Accept/Reject
Text is not SVG - cannot display

转接

在通话中使用 Refer 命令可以将通话转接到另一个 SIP 地址,可用于"转人工"场景。流程:

  1. 发送 Refer 命令
  2. RustPBX 呼叫转接目标
  3. 目标接听后,RustPBX 转发两端音频
2. Refer
2. Refer
客户端
客户端
1. 通话
1. 通话
RustPBX
RustPBX
电话
电话
4. 200 OK
4. 200 OK
人工
人工
3. Invite
3. Invite
转发
转发
5. 通话
5. 通话
Text is not SVG - cannot display
通话控制

详见:通话控制

音频处理

播放 (Play/TTS)

通过 Play 命令播放音频文件,TTS 命令将文本转换成语音播放。

TTSPlay 命令会创建对应的 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 Track
TTS/Play Track
RTP. 连接
RTP. 连接
RTP Track
RTP Track
电话
电话
语音流
语音流
外部服务
外部服务
Text is not SVG - cannot display
TTS/Play

详见:TTS/Play

自动语音识别 (ASR)

在通话建立的命令 Invite/Accept/ReferCallOption 中配置 ASR 功能。

可以实时将语音转换为文字,通过事件通知识别结果。

  • AsrDelta: 中间识别结果,内容可能会变动。
  • AsrFinal: 最终识别结果,内容稳定。

事件中包含识别的文本结果,以及开始和结束时间。

支持腾讯云、阿里云、Deepgram 和 VoiceApi 四种供应商。

AsrFinal
text: 你好
AsrFinal...
sdk
sdk
你好(语音)
你好(语音)
RustPBX
RustPBX
电话
电话
ASR 提供商
ASR 提供商
你好(文本)
你好(文本)
你好(语音)
你好(语音)
通话
通话
Text is not SVG - cannot display

语音活动检测 (VAD)

语音活动检测同样在 CallOption 中配置。

支持 webrtc、silero 和 ten 三种事件。

当有语音输入时, 会触发 Speaking 事件,或一段事件没有语音输入时, 会触发 Silence 事件。

降噪

降噪功能在 CallOption 中的 denoise 字段配置是否开启,默认关闭。采用 RNNoise 算法实现。

录音

录音功能在 CallOption 中的 recorder 字段配置。支持 wav、mp3、ogg 和 flac 四种格式,默认关闭。

录音文件文件夹及格式,在 RustPBX 的配置文件中设置:

config.toml
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 服务器接收到的语音将转发到电话
转发
转发
Media Pass Track
Media Pass Track
RTP. 连接
RTP. 连接
RTP Track
RTP Track
电话
电话
语音流
语音流
WebSocket 服务
WebSocket 服务
Text is not SVG - cannot display

下一步