EasyMrcp 2.4.0:让 VoIP 接入 ASR 与 TTS 更简单的语音服务器
简介
在智能客服、电话机器人、语音通知和通话质检等场景中,让系统“听懂用户说什么”并“用自然语音回答”只是第一步。真正落地时,开发者还需要处理 SIP 呼叫、RTP 音频流、编解码、语音活动检测、合成音频播放、用户打断以及不同语音厂商的接口差异。
EasyMrcp 正是为解决这类问题而生。它是一个使用 Java 编写、面向 VoIP 场景的语音服务器项目,负责连接电话网络与 ASR、TTS 服务,为上层业务提供相对统一、简单的语音控制方式。本文基于 EasyMrcp 2.4.0 介绍其设计与能力。
EasyMrcp 是什么
可以把 EasyMrcp 理解为电话系统与语音引擎之间的一座桥梁。
一端是 FreeSWITCH 等 IP PBX,负责接听、转接和管理电话;另一端是阿里云、科大讯飞、FunASR、Kokoro 等语音服务,负责语音识别与语音合成。EasyMrcp 位于两者之间,处理 SIP 信令、RTP 音频以及 ASR、TTS 控制事件。
当用户拨打电话时,语音通过 RTP 进入 EasyMrcp,再被送往 ASR 引擎。识别结果通过事件返回给业务系统;业务系统完成对话逻辑后,只需发送一条 Speak 指令,EasyMrcp 就会调用 TTS 引擎,并把合成音频重新发送到电话中。
需要说明的是,EasyMrcp 不是大模型或完整的智能客服平台。它主要解决电话音频与语音能力的接入问题,对话流程、知识库、业务规则和大模型调用仍由上层系统负责。
GitHub地址:https://github.com/chenliangrui/EasyMrcp
官网文档:https://www.hdtans.com/easymrcp
项目演示
视频演示:【【EasyMrcp 2.0】VoIP中集成ASR/TTS的语音服务器】 https://www.bilibili.com/video/BV1gGhhzeEf1/?share_source=copy_web&vd_source=5ff73fb9e66e524e8dde009d51927426
智声平台
同时我们也自研了智声AI联络中心,一个完整的AI智能呼叫平台。底层使用EasyMrcp作为核心能力构建接入VoIP能力。您可以直接注册体验功能,也可以联系商务使用我们的智声平台产品,欢迎您注册体验。
官网地址:https://www.hdtans.com
平台地址:https://www.platform.hdtans.com
名为 EasyMrcp,却不再使用标准 MRCP
这是理解 EasyMrcp 2.x 时最重要的一点。
从 2.0 版本开始,EasyMrcp 已不再使用标准 MRCP 作为外部控制协议,也不再依赖 mod_unimrcp。项目保留了 Speak、DetectSpeech、RecognitionComplete 等类似 MRCP 的事件概念,但重新设计了更轻量的交互方式。
这一变化源于实际的多轮语音对话需求。传统接入方式通常需要围绕一轮轮 ASR、TTS 操作组织流程,在复杂异步控制、连续对话和跨语言客户端接入方面存在较高成本。EasyMrcp 2.x 则把一通电话视为持续存在的语音会话,让业务系统能够在通话期间异步控制识别、播报和打断。
因此,EasyMrcp 2.x 并不是标准 MRCP 服务端的直接替代品。已有系统如果依赖 MRCP 客户端,需要按照 EasyMrcp 的 SIP、RTP 和 TCP 交互方式重新接入。
三个平面组成的异步架构
EasyMrcp 2.x 的核心架构可以概括为 SIP、RTP 和 TCP+JSON 三个部分。
SIP 负责通话生命周期。EasyMrcp 可以作为一个 SIP UA 注册到 FreeSWITCH,通过 INVITE、ACK、BYE 等信令建立和结束会话,并通过 SDP 协商音频参数。
RTP 负责传输真实的音频数据。电话侧的语音流进入 ASR 处理链路,TTS 生成的音频则通过 RTP 返回电话侧。EasyMrcp 还包含音频编解码、重采样、入站 RTP 重排和丢包补偿等处理能力。
TCP+JSON 负责业务控制。客户端通过带有固定消息头的 TCP 协议发送事件。常用事件包括:用于启动或更新语音识别的 DetectSpeech,用于播放合成语音的 Speak,用于中断当前播报的 Interrupt,用于清空当前播报并立即播放新内容的 InterruptAndSpeak,以及用于暂停或恢复识别的 PauseDetectSpeech、ResumeDetectSpeech。
服务端则通过 RecognitionComplete、AsrRealTimeResult、SpeakComplete、SpeakInterrupted 等事件异步返回状态和结果。
SIP 会话和 TCP 客户端使用同一个通话标识关联。业务系统不需要直接操作 RTP,也不必理解不同语音厂商的流式接口,只需围绕事件编排对话。
具体功能与事件
EasyMrcp 并不是只暴露“识别一次”和“播放一次”两个接口,而是围绕完整通话定义了一套异步事件。TCP 消息由 8 字节消息头和 JSON 消息体组成,消息头包含固定魔数 0x66AABB99 和消息体长度。当前代码中定义的事件如下:
|
事件 |
方向 |
主要功能 |
|
|
双向 |
客户端建立逻辑会话,服务端通知 SIP、RTP 等资源已经就绪 |
|
|
客户端到服务端 |
主动断开客户端,并在监听模式下释放对应资源 |
|
|
客户端到服务端 |
启动 ASR,或者更新本轮识别参数 |
|
|
客户端到服务端 |
暂停 ASR 接收音频,并暂停无输入计时 |
|
|
客户端到服务端 |
恢复 ASR 接收音频,并重新开始无输入计时 |
|
|
服务端到客户端 |
返回本轮 ASR 的最终识别结果 |
|
|
服务端到客户端 |
通知客户端在指定时间内没有检测到语音输入 |
|
|
服务端到客户端 |
推送 ASR 实时中间识别结果 |
|
|
客户端到服务端 |
发起普通 TTS 播放,多条任务按照队列执行 |
|
|
客户端到服务端 |
打断当前 TTS、清空等待队列并立即播放新内容 |
|
|
客户端到服务端 |
播放一段不允许被 ASR 自动打断的内容 |
|
|
客户端到服务端 |
按指定时长播放静音音频 |
|
|
客户端到服务端 |
强制中断当前 TTS 并清空等待队列 |
|
|
服务端到客户端 |
通知客户端某次 TTS 或静音播放已经完成 |
|
|
服务端到客户端 |
通知客户端某次 TTS 已被中断 |
事件消息主要包含 id、event、data 和可选的 eventId。其中,id 用于关联同一通电话,event 表示事件名称,data 携带文本、参数或返回结果,eventId 则用于追踪某一次具体的 TTS 任务。业务系统可以据此判断哪一段播报已经完成、哪一段被打断,而不必依赖阻塞式调用等待结果。
完全异步控制。 业务线程可以在通话期间随时发送识别、播报、暂停、恢复或打断事件。EasyMrcp 通过独立的事件处理线程和回调通知业务结果,使对话逻辑不需要与 SIP 信令或音频处理同步执行。
持续 ASR 与实时结果。 DetectSpeech 可以配置无输入超时、语音结束超时和自动打断等参数。服务端既可以通过 RecognitionComplete 返回最终文本,也可以通过 AsrRealTimeResult 推送中间结果,便于业务系统提前判断意图或展示实时字幕。
VAD 与自动打断。 对需要断句的一句话识别模式,EasyMrcp 可以利用 VAD 判断用户开始说话和停止说话的时机。当具体 ASR 引擎能够提供有效的中间结果时,还可以在检测到用户发言后自动打断当前 TTS,实现电话机器人常见的“边听边打断”效果。
TTS 排队、抢播和静音。 多条 Speak 会按照队列顺序执行;InterruptAndSpeak 可以抢占当前播报;SpeakWithNoInterrupt 可以保护重要提示不被 ASR 自动打断;Silence 则可以在播报流程中插入指定时长的静音。每个任务都可以携带 eventId,用于匹配完成或中断回调。
通话级 TTS 配置。 建立逻辑会话时,客户端可以通过 ClientConnect 指定 TTS 引擎、发音人以及是否推送 ASR 实时结果。未指定时,服务端使用配置文件中的默认引擎,从而兼顾统一部署和单通电话的个性化需求。
RTP 音频处理。 项目包含 G.711 A-law、G.711 μ-law 与 PCM 之间的编解码处理,并提供重采样、RTP 包重排和丢包静音补偿等能力,用于降低网络抖动和语音服务采样率差异对识别、播放效果的影响。
独立监听模式。 除普通电话模式外,客户端还可以通过 spy 模式申请一个 RTP 接收端口,把外部音频流直接送入 EasyMrcp 进行识别。配合可选的 mod_easymrcp_spy 模块,可以分别监听通话双方的音轨,用于实时质检、坐席辅助和通话分析。
多种语音引擎,兼顾云端与本地
截至 2.4.0,项目文档列出的主要 ASR 接入包括阿里云 Fun-ASR、本地 FunASR 和科大讯飞;TTS 接入包括阿里云、科大讯飞和 Kokoro。
其中,云服务通常具有较成熟的识别效果、音色和服务保障;FunASR、Kokoro 等方案则适合希望离线运行、控制数据边界或降低调用成本的场景。
EasyMrcp 通过适配层隔离不同厂商的接口差异,并根据配置创建相应的 ASR、TTS 处理器。项目还提供了示例实现和新增 ASR 厂商的开发说明,便于继续扩展新的语音服务。
适合哪些场景
EasyMrcp 可以用于 AI 客服和电话机器人,让业务系统根据识别结果驱动规则引擎或大模型,再通过 TTS 返回回答。
在智能外呼中,它可以完成通知播报、用户确认、信息采集和多轮交互。通过可选的 mod_easymrcp_spy 模块,还可以分别监听客服与客户的音轨,用于坐席辅助、通话质检和实时分析。
对于强调数据本地化的项目,EasyMrcp 也可以配合离线 ASR、TTS 服务,构建相对完整的私有化语音链路。
如何开始接入
EasyMrcp 当前基于 Java 11 和 Spring Boot 2.6.13 构建,典型部署需要准备 FreeSWITCH、EasyMrcp 服务以及至少一种 ASR 和 TTS 引擎。
接入时主要需要配置 EasyMrcp 的 SIP 监听地址、FreeSWITCH 注册账号、RTP 端口范围、TCP 控制端口,以及 mrcp.asrMode、mrcp.ttsMode 对应的语音引擎。使用云服务时,还需准备相应的访问凭证。
仓库中提供了 Python 演示脚本、独立 Java TCP 客户端、FreeSWITCH ESL Java 示例和通话监听模块,可以分别用于快速体验、自定义业务接入以及完整呼叫链路验证。
交互事件
EasyMrcp 事件协议说明 | 互动探索-智声AI联络中心 大模型呼叫 AI 语音智能体 智能体呼叫AI 智声AI联络中心 AI外呼《EasyMrcp事件》
VAD
VAD 详细参数说明 | 互动探索-智声AI联络中心 大模型呼叫 AI 语音智能体 智能体呼叫AI 智声AI联络中心 AI外呼 《VAD模型参数》
项目边界与价值
EasyMrcp 的价值不在于重新实现一个语音识别模型,而在于把电话信令、实时音频和语音厂商接口之间的复杂连接集中到一个服务中。业务开发者可以把更多精力放在对话逻辑和实际应用上。
同时也要看到它的边界:EasyMrcp 2.x 不兼容标准 MRCP 客户端,不等同于完整的联络中心平台,部分能力仍在持续迭代。用于生产环境时,还需要结合实际规模评估并发容量、网络质量、语音服务配额、监控告警、访问控制和故障恢复能力。
对于正在使用 FreeSWITCH,并希望快速接入 ASR、TTS 或大模型语音交互的团队,EasyMrcp 提供了一条值得研究的工程化路径:让电话保持电话的通信方式,同时让语音能力以更简单、更异步的形式进入业务系统。
项目地址:GitHub - EasyMrcp
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)