freeswitch关于语音识别有detect_speech和play_and_detect_speech 2个模块,怎么区分这两个模块的用途呢,我是这样理解的,做机器人人机交互的时候,首先play_and_detect_speech,因为可控制的参数还蛮多的,尤其在需要打断的时候;做双通道语音识别就使用detect_speech。
官方wiki:
play_and_detect_speech:
https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod-dptools/6586714/#lua
detect_speech:
mod_dptools: detect_speech | FreeSWITCH Documentation
从文档可以看出,detect_speech的介绍相比play_and_detect_speech就偷懒了一些,并没有那么详细。
本文介绍detect_speech +mrcp做实时语音识别
场景如下:
A是呼叫平台,B是freeswitch网关,C是线路(用户),如何针对呼叫平台A做双向语音识别呢?
如果呼叫平台A也是基于freeswitch开发的,当然可以直接在a上面使用detect_speech实现;如果平台A不是基于freeswitch开发的,那就在A的必经之路上面加入一个freeswitch网关B,在网关B上面使用detect_speech实现坐席和用户的双向语音识别。
语音识别需要用到asr,连接asr采用mrcp来实现。
采用esl获取detect_speech的事件,相比play_and_detect_speech来说要复杂一些,这部分我倒不太熟;不过采用lua的话,可以使用 session:setInputCallback('onInput','')回调函数来获取结果,倒是方便很多。
获取结果后,拼接结果,将结果通过http接口传给后端应用,剩下的就由后端流程去处理,做实时质检、实时辅助等等功能了,效果如下:
以上语音识别呢,是基于句子的语音识别,因为使用的是mrcp,默认是没有中间结果;
还有一种方案是获取freeswitch的语音流,通过udp或其他方式实时推送给asr,这种方式可以实现基于每个字的实时识别,但是实现方式来说,需要基于freeswitch做二次开发了,复杂一些,而采用detect_speech呢,就是纯粹使用freeswitch提供的app来实现,不涉及freeswitch源码的改造。
如需更多帮助可私聊