4.6 KiB
4.6 KiB
Freeswitch通过mod_unimrcp与百度mrcp-server对接(lua版)
参考链接
[https://freeswitch.org/confluence/display/FREESWITCH/mod_unimrcp] [https://ptorch.com/news/206.html] [https://ptorch.com/news/207.html]
安装并加载mod_unimrcp模块
# 在freeswitch源码目录(不是安装目录)
make mod_unimrcp-install
# 在freeswitch安装目录中编译modules.conf.xml文件
cd /usr/local/freeswitch
vim conf/autoload_configs/modules.conf.xml
<!-- 添加如下配置 -->
<load module="mod_unimrcp"/>
设置profile文件和conf文件
vim /usr/local/freeswitch/conf/mrcp_profiles/unimrcpserver-mrcp-v2.xml
输入以下内容:
<include>
<!-- UniMRCP Server MRCPv2 -->
<!-- 后面我们使用该配置文件,均使用 name 作为唯一标识,而不是文件名 -->
<profile name="unimrcpserver-mrcp2" version="2">
<!-- MRCP 服务器地址和SIP端口号 -->
<param name="server-ip" value="192.168.16.4"/>
<!-- mrcp服务器的sip-port -->
<param name="server-port" value="15060"/>
<param name="resource-location" value=""/>
<!-- FreeSWITCH IP、端口以及 SIP 传输方式 -->
<param name="client-ip" value="192.168.16.4" />
<!-- freeswitch的sip-port -->
<param name="client-port" value="5069"/>
<param name="sip-transport" value="udp"/>
<param name="speechsynth" value="speechsynthesizer"/>
<param name="speechrecog" value="speechrecognizer"/>
<!--param name="rtp-ext-ip" value="auto"/-->
<!-- 也是freeswitch的ip和rtp端口范围(不是mrcp里配置的rtp范围) -->
<param name="rtp-ip" value="192.168.16.4"/>
<param name="rtp-port-min" value="4000"/>
<param name="rtp-port-max" value="5000"/>
<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>
编辑unimrcp.conf.xml
文件改default-tts-profile
和default-asr-profile
vim /usr/local/freeswitch/conf/autoload_configs/unimrcp.conf.xml
<!-- UniMRCP profile to use for TTS -->
<param name="default-tts-profile" value="unimrcpserver-mrcp2"/>
<!-- UniMRCP profile to use for ASR -->
<param name="default-asr-profile" value="unimrcpserver-mrcp2"/>
设置dialplan
vim /usr/local/freeswitch/conf/dialplan/default.xml
添加一个extension:
<extension name="unimrcp">
<condition field="destination_number" expression="^5001$">
<action application="answer"/>
<!-- 对应scripts/baidu.lua文件 -->
<action application="lua" data="baidu.lua"/>
</condition>
</extension>
在/usr/local/freeswitch/scripts
目录下创建baidu.lua
文件:
touch /usr/local/freeswitch/scripts/baidu.lua
vim /usr/local/freeswitch/scripts/baidu.lua
文件内容如下:
session:answer()
--freeswitch.consoleLog("INFO", "Called extension is '".. argv[1]"'\n")
welcome = "/usr/local/freeswitch/sounds/en/us/callie/ivr/8000/ivr-welcome_to_freeswitch.wav"
--
grammar = "baidu"
no_input_timeout = 80000
recognition_timeout = 80000
--
tryagain = 1
while (tryagain == 1) do
--
session:execute("play_and_detect_speech", welcome .. " detect:unimrcp {start-input-timers=false,no-input-timeout=" .. no_input_timeout .. ",recognition-timeout=" .. recognition_timeout .. "} " .. grammar)
xml = session:getVariable('detect_speech_result')
--
if (xml == nil) then
freeswitch.consoleLog("CRIT","Result is 'nil'\n")
tryagain = 0
else
freeswitch.consoleLog("CRIT","Result is '" .. xml .. "'\n")
tryagain = 0
end
end
--
-- put logic to forward call here
--
session:sleep(250)
session:hangup()
以上脚本实现当分机用户拨打5001时,freeswitch会自动播放一段录音,并接收用户发出的声音,同时把声音传给mrcp服务器并接收返回结果
在/usr/local/freeswitch/grammar
目录新增hello.gram
语法文件,内容为百度mrcp程序句中的语法文件内容:
<?xml version="1.0"?>
<grammar xmlns="http://www.w3.org/2001/06/grammar" xml:lang="en-US" version="1.0" mode="voice" root="digit">
<rule id="digit">
<one-of>
<item>one</item>
<item>two</item>
<item>three</item>
</one-of>
</rule>
</grammar>
让配置生效并测试
fs_cli
reloadxml
防火墙
在freeswitch服务器和mrcp服务器都不需要额外开放端口。