FreeSwitch简介
FreeSwitch是一个开源的电话交换平台。官方给它的定义是---世界上第一个跨平台的、伸缩性极好的、免费的、多协议的电话软交换平台。
你可以把它想象成一个"超级电话总机"。它能让电脑、手机、普通电话等各种设备互相打电话,还能实现很多高级的电话功能。它的设计目标是提供一个灵活、强大的通信框架,能够处理各种形式的实时媒体通信,包括语音、视频、文字等。
官方文档:FreeSWITCH Explained | FreeSWITCH Documentation
衍生项目RTS官方文档:RTS 文档
一、FreeSwitch术语介绍
SIP协议(Session Initiation Protocol)
SIP(会话初始协议)是用于建立、修改和终止多媒体会话(如语音、视频通话)的信令协议,广泛应用于VoIP(网络电话)和即时通讯。它是互联网工程任务组(IETF)制定的标准(RFC 3261)。
核心功能:
-
会话管理:发起、终止通话,邀请参与者加入会议。
-
用户定位:通过SIP地址(如
sip:
user@example.com
)找到对方。 -
协议兼容性:可与RTP(传输语音/视频)、SDP(描述会话参数)等协议协同工作。
优势:
-
灵活性:支持点对点或通过代理服务器通信。
-
可扩展性:适应一对一通话、会议、即时消息等场景。
-
标准化:兼容不同厂商的设备和服务。
工作流程示例:
-
INVATE:发起通话
-
100 Tring:临时响应(已经收到,正在处理)
-
183 Session Progress:表示会话正在建立
-
200 OK:被叫方同意接听
-
ACK:呼叫方同意接听
分机号 (Extension)
分机号是FreeSWITCH内部用于标识终端用户的基本单位,通常由数字组成(如1000-1019是默认配置的分机号范围)。分机号不仅用于内部通信,还可以通过网关与外部电话系统对接,类似于传统 PBX 系统中的内线号码。
分机号的配置存储在 directory/default/
目录下的 XML 文件中,例如 1000.xml
。
-
功能:每个分机代表一个终端用户或设备
-
配置:在
directory/default/
目录下XML文件中定义 -
认证:包含用户名、密码、SIP域等信息
-
类型:可以是SIP话机、软电话、模拟电话等
<extension name="MyExtension">
<condition field="destination_number" expression="1234">
<action application="answer"/>
<action application="playback" data="hello-world.wav"/>
<action application="hangup"/>
</condition>
</extension>
分机号和SIP用户的关系
-
每个分机号通常对应一个SIP用户账号(如分机1001,对应SIP账号1001)。
-
用户用SIP账号(即分机号)注册到SIP服务器后,可以通过分机号进行呼叫和接听。
-
分机号是业务层面的标识,SIP用户是协议层面的账号,两者一般绑定在一起
B2BUA(Back-to-Back User Agent)
B2BUA(Back-to-Back User Agent,背靠背用户代理)是FreeSwitch的核心呼叫控制模型。
-
B2BUA 是一种 SIP 呼叫代理模型,位于两个通话端之间,将一次通话拆分为两个独立的 SIP 会话。
-
B2BUA 既充当主叫(User Agent Client,UAC),也充当被叫(User Agent Server,UAS)。
-
通话双方的信令和媒体都经过 B2BUA,B2BUA 可以完全控制、修改、转发信令和媒体流。
在 FreeSWITCH 中,每次呼叫建立时,B2BUA 会创建两条通道(Channel):
-
A腿(A-leg):主叫通道,通常是呼叫发起方。
-
B腿(B-leg):被叫通道,通常是被呼叫方。
这两条腿由 FreeSWITCH 内部桥接(bridge),但它们是完全独立的通道,可以分别控制、挂断、转接、录音等。
例如,A腿挂断时,B腿可以继续存在(如转接、保持等),反之亦然。
桥接(bridge)
桥接(Bridge)在 FreeSWITCH 和 SIP 通信中,指的是把两个通话通道(a-leg 和 b-leg)连接起来,使主叫和被叫能够直接通话。
简单来说,桥接就是“把两个人的语音流连通”,让双方可以实时对讲。
-
普通点对点通话:分机呼叫分机、分机外呼,会桥接 a-leg和 b-leg。
-
单腿通话:比如只播放语音、IVR 菜单、自动语音通知等场景,只有 a-leg,没有 b-leg,不需要桥接。
-
会议、监听、录音等特殊场景:可能有多个“腿”,不一定是简单的 a-leg 和 b-leg。
拨号计划(Dialplan)
FreeSWITCH拨号计划(Dialplan)定义呼叫路由规则的核心组件,相当于电话系统的"路由表"。决定了电话呼叫如何被分析、处理和路由到不同目标,当用户拨号时,系统会根据拨号计划对号码进行分析,进而决定下一步的路由动作。
匹配流程:
呼叫进入 --> 匹配Context --> 按顺序检查Extension --> 执行第一个匹配的Condition
拨号计划的作用:
-
呼叫路由:根据被叫号码、主叫号码等条件将呼叫路由到不同目标。
-
流程控制:定义通话过程中的各种行为和流程。
-
功能实现:实现呼叫转移、语音播报、IVR、录音等通信功能。
案例:
简单呼叫路由:匹配特定号码并播放音频
<extension name="MyExtension">
<condition field="destination_number" expression="1234">
<action application="answer"/>
<action application="playback" data="hello-world.wav"/>
<action application="hangup"/>
</condition>
</extension>
号码前缀添加:为外呼号码添加前缀
<extension name="forward_call">
<condition field="destination_number" expression="^(\d{11})$">
<action application="set" data="destination_number=88${destination_number}"/>
<action application="bridge" data="sofia/gateway/gw4/${destination_number}"/>
</condition>
</extension>
电话录音:实现单腿录音功能
<extension name="record">
<condition field="destination_number" expression="1237">
<action application="answer"/>
<action application="record" data="/tmp/1.wav"/>
</condition>
</extension>
运营商网关对接:通过网关外呼
<extension name="call_out">
<condition field="destination_number" expression="([0-1][0-9]{10,11})">
<action application="bridge" data="sofia/gateway/outbound/$1"/>
</condition>
</extension>
Sofia模块(mod_sofia)
Sofia 是 FreeSWITCH 的核心模块,负责处理 SIP 协议和 RTP 媒体流。它是 FreeSWITCH 中最重要的模块之一,支持 SIP 注册、呼叫建立、媒体协商等功能
-
功能:
-
支持 SIP 协议栈(RFC 3261)。
-
管理 SIP 用户代理(UA)、代理服务器和网关。
-
处理 SIP 信令和媒体流(如音频、视频)。
-
-
配置文件:
-
sofia.conf.xml
:定义 SIP 配置。 -
sip_profiles/
:包含 SIP 配置文件的目录,如internal.xml
和external.xml
-
Internal 和 External Profiles
默认端口:5060
FreeSWITCH 通过 internal
和 external
两个 SIP Profile 区分内网和外网通信:
Internal Profile(内部 Profile):
用途:专为内网或受信任的网络环境设计,用于处理内部用户(如分机、软电话)的注册和呼叫。
典型配置:
-
监听内网 IP 和端口(如 192.168.1.100:5060)。
-
启用宽松的安全策略(如简化认证),因为用户被视为可信。
-
绑定内部分机号和拨号计划(如 user_context)。
-
适用场景:企业内部通话、分机互拨、内部会议等。
External Profile(外部 Profile):
默认端口:5080
用途:面向公网或不受信任的网络,用于连接外部网关(如运营商、SIP 中继)或处理来自互联网的呼叫。
典型配置:
-
监听外网 IP 或 NAT 后的地址(如 203.0.1.1:5080)。
-
严格的安全措施(如强制认证、ACL 访问控制)。
-
绑定外部网关配置(如 external_gateway)和公共拨号计划(如 public)。
-
适用场景:外呼至 PSTN、接收外部来电、对接 ITSP(互联网电话服务提供商)。
特性 | Internal Profile | External Profile |
网络环境 | 内网(受信任) | 外网(不受信任) |
默认端口 | 5060 | 5080 |
安全策略 | 宽松(如简化认证) | 严格(如 ACL、网关认证) |
主要功能 | 内部分机注册与互拨 | 外呼网关对接、接收外部呼叫 |
配置文件路径 | conf/sip_profiles/internal.xml | conf/sip_profiles/external.xml |
域名绑定 | 通常绑定内网域名(如 freeswitch.local) | 绑定公网域名或 IP |
网关(Gateway)
网关在 FreeSWITCH 中是指连接到外部电话网络(如PSTN、SIP提供商、IMS网络等)的接口。它允许FreeSWITCH系统与外部电话系统进行通信。
网关配置文件:
网关配置通常位于 freeswitch/sip_profiles/external/
目录下,每个网关一个XML文件。
<include>
<gateway name="asterlink.com">
<!-- 账号用户名(必填) -->
<param name="username" value="cluecon"/>
<!-- 认证域(可选),通常与网关名相同 -->
<param name="realm" value="asterlink.com"/>
<!-- SIP From字段中的用户名(可选) -->
<param name="from-user" value="cluecon"/>
<!-- SIP From字段中的域名(可选) -->
<param name="from-domain" value="asterlink.com"/>
<!-- 账号密码(必填) -->
<param name="password" value="2007"/>
<!-- 入站呼叫的分机号(可选) -->
<param name="extension" value="cluecon"/>
<!-- 代理服务器地址(可选) -->
<param name="proxy" value="asterlink.com"/>
<!-- 注册时使用的代理服务器(可选) -->
<param name="register-proxy" value="mysbc.com"/>
<!-- 注册有效期(秒) -->
<param name="expire-seconds" value="60"/>
<!-- 是否注册到SIP服务器 -->
<param name="register" value="false"/>
<!-- 注册时使用的传输协议 -->
<param name="register-transport" value="udp"/>
<!-- 注册失败或超时后重试间隔(秒) -->
<param name="retry-seconds" value="30"/>
<!-- 是否在SIP From字段中使用主叫号码 -->
<param name="caller-id-in-from" value="false"/>
<!-- 在SIP Contact字段中附加的额外参数 -->
<param name="contact-params" value=""/>
<!-- 是否在SIP Contact字段中包含分机号 -->
<param name="extension-in-contact" value="true"/>
<!-- 发送SIP OPTIONS心跳包的间隔(秒) -->
<param name="ping" value="25"/>
<!-- 主叫号码类型,rpid表示使用Remote-Party-ID -->
<param name="cid-type" value="rpid"/>
<!-- 是否启用RFC5626(SIP Outbound扩展) -->
<param name="rfc-5626" value="true"/>
<!-- RFC5626注册ID -->
<param name="reg-id" value="1"/>
</gateway>
</include>
软电话
软电话是一种通过互联网实现实时通讯的虚拟电话,属于通信终端设备。其核心功能在于将语音转换为数据信号传输,无需专用硬件即可在计算机、手机或平板等设备上运行。
不同类型软电话的区别
mrcSIP、Zoiper 这类 独立 SIP 软电话 与 前端网页实现的软电话 在技术架构、功能特性和适用场景上有显著区别。以下是主要对比:
对比项 | mrcSIP / Zoiper 等独立软电话 | 前端网页软电话(如 WebRTC/SIP.js) |
运行环境 | 需安装独立客户端(Windows/macOS/Linux/iOS/Android) | 直接在浏览器运行(如 Chrome、Edge),无需安装 |
依赖技术 | 基于 SIP 协议,可能依赖本地库(如 PJSIP) | 基于 WebRTC + SIP.js,依赖浏览器 API |
注册方式 | 通过 SIP 账号(如 1000@freeswitch)注册到 FreeSWITCH | 通常使用 WebSocket连接 FreeSWITCH |
开发语言 | C++、Java、Objective-C 等 | JavaScript、HTML5、WebSocket |
集成方式 | 独立运行或嵌入第三方应用(如 CRM) | 通过 iframe 或 JS SDK 嵌入网页 |
上下文(Context)
在FreeSWITCH中,上下文(Context)是一个核心概念,它定义了呼叫路由的逻辑分组和隔离机制,是拨号计划(Dialplan)组织和管理的基础架构。
上下文是FreeSWITCH中用于隔离不同拨号规则的逻辑容器,每个上下文包含一组拨号规则(extensions),系统根据呼叫的来源或属性决定使用哪个上下文来匹配路由规则。
主要作用包括:
-
路由隔离:不同来源的呼叫可以使用不同的路由规则
-
安全隔离:限制特定用户只能访问特定上下文中的路由规则
-
逻辑分组:将相关功能的路由规则组织在一起
-
多租户支持:不同租户可以使用独立的上下文
上下文主要在以下配置文件中定义:
-
拨号计划文件:
conf/dialplan/default.xml
等 -
SIP Profile配置:
conf/sip_profiles/*.xml
<profile name="internal">
<!-- 主叫将路由到default context -->
<param name="context" value="default"/>
</profile>
注意点:
-
SIP Profile配置的上下文:为通过该Profile注册或发起的呼叫提供默认上下文
-
分机注册时的上下文:可以覆盖SIP Profile的默认上下文设置
-
SIP Profile本身:不受上下文约束,它是上下文规则的"提供者"而非"接受者"
域(Domain)
FreeSWITCH 中的“域(domain)”是指用于区分和管理不同用户、分机、呼叫路由等逻辑范围的标识,类似于 SIP 协议中的“域名”概念。详细说明如下:
基本概念 域(domain)通常对应一个公司、组织或业务系统的唯一标识,常见为 IP 地址或 FQDN(如 pbx.example.com)。在 SIP 协议中,用户的完整标识为 user@domain,如 1001@pbx.example.com。
作用与意义
-
用户隔离:不同域下的用户、分机、拨号计划等互相隔离,便于多租户(multi-tenant)部署。
-
呼叫路由:FreeSWITCH 根据域名决定呼叫的路由和处理逻辑,实现灵活的呼叫分发。
-
安全控制:可针对不同域设置独立的认证、权限、策略等,提升系统安全性。
-
配置管理:conf/directory/ 目录下,每个域有独立的用户/分机配置文件,便于分组管理。
配置方式
在 conf/directory/ 下创建以域名命名的目录或 XML 文件,定义该域下的用户、分机等信息。
在 SIP Profile(如 internal.xml)中配置 default_domain,指定默认域名。
呼叫时通过 user@domain 方式区分目标用户所属域。
典型应用场景
多公司共用一套 FreeSWITCH,每家公司一个独立域,实现资源隔离。
按业务线、部门划分域,便于权限和策略管理。
总结:
FreeSWITCH 的域(domain)是实现多租户、用户隔离、灵活路由和安全管理的核心机制,贯穿于用户注册、呼叫路由、配置管理等各个环节。
访问控制列表(ACL)
ACL(Access Control List,访问控制列表)是FreeSWITCH中用于控制网络访问权限的核心机制,它通过定义规则矩阵来决定哪些IP地址或网络实体可以访问特定资源。
ACL在FreeSWITCH中主要用于:
-
IP访问控制:限制特定IP地址或网段的访问权限
-
SIP鉴权:控制哪些IP可以注册或发起呼叫
-
安全防护:防止未授权访问和恶意攻击
-
NAT穿越:识别内网设备并协助完成NAT穿越
ACL的核心思想是"默认拒绝,显式允许",即除非明确允许,否则所有访问都将被拒绝。
ACL配置文件与结构,预设ACL规则
FreeSWITCH内置了几种预设ACL规则:
-
rfc1918.auto
:RFC1918定义的私有地址空间 -
nat.auto
:RFC1918地址空间排除本地LAN -
localnet.auto
:本地LAN的ACL -
loopback.auto
:本地回环地址ACL
<!-- 自定义一个 name -->
<list name="esl_access" default="deny">
<node type="allow" cidr="113.1.1.1/32"/>
<node type="allow" cidr="127.0.0.1/32"/>
</list>
ESL (Event Socket Library)
8021
ESL (Event Socket Library) 是 FreeSWITCH 提供的一个强大的接口,允许外部程序通过 TCP 套接字与 FreeSWITCH 核心进行交互。
ESL特性
-
基于 TCP 的客户端-服务器接口
-
支持同步和异步通信模式
-
提供对 FreeSWITCH 的实时控制和监控能力
-
支持多种编程语言绑定(Python, PHP, Java, C/C++等)
两种连接模式
Inbound (入站模式)
外部应用(如 Java 程序)作为客户端,主动连接 FreeSWITCH 的 ESL 服务端口(默认 8021),建立 TCP 连接后进行命令交互和事件监听。
应用场景:
-
需要外部程序主动控制 FreeSWITCH(如发起呼叫、挂断、监听事件等)。
-
适合做后台管理、监控、自动化控制等。
-
你的 Java 服务就是典型的 Inbound 模式。
优点:
-
易于部署和管理。
-
支持多客户端同时连接。
Outbound (出站模式)
FreeSWITCH 在呼叫流程中(如拨号计划中 socket 应用),主动作为客户端连接到外部应用(你的服务端),并将通话控制权交给外部应用。
应用场景:
-
需要对每个呼叫进行实时、细粒度的控制(如 IVR、机器人、外呼任务)。
-
适合做呼叫中心、自动语音应答、外呼机器人等。
-
外部应用需实现 socket 服务端,等待 FreeSWITCH 连接。
优点:
-
可以对单个通话进行全流程控制。
-
灵活实现复杂业务逻辑
总结:
需要全局管理、事件监听用 Inbound。需要对单个呼叫做复杂控制用 Outbound。
配置文件地址:conf/autoload_configs/event_socket.conf.xml
<configuration name="event_socket.conf" description="Socket Client">
<settings>
<!-- 不启用 NAT 自动端口映射, 一般服务器部署在公网或有固定端口映射时建议设为 false-->
<param name="nat-map" value="false"/>
<!-- 0.0.0.0 用于需要让多网卡或外部主机都能访问 ESL 服务的场景。如果只需要本地访问,可以用 127.0.0.1,更安全。-->
<param name="listen-ip" value="::"/>
<param name="listen-port" value="8021"/>
<!-- 默认密码,更改之后 linux使用命令 fs_cli 需要带上新密码,例:fs_cli -p 1234 -->
<param name="password" value="ClueCon"/>
<!-- inbound模式启用acl -->
<param name="apply-inbound-acl" value="esl_access"/>
<!-- 当端口绑定失败时,是否让 FreeSWITCH 直接停止启动,境建议开启-->
<param name="stop-on-bind-error" value="true"/>
</settings>
</configuration>
关于AB腿的区分
在 FreeSWITCH 中,A-leg 和 B-leg 的判定确实是约定俗成的逻辑概念,而非系统强制标记的字段。它们的区分主要依赖呼叫流程的设计、API/Dialplan 的操作顺序,或是事件日志的上下文。
场景一(直接路由):
终端A直接发起呼叫(a-leg)到FreeSwitch,FreeSwitch根据预设的拨号计划自动路由到终端B建立b-leg通话。这是最基础的直接路由呼叫流程。
场景二(桥接命令):
ESL客户端使用originate命令带bridge参数发起呼叫。FreeSwitch会先建立与终端A的a-leg连接,待A接通后再自动发起与终端B的b-leg连接,实现智能顺序桥接。
场景三(挂起转接):
ESL客户端先将终端A的呼叫挂起(park),待A应答后通过uuid_transfer命令将通话转接到终端B。这种方式允许在A接通后再决定路由目标。
场景四(双挂起桥接):
ESL客户端分别挂起终端A和B的呼叫,待两者就绪后通过uuid_bridge命令将两条独立的leg桥接在一起。这种双挂起方式适合需要精确控制桥接时机的场景。
二、目录结构
根目录结构
目录 | 说明 |
bin/ | 二进制文件目录,FreeSWITCH 可执行程序和工具所在目录,启动/停止服务都依赖这里。 |
conf/ | 核心配置文件目录,所有 SIP、拨号计划、模块等配置都在这里。 |
db/ | 数据库目录,存放内部数据库(如 SQLite),用于存储注册信息、计费等。 |
htdocs/ | Web文件目录,仅用于 Web 管理界面或静态网页,不影响核心功能。 |
lib/ | 库文件目录,FreeSWITCH 运行所需的动态库文件。 |
log/ | 日志目录,存放运行日志,排查问题必看。 |
mod/ | 模块目录,所有功能模块(如 mod_sofia、mod_conference 等)都在这里。 |
recordings/ | 录音目录,通话录音文件存放目录。 |
run/ | 运行时文件目录,存放运行时产生的临时文件(如 pid 文件)。 |
scripts/ | 脚本目录,存放自定义脚本(如 lua、js 等),实现自动化或业务逻辑。 |
sounds/ | 语音文件目录,系统语音提示、彩铃等音频文件目录。 |
storage/ | 存储目录,通用存储目录,可用于语音信箱、传真等。 |
配置文件目录结构conf/
目录/文件 | 说明 |
autoload_configs/ | 自动加载目录,包含各模块自动加载的配置文件目录 |
dialplan/ | 拨号计划配置目录,定义呼叫路由和逻辑 |
directory/ | 分机目录配置 |
sip_profiles/ | SIP 协议相关配置目录 |
vars.xml | 全局变量配置文件 |
ivr_menus/ | IVR(语音导航)菜单配置目录 |
jingle_profiles/ | Jingle 协议相关配置目录 |
mime.types | MIME 类型定义文件 |
freeswitch.xml | 主配置文件,包含全局和模块引用 |
... |
配置文件加载顺序:
1.vars.xml
→ 2. freeswitch.xml
→ 3. autoload_configs/*.conf.xml
→ 4. 其他按需加载的配置
关键配置文件:
conf/
├── autoload_configs/ # 模块自动加载配置
│ ├── acl.conf.xml # 访问控制列表(IP黑白名单)
│ ├── callcenter.conf.xml # 呼叫中心队列配置
│ ├── cdr_csv.conf.xml # CDR话单CSV格式配置
│ ├── event_socket.conf.xml # ESL事件套接字配置
│ ├── modules.conf.xml # 核心模块加载配置
│ ├── sofia.conf.xml # SIP协议栈配置
│ ├── unimrcp.conf.xml # MRCP协议模块配置(语音识别/合成)
│ ├── verto.conf.xml # WebRTC(Verto)配置
│ ├── voicemail.conf.xml # 语音邮件配置
│ └── ...
│
├── dialplan/ # 拨号计划
│ ├── default/ # 默认拨号计划
│ │ ├── default.xml # 基本呼叫路由规则
│ │ ├── features.xml # 系统功能(*号功能码)
│ │ ├── public.xml # 公开号码段路由
│ │ └── ivr.xml # IVR菜单定义
│ ├── public/ # 公共拨号计划(用于PSTN接入)
│ └── example.com/ # 自定义域拨号计划(多租户场景)
│
├── directory/ # 用户目录(分机配置)
│ ├── default/ # 默认域用户
│ │ ├── 1000.xml # 分机1000配置
│ │ ├── 1001.xml # 分机1001配置
│ │ └── ...
│ ├── example.com/ # 自定义域用户(多租户场景)
│ └── profile/ # SIP用户模板配置
│
├── mrcp_profiles/ # MRCP语音服务配置
│
├── sip_profiles/ # SIP配置文件
│ ├── internal.xml # 内网SIP配置(分机注册)
│ ├── external.xml # 外网SIP配置(中继/运营商)
│ ├── internal-ipv6.xml # IPv6专用配置
│ ├── external/ # 外网SIP子配置目录
│ │ ├── carrier_gw.xml # 运营商网关配置
│ │ └── ...
│ └── ...
│
├── ivr_menus/ # IVR语音菜单
│ ├── demo_ivr.xml # 示例IVR菜单
│ ├── customer_service.xml # 客户服务IVR流程
│ └── ... # 其他IVR配置
│
├── lang/ # 多语言提示音配置
│ ├── en/ # 英语提示音配置
│ ├── zh/ # 中文提示音配置
│ └── ... # 其他语言配置
│
├── vars.xml # 全局变量定义(优先级最高)
│
├── freeswitch.xml # 主配置文件(启动时加载)
│
└── xml_curl/ # 动态XML配置接口
三、外呼demo
点对点呼叫
核心命令
freeswitch分别拨打1000分机和150手机号,再将两个通道桥接在一起
originate {origination_caller_id_number=123,absolute_codec_string=PCMU,bypass_media=false,auto_answer=true}user/1000 &bridge({origination_caller_id_number=123}sofia/gateway/carrier_gw/手机号)
时序图
群呼+转接
核心命令
freeswitch拨打外部电话,保持挂起
originate {origination_caller_id_number=123,absolute_codec_string=PCMU,bypass_media=true}sofia/gateway/carrier_gw/手机号 &park()
在通话中播放录音(连续发送命令会依次播放)
uuid_broadcast <uuid> playback::$${sounds_dir}/en/us/callie/misc/8000/misc-ostag_learn_more.wav
桥接外呼通道到指定的分机号
uuid_transfer <uuid> 'export:origination_uuid=ext_uuid,bridge:user/1000' inline
强制中断媒体流(中断正在播放的媒体)
uuid_break <uuid>
开启录音(uuid可以用命令 show channels查询)
uuid_record <uuid> start/stop <path>
时序图
AI语音
参考文章:
FreeSWITCH 智能呼叫流程设计_chrome freeswitch 呼叫过程-CSDN博客
MRCP协议
MRCP(Media Resource Control Protocol,媒体资源控制协议)是一种用于控制语音服务器资源的网络协议,它允许客户端控制语音合成(TTS)和语音识别(ASR)等媒体处理资源。在FreeSWITCH的AI语音架构中,MRCP扮演着核心角色。
MRCP协议相当于语音服务的‘遥控器’,它让客户端(比如电话系统)能远程控制语音服务器上的功能(如语音识别、合成),而具体的声音传输和连接则由其他协议(如SIP/RTSP)负责。
MRCP的关键特性:
-
支持两种版本:MRCPv1(基于RTSP)和MRCPv2(基于SIP)
-
提供标准化的接口控制ASR/TTS引擎
-
通过SDP协商媒体会话参数
-
支持多种语音编解码器(如PCMU、PCMA等)
mod_unimrcp模块
是FreeSWITCH中实现MRCP客户端功能的模块,作为MRCP客户端与MRCP服务器交互。
这个模块已经被移除freeswitch的主分支,目前用独立git仓库。
UniMRCP(可以不用这个)
官网:Home
UniMRCP是一个用C/C++编写的开源跨平台MRCP(Media Resource Control Protocol)协议实现,由Araneus公司开发并维护。它提供了完整的MRCP客户端和服务端实现,支持MRCPv1(基于RTSP)和MRCPv2(基于SIP)两个版本
EasyMrcp(替代上面的UniMRCP)
EasyMrcp是基于UniMRCP的二次封装,目的为了简化UniMRCP的集成复杂度。
EasyMrcp使用java编写,目前提供了多种不同的asr和tts的集成,做到真正简单使用MRCP,可直接替代UniMrcp。