MRCP协议栈源码修改,支持实时语音识别

其实早在之前,我就在freeswitch中文论坛发布过,可惜那个论坛死掉了,而且其实我也没有写完全,这次就全部写到博客上面,如果你需要接触mrcp协议栈的修改的话,这或许是一点点经验

这个模块本身是支持长时识别的,只是freeswitch没把它写成长时识别,但是我们却可以通过修改其源代码来扩展它,使它支持长时识别

前提条件:
修改源代码,你需要了解mrcp协议
unimrcpserver 实时识别插件要编写好(我已经写了一个阿里的实时语音识别插件,https://blog.csdn.net/qq1779062842/article/details/103645047,可以直接测使用)

两个概念:
短时识别:指的是每一个回合 只能识别一次
长时识别:在一个识别回合里面,可以识别多次

原来的是短时的识别,每一次识别都需要调用命令 detect_speech 这个api命令或者其他api命令去启动unimrcp去连接并且识别,识别完了 你还必须 再次调用该api命令去停掉它,否则它不会再次识别,而且不会关闭,直到通话结束,这种情况如果并发量高,对于资源的占用是非常可观的。所以这种识别的方式并不能使用在通话中识别,因为通话中,可不止说一个话,这种短时的识别最适合的是用在语音导航 ivr ,因为 在 ivr 导航时通常说话都不会连续,例如:
请帮我转坐席
请帮我查话费
等等。。。

这些都是一个回合只识别一次,所以用短时识别十分合适。而freeswitch的mod_unimrcp本身就是这种模式。

但是短时并不能满足我们的需求,我们还需要长时的识别,可用于通话中的识别,所以在看了mod_unimrcp的源代码后发现其实是可以改为长时的,并不是不行。废话不多说 改源代码走起~~~~

调试工具:vs 2015
平台:window 10 64位
得先让freeswitch跑起来先 并且加载mod_unimrcp模块

在这里插入图片描述
修改mrcp配置:在这里插入图片描述

添加一个v2版本的xml 我们用的是v2的识别
在这里插入图片描述
添加完后启动freeswitch
在这里插入图片描述
注意,该加载模块都让它加载起来,能正常加载后看加载日志:
在这里插入图片描述
能正常加载配置文件后,没问题后退出掉,开始修改源代码
打开mod_unimrcp.c
在这里插入图片描述

。。。。(中间有很多细节,这里不解释,如果感兴趣可以去看源码)

在这里插入图片描述
最后找到这个函数,这个函数是关键,mrcp收到信息后,最后会回调到这个函数,把识别回来的结果
通过创建一个事件,然后freeswitch会回调recog_channel_get_results 这个函数把结果获取到后再通过事件发送给els,而我们也是需要在这里改,因为mrcp连接的过程识别回来内容后并没有自己把连接关掉,而且识别完成后,freeswitch是不会再给发任何mrcp事件到unimrcpserver的,具体的可以参考mrcp协议的交互流程,是要我们自己手动去关闭,就是调用api命令停止,但是它没有自己关闭对于我们来说太棒了,所以我们就可以修改,只需在连接的过程能接受数据并且发回给freeswitch即可

注意看这里,接受回来的内容是在这里判断是什么类型的mrcp消息

在这里插入图片描述
从这里我们可以看到这些都是识别的事件,我们在这里添加一个mrcp事件,使其可以连续发送消息回来,注意mrcp交互识别的时候 返回会来的是识别事件(参考mrcp协议)
在这里插入图片描述
添加一个事件
在这里插入图片描述
在这里插入图片描述
其实freeswitch就是调用了unimrcpsrever服务的mrcp协议库来实现客户端的
修改mrcp资源.c
在这里插入图片描述

在接收mrcp消息再添加一段代码:
在这里插入图片描述
在识别事件下面添加一段我们写上的代码

在识别事件下面添加一段我们写上的代码
	//{{add 2019-05-09
		else if (message->start_line.method_id == RECOGNIZER_INTERMEDIATE_COMPLETE)
		{
			switch_log_printf(SWITCH_CHANNEL_UUID_LOG(schannel->session_uuid), SWITCH_LOG_DEBUG, "(%s) RECOGNIZER_INTERMEDIATE COMPLETE, Completion-Cause: %03d\n", schannel->name,recog_hdr->completion_cause);
			if (message->body.length > 0)
			{
				if (message->body.buf[message->body.length] == '\0')
				{
					switch_log_printf(SWITCH_CHANNEL_UUID_LOG(schannel->session_uuid), SWITCH_LOG_DEBUG, "(%s) message->body.buf:%s length:%d \n", schannel->name, message->body.buf, message->body.length);
					recog_channel_set_result_headers(schannel, recog_hdr);
					recog_channel_set_results(schannel, message->body.buf);
				}

			}
		}

到这里长时修改完成,注意添加的事件在标准的mrcp协议是没有的,我们改了这边,那么unimrcpserver 服务的mrcp协议也要修改,添加这个事件才可以,否则将使用不了,

然后:
在这里插入图片描述
选择,重新生成,再次启动freeswitch 查看加载日志,是否能正常加载

unimrcpserver 修改
直接把上面修改的mrcp协议栈文件替换即可:
在这里插入图片描述
然后启动,测试效果在另一篇博客
https://blog.csdn.net/qq1779062842/article/details/103645047

我的邮箱:c_wujinbiao@163.com

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值