问题描述
在现网的智能IVR和CTI平台开发中,经常会使用到ASR和TTS的引擎,这时需要使用到Freeswitch自带的mod_unimrcp模块。但是最近出现了一个问题,我的Freeswitch在NAT之后(做了端口映射)需要与对方的ASR,TTS服务进行对接,但是一直不成功。经对方协查发现我们发送mrcp的sip请求时Contact头域未正常携带,此时针对这个问题进行了排查。
操作结论
修改freeswitch/conf/mrcp_profiles/
文件夹下的配置文件,添加或修改client-ext-ip
选项即可
<include>
<!-- IFLYTEK InterReco 6.0 MRCPv2 -->
<profile name="iflytek-asr-master" version="2">
<param name="client-ext-ip" value="172.19.13.25"/>
<param name="client-ip" value="172.19.13.25"/>
<param name="client-port" value="3600"/>
<!--<param name="server-ip" value="172.19.13.23"/>-->
<!--<param name="server-port" value="5060"/>-->
<!--param name="server-ip" value="172.19.13.21"/-->
<!--param name="server-port" value="6050"/-->
<param name="server-ip" value="172.19.13.26"/>
<param name="server-port" value="5061"/>
<!--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="auto"/-->
<param name="rtp-ip" value="172.19.13.25"/>
<param name="rtp-port-min" value="7001"/>
<param name="rtp-port-max" value="10000"/>
<!-- 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="true"/>
<param name="no-input-timeout" value="7000"/>
<param name="kill-on-barge-in" value="true"/>
</recogparams>
</profile>
</include>
代码排查
1、在使用mod_unimrcp时,sofia如何构建的SIP消息,详见mrcp_sofiasip_client_agent.c
中的mrcp_sofia_config_validatefan
方法
如上图标红处,sofia模块是使用config->ext_ip属性来构造contact_str
2、config->ext_ip的读取位置,详见mod_unimrcp.c
文件的process_mrcpv2_config
方法