概述

整体架构

RustPBX 采用分体式架构。

职责分离:

  • RustPBX:负责音频处理、协议通信, TTS、ASR 等服务集成
  • 客户端:负责业务逻辑、AI 交互、流程控制
Arch

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

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

概念

会话

会话(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 呼叫流程:

InviteFlow

呼入

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

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

接听/拒绝流程:

AcceptFlow

转接

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

  1. 发送 Refer 命令
  2. RustPBX 呼叫转接目标
  3. 目标接听后,RustPBX 转发两端音频
ReferFlow

通话控制

详见:通话控制

音频处理

播放 (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 编码音频。

TTSTrack

TTS/Play

详见:TTS/Play

自动语音识别 (ASR)

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

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

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

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

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

ASRFlow

语音活动检测 (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 服务器接收到的语音将转发到电话
MediaPassFlow

下一步