最近有朋友在搞智能客服系统,他们使用freeswitch作为软交换,有需要对接asr,在尝试了mrcp方式之后,想着能否直接对接,通过http方式或者sdk方式,所以尝试开发了一下对接的mod,发觉还是可行的,主要是仿照阿里sdk中的demo来做,只是具体的细节要自己优化一下。
这里要说明下,以前看了某大佬写的一个mod对接阿里的asr,是1.0的sdk,所以我在测试2.0的sdk时候也是参考了大佬的例子,十分感谢。
首先是基本的fs的mod的逻辑,模块加载,添加app等,这些都是通用的写法,可以参考其他模块。
模块加载时,我们添加2个app,开始和停止asr。
开始asr的函数,附带3个参数,为阿里平台的:appkey、AccessKey ID、Access Key Secret。
主要是使用switch_core_media_bug_add函数,向fs添加了media bug回调函数。
回调过来时的参数有个switch_abc_type_t type,具体的含义请查看fs的源码目录中switch_types.h,如下:
typedef enum {
SWITCH_ABC_TYPE_INIT,
SWITCH_ABC_TYPE_READ,
SWITCH_ABC_TYPE_WRITE,
SWITCH_ABC_TYPE_WRITE_REPLACE,
SWITCH_ABC_TYPE_READ_REPLACE,
SWITCH_ABC_TYPE_READ_PING,
SWITCH_ABC_TYPE_TAP_NATIVE_READ,
SWITCH_ABC_TYPE_TAP_NATIVE_WRITE,
SWITCH_ABC_TYPE_CLOSE,
SWITCH_ABC_TYPE_READ_VIDEO_PING,
SWITCH_ABC_TYPE_WRITE_VIDEO_PING,
SWITCH_ABC_TYPE_STREAM_VIDEO_PING,
SWITCH_ABC_TYPE_VIDEO_PATCH
} switch_abc_type_t;
之后我们就可以在不同的回调过来时,把阿里asr的demo中的逻辑,都写进去,比如在init回调时,获取token,初始化asr使用的数据等等。
我参照的阿里的asr demo也是使用回调的方式来获取动作执行的结果和语音识别的结果,在fs的mod里面也可以一样的方式,相应的还可以在这些回调中把动作执行的结果和语音识别的结果放到事件中,这样会方便外部服务通过esl来获取执行的状态和asr的结果,就先写这些吧,后续会继续尝试其他厂商的asr对接模块。
最后附一张测试的图,为了方便测试,日志都出的CRIT级别:
使用实际落地线路测试发现,在当前media bug回调位置开启asr,有实现回铃音检测的功能,就是将空号或者关机的媒体也一样送了asr,因此也就可以获取到目标号码是空号或者关机的信息。测试效果如下,乱来的文字估计是回铃音中的英文: