FreeSWITCH及VOIP,Openser,电话机器人等产品中文技术资讯、交流、沟通、培训、咨询、服务一体化网络。QQ群:293697898
一、前言
MRCP(Media Resource Control Protocol)作为专用于语音通信层面的c/s结构服务模型,主要用来作为语音数据的服务,典型应用案例就是ASR/TTS。它只处理上层的交互协议,但是不具体承载内容的传输。内容传输还是需要基于其它的一些协议。而在FreeSwitch中则采用的unimrcp这个开源的mrcp系统来作为mrcp-client对相应的mrcp server进行请求与交互。
二、系统架构
在FreeSwitch中unimrcp的调用图如下(图来自于FS官方文档):
https://freeswitch.org/confluence/download/attachments/6586728/Mod_openmrcp.gif?version=1&modificationDate=1443805997400&api=v2
图中所示,为了不局限于只使用unimrcp这个开源的系统框架,所以标注为OpenMRCP,意味着各开源,甚或于商业的MRCP库都可以通过接口改造来完成这一部分的工作。具体的代码细节,以后逐步来分解。今天主要来描述配置及FreeSwitch1.4.26和FreeSwitch1.8.6两个版本中代码的不一样的地方。
三、配置
Mod_unimrcp的配置主要是以下几个路径下:
$FS_PATH/conf/mrcp_profiles 下,及$FS_PATH/conf/autoload_configs/unimrcp.conf.xml
典型的MRCP v2配置文件类似,当然默认安装后有关nuance的某些版本的v1/v2,及其它一些示例配置,由于v1的一些缺陷,现在逐渐只支持v1的引擎也慢慢少了,只以v2为例。
在ASR方面v2配置如下:
1. <include>
2. <profile name="mwayasr" version="2">
3. <!--param name="client-ext-ip" value="auto"-->
4. <param name="client-ip" value="172.100.0.217"/>
5. <param name="client-port" value="15068"/>
6. <param name="server-ip" value="172.100.0.200"/>
7. <param name="server-port" value="5060"/>
8. <!--param name="force-destination" value="1"/-->
9. <param name="sip-transport" value="udp"/>
10. <!--param name="ua-name" value="FreeSWITCH"/-->
11. <!--param name="sdp-origin" value="FreeSWITCH"/-->
12. <!--param name="rtp-ext-ip" value="auto"/-->
13. <param name="rtp-ip" value="172.100.0.217"/>
14. <param name="rtp-port-min" value="34000"/>
15. <param name="rtp-port-max" value="35000"/>
16. <!-- enable/disable rtcp support -->
17. <param name="rtcp" value="1"/>
18. <!-- rtcp bye policies (rtcp must be enabled first)
19. 0 - disable rtcp bye
20. 1 - send rtcp bye at the end of session
21. 2 - send rtcp bye also at the end of each talkspurt (input)
22. -->
23. <param name="rtcp-bye" value="2"/>
24. <!-- rtcp transmission interval in msec (set 0 to disable) -->
25. <param name="rtcp-tx-interval" value="5000"/>
26. <!-- period (timeout) to check for new rtcp messages in msec (set 0 to disable) -->
27. <param name="rtcp-rx-resolution" value="1000"/>
28. <!--param name="playout-delay" value="50"/-->
29. <!--param name="max-playout-delay" value="200"/-->
30. <!--param name="ptime" value="20"/-->
31. <param name="codecs" value="PCMU PCMA L16/96/8000"/>
32.
33. <!-- Add any default MRCP params for SPEAK requests here -->
34. <synthparams>
35. </synthparams>
36.
37. <!-- Add any default MRCP params for RECOGNIZE requests here -->
38. <recogparams>
39. <!--param name="start-input-timers" value="false"/-->
40. </recogparams>
41. </profile>
42. </include>
而TTS的也类似,v2:
1. <include>
2.
3. <profile name="nwaytts" version="2">
4. <!--param name="client-ext-ip" value="auto"-->
5. <param name="client-ip" value="172.100.0.217"/>
6. <param name="client-port" value="8103"/>
7. <param name="server-ip" value="172.100.0.201"/>
8. <param name="server-port" value="5060"/>
9. <!--param name="force-destination" value="1"/-->
10. <param name="sip-transport" value="udp"/>
11. <!--param name="ua-name" value="FreeSWITCH"/-->
12. <!--param name="sdp-origin" value="FreeSWITCH"/-->
13. <!--param name="rtp-ext-ip" value="auto"/-->
14. <param name="rtp-ip" value="172.100.0.217"/>
15. <param name="rtp-port-min" value="26384"/>
16. <param name="rtp-port-max" value="26400"/>
17. <!-- enable/disable rtcp support -->
18. <param name="rtcp" value="1"/>
19. <!-- rtcp bye policies (rtcp must be enabled first)
20. 0 - disable rtcp bye
21. 1 - send rtcp bye at the end of session
22. 2 - send rtcp bye also at the end of each talkspurt (input)
23. -->
24. <param name="rtcp-bye" value="2"/>
25. <!-- rtcp transmission interval in msec (set 0 to disable) -->
26. <param name="rtcp-tx-interval" value="5000"/>
27. <!-- period (timeout) to check for new rtcp messages in msec (set 0 to disable) -->
28. <param name="rtcp-rx-resolution" value="1000"/>
29. <!--param name="playout-delay" value="50"/-->
30. <!--param name="max-playout-delay" value="200"/-->
31. <!--param name="ptime" value="20"/-->
32. <param name="codecs" value="PCMU PCMA L16/96/8000"/>
33.
34. <!-- Add any default MRCP params for SPEAK requests here -->
35. <synthparams>
36. </synthparams>
37.
38. <!-- Add any default MRCP params for RECOGNIZE requests here -->
39. <recogparams>
40. <!--param name="start-input-timers" value="false"/-->
41. </recogparams>
42. </profile>
43. </include>
在$FS_PATH/conf/autoload_configs/unimrcp.conf.xml中可以配置默认的MRCP profile也可以在调用中指定,配置默认的如下:
1. <configuration name="unimrcp.conf" description="UniMRCP Client">
2. <settings>
3. <!-- UniMRCP profile to use for TTS -->
4. <param name="default-tts-profile" value="nwaytts"/>
5. <!-- UniMRCP profile to use for ASR -->
6. <param name="default-asr-profile" value="nwayasr"/>
7. <!-- UniMRCP logging level to appear in freeswitch.log. Options are:
8. EMERGENCY|ALERT|CRITICAL|ERROR|WARNING|NOTICE|INFO|DEBUG -->
9. <param name="log-level" value="DEBUG"/>
10. <!-- Enable events for profile creation, open, and close -->
11. <param name="enable-profile-events" value="false"/>
12.
13. <param name="max-connection-count" value="100"/>
14. <param name="offer-new-connection" value="1"/>
15. <param name="request-timeout" value="3000"/>
16. </settings>
17.
18. <profiles>
19. <X-PRE-PROCESS cmd="include" data="../mrcp_profiles/*.xml"/>
20. </profiles>
21.
22. </configuration>
从这个配置文件中也可以看出来,我们以上配的MRCP profile是通过unimrcp.conf.xml中
以上配置好了,就可以按自己的需求,不管是dialplan还是lua/python/c/php/java/golang等结合起来做自己的应用开发了。
四、FreeSwitch1.4.26和1.8.6间代码增量对比
主要指mod_unimrcp.c,用L代表行数
L146 增加对google speech MIME类型
/* MIME type to use for Google Speech module context /
const char *xml_mime_type;
L215 增加宏定义头
#define GSR_ID "<speech-context"
L436 增加对grammar_type中XML grammar的支持
1. /* application/xml */
2. GRAMMAR_TYPE_XML
L559 还是XML grammar
lprofile->xml_mime_type = "application/xml";
L2171 在获取grammar类型时返回xml mime
1. case GRAMMAR_TYPE_XML:
2. return profile->xml_mime_type;
L3282 加载xml mime
1. } else if (text_starts_with(grammar_data, GSR_ID)) {
2. type = GRAMMAR_TYPE_XML;
五、对增加代码的总结
通过看代码来说,历经近两年,FreeSwitch的mod_unimrcp这个模块代码基本是无变化的,增加代码也只是为了对google speech更好地支持,当然由于众所周知的原因,我们一直也没有使用FreeSwitch对google speech进行过测试,但是国内讯飞、阿里、百度、以及其它一些小厂的也进行过测试或项目,对国外的nuance的也进行过测试,基本上在一些细节中改些代码,都是可以胜任的,从这里也可以看得出FreeSwitch的稳定性。
参考链接:https://freeswitch.org/confluence/display/FREESWITCH/mod_unimrcp