EasyMrcp
简介
欢迎使用EasyMrcp!
EasyMrcp使用java编写,目前提供了多种不同的asr和tts的集成,做到真正简单使用ASR和TTS。
现已推出最新架构2.0,已全面放弃原mrcp协议,取而代之的是简化实现的完全异步架构,部分功能正在完善中.......
强烈推荐您使用最新版本以获得更好的使用体验。
GitHub地址:https://github.com/chenliangrui/EasyMrcp
重要提示:从2.0版本开始已经不再支持使用标准mrcp协议,项目中已完全删除标准mrcp相关内容,也不再需要安装mod_unimrcp模块等操作。取而代之的是全新架构。
项目演示
视频演示:【【EasyMrcp 2.0】VoIP中集成ASR/TTS的语音服务器】 https://www.bilibili.com/video/BV1gGhhzeEf1/?share_source=copy_web&vd_source=5ff73fb9e66e524e8dde009d51927426
目前支持
项目迭代中,后续会集成更多的asr和tts服务。划掉部分为旧版集成部分,现正逐步实现适配中,欢迎提出指正问题。
| 电话软交换平台 | |
|---|---|
| freeswitch | 支持 |
| ASR | 支持的asr模式 | 简介 |
|---|---|---|
| funAsr | 实时语音转写 | 阿里开源,免费可离线运行的asr,地址:https://github.com/modelscope/FunASR |
| xfyun | 科大讯飞在线asr服务,每天有免费额度。一句话语音识别:https://www.xfyun.cn/services/voicedictation 长时间实时语音转写:https://www.xfyun.cn/services/rtasr | |
| TTS | 支持的tts模式 | 简介 |
|---|---|---|
| kokoro | 流式 | 离线的tts服务,开源免费,使用FastAPI项目:https://github.com/remsky/Kokoro-FastAPI |
| xfyun | 流式 | 科大讯飞在线tts服务,每天有免费额度。地址:https://www.xfyun.cn/services/online_tts |
| aliyun | 流式 | 70+种高品质音色,支持中英日韩及多种方言,应用场景广泛。地址:音色地址 |
新版架构升级
自EasyMrcp 2.0开始,不再使用标准mrcp协议,使用sip注册方式+类似mrcp交互命令+简单客户端控制来完成ASR和TTS交互。
新架构强调了用户与智能语音机器人之间是一通电话的概念,本质上用户拨打智能语音机器人就像用户打给另一个用户进行通话一样。
SIP注册方式
采用EasyMrcp直接向IPPBX注册方式,通话时相当于SIP的UA,也就是说可以将EasyMrcp看作一个语音网关,IPPBX通过SIP协议控制通话生命周期,通过自定义头方式传递通话必要的参数。抛弃了原mrcp协议中依靠mrcp client进行sip交互的方式。
类似mrcp交互命令
mrcp协议是控制ASR和TTS的关键命令,新版中保留了mrcp的关键特征,自定义了类似mrcp事件的简单协议,简化了mrcp事件的设计。在代码使用上与旧mrcp使用基本没有差异,但更符合使用习惯。
简单客户端控制
EasyMrcp client简化到只负责ASR和TTS的命令交互,新版中大幅降低了client的复杂程度。现在client优化为一个简单的tcp连接发送相关事件,提供了简单的代码封装。如果您想要其他语言版本的client,那么简单的客户端设计可以让您利用ai根据一个客户端的代码去写出自己想要的语言的客户端代码,让异构架构集成EasyMrcp变得更加简单。
完全异步
彻底解决了旧架构中无法异步调用的问题,现在在同一通电话中可以在任意时间任意线程任意代码位置控制ASR和TTS,可以理解为EasyMrcp是面向语音流的,只是通过命令控制向语音流中插入相关操作。
旧版本问题
下面介绍了在旧版中使用的核心痛点,这也是为什么坚定要推出新版的原因。
整体架构问题
以unimrcp对接freeswtich为例,VoIP语音流流向是这样的:
ASR:freeswtich -> mrcp client -> mrcp server
TTS:mrcp server -> mrcp client -> freeswtich
在流程上mrcp client中转了VoIP语音流。mrcp协议规定了使用sip完成tts和asr操作,可以理解为mrcp client是ASR和TTS的总代理,由它来控制由会话建立、每轮mrcp对话、语音流处理等繁重的交互过程。由于mrcp在设计层面实际上侧重的是单轮对话,也就是一次ASR和TTS的过程。所以mrcp的设计中ASR是由命令触发的,TTS是每次都会通过sip协商一个新的rtp流,10轮对话就会前后产生10条RTP流。所以可以看出mrcp本意上是将asr和tts看作一个功能,让每通电话去主动调用方法完成交互,弱化了用户与智能语音机器人之间复杂语音流的通话概念。
mod_unimrcp客户端限制太多
在EasyMrcp 2.0之前的版本是使用mod_unimrcp作为mrcp客户端使用,但是由于mrcp的本质上是基于一轮对话的结构设计的,所以导致需要循环执行play_and_detect_speech等命令,这将会导致多轮对话间命令发送出现间隙等问题。另外在客户端在异步执行方面存在着诸多限制,无法异步的通过多线程方式去正确操作多轮对话的,导致出现卡顿等情况。在客户端事件设计方面没有暴露出更多原mrcp协议中的中间状态等事件,降低了处理复杂对话的可行性。在异构语言方面,执行效果不尽相同,python脚本的部分命令执行存在问题,并不能达到lua脚本相同的效果。
unimrcp需手动集成
在EasyMrcp 1.x的版本中主要完成的就是集成问题,可使用EasyMrcp替换unimrcp,虽然存在很多不完善的地方,但是提供了开箱即用的asr和tts集成。
通话监听
mod_easymrcp_spy模块不是运行项目时必须安装,而是当需要使用freeswitch的监听功能时才需要安装
支持单独监听某一路的音轨。例如在坐席辅助场景中需要asr识别客户和客服人员之间的通话,那么使用mod_easymrcp_spy模块即可分别监听对应的语音流,并通过EasyMRCP进行识别。
具体使用参考代码中的mod_easymrcp_spy模块文档README.md。
提供了演示脚本spy_handler.py,使用电话A拨打电话B即可分别看到对应的asr识别结果。
下载程序
下载发布的压缩包,目前版本正在迭代中,如果发版不及时可以自己切换至dev分支maven编译运行项目。
