EasyMrcp——集成ASR/TTS的mrcp服务器
简介
欢迎使用EasyMrcp!
EasyMrcp使用java编写,目前提供了多种不同的asr和tts的集成,做到真正简单使用MRCP。
可直接替代UniMrcp,部分功能正在完善中.......
github地址:https://github.com/chenliangrui/EasyMrcp
目前支持
项目迭代中,后续会集成更多的asr和tts服务,欢迎提出指正问题。
电话软交换平台 |
|
freeswitch | 支持 |
ASR | 支持的asr模式 | 简介 |
funAsr | 实时语音转写 | 阿里开源,免费可离线运行的asr,地址:https://github.com/modelscope/FunASR |
xfyun | 实时语音转写、一句话语音识别 | 科大讯飞在线asr服务,每天有免费额度。一句话语音识别:语音听写_语音识别-讯飞开放平台 |
TTS | 支持的tts模式 | 简介 |
kokoro | 流式 | 离线的tts服务,开源免费,使用FastAPI项目:https://github.com/remsky/Kokoro-FastAPI |
xfyun | 流式 | 科大讯飞在线tts服务,每天有免费额度。地址:在线语音合成_免费试用-讯飞开放平台 |
更多文档支持
更多文档正在完善中......
地址:EasyMrcp · 语雀 《EasyMrcp》
下载程序
下载发布的jar包,目前版本正在迭代中,如果发版不及时可以自己maven编译运行项目。
运行程序
前置准备
项目运行需要JDK11
必要的配置
配置项目运行文件
也可以参考别人提供的配置方法:https://github.com/reSipWebRTC/UniMRCP-with-freeswitch
配置FreeSWITCH
我们需要将处理用户语音呼入的FreeSWITCH与向EasyMrcp两者连接起来。
- 配置unimrcp模块并自动加载;
# 编辑/usr/local/src/freeswitch/modules.conf文件,找到要安装的模块,去掉前面的注释符号#
cd /usr/local/src/freeswitch
vim modules.conf
#asr_tts/mod_unimrcp
asr_tts/mod_unimrcp
# 执行make mod_xxx-install命令,这样就编译相应模块,并把编译后的动态库安装的/usr/local/freeswitch/mod目录下
make mod_unimrcp-install
# 编辑/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml,去掉注释符号,如果没有发现对应模块,则添加
- 设置profile文件与conf文件;
在/usr/local/freeswitch/conf/mrcp_profiles目录新建unimrcpserver-mrcp-v2.xml配置文件:
配置/usr/local/freeswitch/conf/autoload_configs/unimrcp.conf.xml文件:
注:1.unimrcpserver-mrcp-v2.xml中server-ip为EasyMrcp启动的主机ip;2.client-ip和rtp-ip为FreeSWITCH启动的主机,client-port仕FreeSWITCH作为客户端访问unimrcpserver的端口,手机作为客户端访问的FreeSWITCH端口默认为5060,两者不同;3.unimrcpserver-mrcp-v2.xml中的profile name应和unimrcp.conf.xml中的default-tts-profile与default-ars-profile的value一致(有些文档的分析中称mrcp_profiles中的xml文件名也必须和这两者一致,实际上是非必须的)。
- 配置脚本。
在/usr/local/freeswitch/conf/dialplan/default.xml里新增如下配置:
在/usr/local/freeswitch/scripts目录下新增names.lua脚本:
---freeswitch语音识别语音合成脚本
session:answer();
freeswitch.consoleLog("CRIT", "脚本开始执行
")
ans = "你好! 我是你的助理,有什么可以帮到你的吗?"
while session:ready() == true do
local s = session
local numName = s:getVariable('caller_id_name')
freeswitch.consoleLog("CRIT", "电话名称:"..numName.."
")
local tts_voice = 'xiaofang'
-- 设置tts_engine和tts_voice,执行say的前提条件是要有这两个参数
s:execute('set', 'tts_engine=unimrcp')
s:execute('set', 'tts_voice=' .. tts_voice)
-- 设置tts_params,执行speak的前提是要有这个参数
s:set_tts_params("unimrcp", "xiaofang");
s:execute("play_and_detect_speech", "say:"..ans.." detect:unimrcp:unimrcpserver-mrcp2 hello")
---- 接收asr识别到的语音信息
local xml = s:getVariable('detect_speech_result')
---- 在控制台打印出asr识别结果的日志
if xml ~= nil then
freeswitch.consoleLog("CRIT", numName.."识别结果:"..xml .."
")
ans = xml
else
freeswitch.consoleLog("CRIT", numName.."No result!
")
end
end
这个脚本的作用是freeswitch侧作为mrcp客户端通过sip和mrcp去控制asr和tts过程。拨打电话成功后会听到tts合成的提示语音,此时说话就可以进行asr,接收到asr的文字之后发送给tts进行合成,此时就可以听到刚才说的话了。一直重复整个过程并且支持语音打断,直到用户挂断电话。
我们需要在/usr/local/freeswitch/grammar目录新增hello.gram语法文件,可以为空语法文件须满足语音识别语法规范1.0标准(简称 SRGS1.0),该语法文件 ASR 引擎在进行识别时可以使用。
#JSGF V1.0;
/** JSGF Grammar for example */
grammar example;
public = [];
配置asr/tts配置文件
请选择要使用的一种asr和tts进行对应配置。
- 配置项目目录下的
application.yaml
文件,主要需要修改的配置如下:
配置sipServer
EasyMrcp运行的ip地址。
配置asrMode
选择一个asr服务名称。
配置ttsMode
选择一个tts服务名称。
sip:
# EasyMrcp要监听的sip服务器地址,填写项目运行的ip地址
sipServer: 192.168.31.29
mrcp:
# 选择一个asr服务,目前已经集成:xfyun、funasr
asrMode: xfyun
# 选择一个tts服务,目前已经集成:xfyun、kokoro
ttsMode: xfyun
命令运行
正常运行项目,使用如下命令:
java -jar EasyMrcp-x.x.x.jar
Windows中运行EasyMrcp,如果freeswitch脚本asr识别结果出现乱码则尝试添加utf-8编码运行,乱码后会导致tts无法合成:java -Dfile.encoding=utf8 -jar EasyMrcp-x.x.x.jar
联系我
加入QQ群: