Freeswitch介绍+demo

FreeSwitch简介

FreeSwitch是一个开源的电话交换平台。官方给它的定义是---世界上第一个跨平台的、伸缩性极好的、免费的、多协议的电话软交换平台。

你可以把它想象成一个"超级电话总机"。它能让电脑、手机、普通电话等各种设备互相打电话,还能实现很多高级的电话功能。它的设计目标是提供一个灵活、强大的通信框架,能够处理各种形式的实时媒体通信,包括语音、视频、文字等。

官方文档:FreeSWITCH Explained | FreeSWITCH Documentation

衍生项目RTS官方文档:RTS 文档

一、FreeSwitch术语介绍

SIP协议(Session Initiation Protocol)

SIP(会话初始协议)是用于建立、修改和终止多媒体会话(如语音、视频通话)的信令协议,广泛应用于VoIP(网络电话)和即时通讯。它是互联网工程任务组(IETF)制定的标准(RFC 3261)。

核心功能:

  1. 会话管理:发起、终止通话,邀请参与者加入会议。

  2. 用户定位:通过SIP地址(如sip:user@example.com)找到对方。

  3. 协议兼容性:可与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

拨号计划的作用

  1. 呼叫路由:根据被叫号码、主叫号码等条件将呼叫路由到不同目标。

  2. 流程控制:定义通话过程中的各种行为和流程。

  3. 功能实现:实现呼叫转移、语音播报、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.xmlexternal.xml

Internal 和 External Profiles

默认端口:5060

FreeSWITCH 通过 internalexternal 两个 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 ProfileExternal Profile
网络环境内网(受信任)外网(不受信任)
默认端口50605080
安全策略宽松(如简化认证)严格(如 ACL、网关认证)
主要功能内部分机注册与互拨外呼网关对接、接收外部呼叫
配置文件路径conf/sip_profiles/internal.xmlconf/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),系统根据呼叫的来源或属性决定使用哪个上下文来匹配路由规则。

主要作用包括:

  • 路由隔离:不同来源的呼叫可以使用不同的路由规则

  • 安全隔离:限制特定用户只能访问特定上下文中的路由规则

  • 逻辑分组:将相关功能的路由规则组织在一起

  • 多租户支持:不同租户可以使用独立的上下文

上下文主要在以下配置文件中定义:

  1. 拨号计划文件conf/dialplan/default.xml

  2. 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.typesMIME 类型定义文件
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博客

如何在XSwitch中使用mod_unimrcp | XSwitch文档中心

最佳实践 | 基于腾讯云MRCP-Server打造简单智能外呼系统-腾讯云开发者社区-腾讯云

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模块

介绍文章mod_unimrcp从FreeSWITCH代码树中删除-腾讯云开发者社区-腾讯云

是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——集成ASR/TTS的mrcp服务器 · 语雀

EasyMrcp是基于UniMRCP的二次封装,目的为了简化UniMRCP的集成复杂度。

EasyMrcp使用java编写,目前提供了多种不同的asr和tts的集成,做到真正简单使用MRCP,可直接替代UniMrcp。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值