FreeSwitch采用mrcp协议对接科大讯飞asr和tts以及对话系统
时间:2024-04-19 21:15:25 来源:网络cs 作者:亙句 栏目:数据分析 阅读:
最近由于有开发智能语音机器人的需求,需要使用语音识别(ASR)和文本语音转换(TTS)技术,老板指定使用科大讯飞的原子能力来提供这两项技术的支持。在语音侧,我们使用开源的软交换系统FreeSwitch来对接科大的接口。在与科大讯飞的技术支撑沟通后,确认ASR和TTS的对接采用mrcp协议,幸好FreeSwitch是支持这个协议的,下面就把整个对接的过程记录下。
首先我们得搞清楚这个mrcp协议的大体交互流程,主要是如下图。
mrcp一般是由客户端发起invite请求与服务器协商语音编码和mrcp通道信息,然后进行基于mrcp协议的asr信息和tts信息的交互,最后进行rtp语音流交互并返回识别信息直到挂机为止。
FreeSwitch内部有一个mod_unimrcp的模块专门用来处理对接mrcp服务器,它的配置文件在conf/autoload_config/unimrcp.conf.xml中,主要的配置如下:
<configuration name="unimrcp.conf" description="UniMRCP Client"> <settings> <!-- UniMRCP profile to use for TTS --> <param name="default-tts-profile" value="kdxf-mrcp2"/> <!-- UniMRCP profile to use for ASR --> <param name="default-asr-profile" value="kdxf-mrcp2"/> <!-- UniMRCP logging level to appear in freeswitch.log. Options are: EMERGENCY|ALERT|CRITICAL|ERROR|WARNING|NOTICE|INFO|DEBUG --> <param name="log-level" value="DEBUG"/> <!-- Enable events for profile creation, open, and close --> <param name="enable-profile-events" value="true"/> <param name="max-connection-count" value="100"/> <param name="offer-new-connection" value="1"/> <param name="request-timeout" value="3000"/> </settings> <profiles> <X-PRE-PROCESS cmd="include" data="../mrcp_profiles/*.xml"/> </profiles></configuration>
这其中最主要的是default-tts-profile和default-asr-profile的配置,它对应了ASR和TTS的配置文件,这个配置文件一般在conf/mrcp_profiles/下面,我们来看一下相关的配置:
<include> <!-- 科大讯飞 Speech Server 5.0 MRCPv2 --> <profile name="bjzk-mrcp2" version="2"> <param name="client-ip" value="172.28.105.14"/> <param name="client-port" value="5191"/> <param name="server-ip" value="172.28.105.13"/> <param name="server-port" value="7010"/> <!--param name="force-destination" value="1"/--> <param name="sip-transport" value="udp"/> <!--param name="ua-name" value="FreeSWITCH"/--> <!--param name="sdp-origin" value="FreeSWITCH"/--> <!--<param name="rtp-ext-ip" value="172.28.105.15"/>--> <param name="rtp-ip" value="172.28.105.14"/> <param name="rtp-port-min" value="4000"/> <param name="rtp-port-max" value="5000"/> <!-- enable/disable rtcp support --> <param name="rtcp" value="1"/> <!-- rtcp bye policies (rtcp must be enabled first) 0 - disable rtcp bye 1 - send rtcp bye at the end of session 2 - send rtcp bye also at the end of each talkspurt (input) --> <param name="rtcp-bye" value="2"/> <!-- rtcp transmission interval in msec (set 0 to disable) --> <param name="rtcp-tx-interval" value="5000"/> <!-- period (timeout) to check for new rtcp messages in msec (set 0 to disable) --> <param name="rtcp-rx-resolution" value="1000"/> <!--param name="playout-delay" value="50"/--> <!--param name="max-playout-delay" value="200"/--> <!--param name="ptime" value="20"/--> <param name="codecs" value="PCMU PCMA L16/96/8000"/> <!-- Add any default MRCP params for SPEAK requests here --> <synthparams> </synthparams> <!-- Add any default MRCP params for RECOGNIZE requests here --> <recogparams> <!--param name="start-input-timers" value="false"/--> </recogparams> </profile></include>
这其中server-ip和server-port就是科大讯飞mrcp服务器的地址和端口。
在配置好后,我们就可以启动FreeSwitch进行应用了,我们可以在dialplan或者esl中调用App函数play_and_detect_speech来进行放音并识别的操作,典型的命令如下:
<extension name="play_and_detect_speech example"> <condition field="destination_number" expression="^(1888)$"> <action application="set" data="tts_engine=unimrcp"/> <action application="set" data="tts_voice=donna"/> <action application="play_and_detect_speech" data="say:please say yes or no. please say no or yes. please say something! detect:unimrcp {start-input-timers=false,no-input-timeout=5000,recognition-timeout=5000}builtin:grammar/boolean?language=en-US;y=1;n=2"/> <action application="log" data="CRIT ${detect_speech_result}"/> </condition></extension>
最终我们可以通过获取SWITCH_EVENT_DETECTED_SPEECH的事件信息得到ASR的文本。
以上是关于语音原子能力引擎的对接,至于智能机器人的对话系统,科大讯飞提供了DCM系统,它是通过http restful接口来交互的,这块比较简单,就不再赘述了。大家有什么问题的话欢迎私信沟通。
本文链接:https://www.kjpai.cn/news/2024-04-19/160490.html,文章来源:网络cs,作者:亙句,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!