knowledge/docs/freeswitch/freeswitch对接百度mrcp.md

4.6 KiB
Raw Blame History

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-profiledefault-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服务器都不需要额外开放端口。