FreeSWITCH中文网,电话机器人开发网 ,微信订阅号:

FreeSWITCH及VOIP,Openser,电话机器人等产品中文技术资讯、交流、沟通、培训、咨询、服务一体化网络。QQ群:293697898

FreeSwitch中1.4.26和最新1.8.6版本的mod_unimrcp源码比较


tags:FreeSwitch mrcp asr tts 创建时间:2019-07-06 20:08:17

一、前言

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



上海老李,QQ:1354608370,FreeSWITCH QQ群: