Configuring UniMRCP modules using MRCPv2

Asterisk can interoperate with Capacity Private Cloud over either MRCPv1 (RTSP) or MRCPv2 (SIP). This article covers configuring Asterisk to integrate with the platform over MRCPv2. In this example, Asterisk and the speech services are installed on the same server, with IP address 172.18.2.50.

This article assumes the UniMRCP modules are already installed. If they are not, complete Installing and Configuring UniMRCP Modules first.

Configuring UniMRCP

The UniMRCP installation provides several configuration files:

  • mrcp.conf in /etc/asterisk/
  • res-speech-unimrcp.conf in /etc/asterisk/
  • A set of XML config files in /usr/local/unimrcp/conf/ and /usr/local/unimrcp/conf/client-profiles/

If you do not have all of these files, you likely missed a step during installation — do not continue until the installation is complete.

Which files you edit depends on which integration path you intend to use:

  • res_unimrcp.so backs the UniMRCP Applications — MRCPRecog(), MRCPSynth(), and SynthAndRecog() — and relies on mrcp.conf.
  • res_speech_unimrcp.so backs the Generic Speech API and relies on res-speech-unimrcp.conf plus the UniMRCP client profile XML.

Configuring res_unimrcp.so

The res_unimrcp.so module relies on /etc/asterisk/mrcp.conf. Below is a sample already configured to work with the platform. Save it as /etc/asterisk/mrcp.conf:

mrcp.conf

[general]
default-asr-profile = speech-lumenvox-mrcp2
default-tts-profile = speech-lumenvox-mrcp2

; UniMRCP logging level to appear in Asterisk logs. Options are:
; EMERGENCY|ALERT|CRITICAL|ERROR|WARNING|NOTICE|INFO|DEBUG -->
log-level = DEBUG
max-connection-count = 100
offer-new-connection = 1
; rx-buffer-size = 1024
; tx-buffer-size = 1024
; request-timeout = 60


;; Profile for LumenVox Speech Server MRCPv2;
[speech-lumenvox-mrcp2]
; MRCP version.version = 2
; === SIP settings ===; Must be set to the IP address of the MRCP server.
server-ip = 172.18.2.50
; SIP port on the MRCP server.
server-port = 5066
; server-username = test
force-destination = 1
; === SIP agent ===
; client-ip = 0.0.0.0
; Must be set to the IP address of the MRCP client.
client-ip = 172.18.2.50
; client-ext-ip = auto
; SIP port on the MRCP client.
client-port = 5068
; SIP transport either UDP or TCP.
sip-transport = udp
; ua-name = Asterisk
; sdp-origin = Asterisk
; sip-t1 = 500
; sip-t2 = 4000
; sip-t4 = 4000
; sip-t1x64 = 32000
; sip-timer-c = 185000
; === RTP factory ===
; rtp-ip = 0.0.0.0
; Must be set to the IP address of the MRCP client.
rtp-ip = 172.18.2.50
; rtp-ext-ip = auto
; RTP port range on the MRCP client.
rtp-port-min = 4000
rtp-port-max = 5000
; === Jitter buffer settings ===
playout-delay = 50
; min-playout-delay = 20
max-playout-delay = 200
; === RTP settings ===
ptime = 20
codecs = PCMU PCMA L16/96/8000 telephone-event/101/8000
; === RTCP settings ===
rtcp = 1
rtcp-bye = 2
rtcp-tx-interval = 5000
rtcp-rx-resolution = 1000

Three changes must be made for your environment:

  • Set server-ip to the IP address of the machine running the Media Server.
  • Set client-ip to the IP address of the machine running Asterisk.
  • Set rtp-ip to the IP address of the machine running Asterisk.

If the Media Server and Asterisk run on the same server, server-port and client-port must both differ from port 5060, or they will conflict with Asterisk. This example uses 5066 for the server port and 5068 for the client port.

Reload Asterisk after making these changes, then move on to testing the installation.

Configuring res_speech_unimrcp.so

Configuring res_speech_unimrcp.so is more involved than res_unimrcp.so. First, edit /etc/asterisk/res-speech-unimrcp.conf. Here is a sample to use:

res-speech-unimrcp.conf

[general]
; UniMRCP named profile. Options are:
;unimrcp-profile = uni2 ; UniMRCP MRCPv2 Server
;unimrcp-profile = uni1 ; UniMRCP MRCPv1 Server
;unimrcp-profile = lv1 ; LumenVox MRCPv1 Server
unimrcp-profile = lv2 ; LumenVox MRCPv2 Server (uncomment this line)

; UniMRCP logging level. Options are:
; EMERGENCY|ALERT|CRITICAL|ERROR|WARNING|NOTICE|INFO|DEBUG -->
log-level = DEBUG

; Preloaded grammars
[grammars]
;grammar-name = path-to-grammar-file

; MRCPv2 properties (recognizer and generic header fields)
; http://tools.ietf.org/html/draft-ietf-speechsc-mrcpv2-20#section-9.4
[mrcpv2-properties]
Recognition-Timeout = 20000
No-Input-Timeout = 15000

; MRCPv1 properties (recognizer and generic header fields)
; http://tools.ietf.org/html/rfc4463#section-8.4
[mrcpv1-properties]
Recognition-Timeout = 20000
No-Input-Timeout = 15000

Make sure the only profile left uncommented is lv2, so it is used as the default profile.

The settings for lv2 are defined in /usr/local/unimrcp/conf/client-profiles/lumenvox.xml. Here is a sample to use:

lumenvox.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- UniMRCP client document -->
<unimrcpclient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../unimrcpclient.xsd" version="1.0">
<settings>
<!-- SIP MRCPv2 settings -->
<sip-settings id="LumenVox-SIP-Settings">
<!-- Server address should be explicitly specified, it defaults to "ip" address set in the properties. -->
<server-ip>172.18.2.50</server-ip>
<server-port>5066</server-port>
<!-- <force-destination>true</force-destination> -->
</sip-settings>

<!-- RTSP MRCPv1 settings -->
<rtsp-settings id="LumenVox-RTSP-Settings">
<!-- Set to value of the LV Media Server's IP address -->

      <server-ip>127.0.0.1</server-ip>
<server-port>554</server-port>
<!-- <force-destination>true</force-destination> -->
<resource-location></resource-location>
<resource-map>
<param name="speechrecog" value="recognizer"/>
</resource-map>
</rtsp-settings>
</settings>

<profiles>
<!-- LumenVox MRCPv2 profile -->
<mrcpv2-profile id="lv2">
<sip-uac>SIP-Agent-1</sip-uac>
<mrcpv2-uac>MRCPv2-Agent-1</mrcpv2-uac>
<media-engine>Media-Engine-1</media-engine>
<rtp-factory>RTP-Factory-1</rtp-factory>
<sip-settings>LumenVox-SIP-Settings</sip-settings>
<rtp-settings>RTP-Settings-1</rtp-settings>
</mrcpv2-profile>

<!-- LumenVox MRCPv1 profile -->
<mrcpv1-profile id="lv1">
<rtsp-uac>RTSP-Agent-1</rtsp-uac>
<media-engine>Media-Engine-1</media-engine>
<rtp-factory>RTP-Factory-1</rtp-factory>
<rtsp-settings>LumenVox-RTSP-Settings</rtsp-settings>
<rtp-settings>RTP-Settings-1</rtp-settings>
</mrcpv1-profile>

</profiles>
</unimrcpclient>

Change the server-ip value in the SIP MRCPv2 section to the IP address of the Media Server. The server-port must also match the setting in mrcp.conf.

Finally, make one or two changes to /usr/local/unimrcp/conf/unimrcpclient.xml:

unimrcpclient.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- UniMRCP client document -->
<unimrcpclient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="unimrcpclient.xsd" version="1.0" subfolder="client-profiles">
  <properties>
    <!-- By default, network interface (IP address) to bind to will be implicitly identified. 
         Alternatively, it can be explicitly set.
    -->
    <!-- <ip type="auto"/> -->

    <!-- Set to the actual IP address of this machine. -->
    <ip>172.18.2.50</ip>

    <!-- <ext-ip>a.b.c.d</ext-ip> -->
    <!-- <server-ip>a.b.c.d</server-ip> -->
  </properties>

  <components>
    <!-- Factory of MRCP resources -->
    <resource-factory>
      <resource id="speechsynth" enable="true"/>
      <resource id="speechrecog" enable="true"/>
      <resource id="recorder" enable="true"/>
      <resource id="speakverify" enable="true"/>
    </resource-factory>

    <!-- SofiaSIP MRCPv2 signaling agent -->
    <sip-uac id="SIP-Agent-1" type="SofiaSIP">
      <!-- By default, "ip" and "ext-ip" addresses set in the properties will be used. 
           They still can be explicitly specified (overriden) here.
      -->
      <!-- <sip-ip>10.10.0.1</sip-ip> -->
      <!-- <sip-ext-ip>a.b.c.d</sip-ext-ip> -->
      <sip-port>8062</sip-port>
      <sip-transport>udp</sip-transport>
      <ua-name>UniMRCP SofiaSIP</ua-name>
      <sdp-origin>UniMRCPClient</sdp-origin>
      <!-- <sip-t1>500</sip-t1> -->
      <!-- <sip-t2>4000</sip-t2> -->
      <!-- <sip-t4>4000</sip-t4> -->
      <!-- <sip-t1x64>32000</sip-t1x64> -->
      <!-- <sip-message-output>true</sip-message-output> -->
      <!-- <sip-message-dump>/tmp/sofia-sip.log</sip-message-dump> -->
    </sip-uac>

    <!-- UniRTSP MRCPv1 signaling agent -->
    <rtsp-uac id="RTSP-Agent-1" type="UniRTSP">
      <max-connection-count>100</max-connection-count>
      <!-- <request-timeout>5000</request-timeout> -->
      <sdp-origin>UniMRCPClient</sdp-origin>
    </rtsp-uac>
    
    <!-- MRCPv2 connection agent -->
    <mrcpv2-uac id="MRCPv2-Agent-1">
      <max-connection-count>100</max-connection-count>
      <offer-new-connection>false</offer-new-connection>
      <rx-buffer-size>1024</rx-buffer-size>
      <tx-buffer-size>1024</tx-buffer-size>
      <!-- <request-timeout>5000</request-timeout> -->
    </mrcpv2-uac>
    
    <!-- Media processing engine -->
    <media-engine id="Media-Engine-1">
      <realtime-rate>1</realtime-rate>
    </media-engine>
    
    <!-- Factory of RTP terminations -->
    <rtp-factory id="RTP-Factory-1">
      <!-- By default, "ip" and "ext-ip" addresses set in the properties will be used. 
           They still can be explicitly specified (overriden) here.
      -->
      <!-- <rtp-ip>10.10.0.1</rtp-ip> -->
      <!-- <rtp-ext-ip>a.b.c.d</rtp-ext-ip> -->
      <rtp-port-min>4000</rtp-port-min>
      <rtp-port-max>5000</rtp-port-max>
    </rtp-factory>
  </components>
  
  <settings>
    <!-- common (default) RTP/RTCP settings -->
    <rtp-settings id="RTP-Settings-1">
      <jitter-buffer>
        <adaptive>1</adaptive>
        <playout-delay>50</playout-delay>
        <max-playout-delay>600</max-playout-delay>
        <time-skew-detection>1</time-skew-detection>
      </jitter-buffer>
      <ptime>20</ptime>
      <codecs>PCMU PCMA L16/96/8000 telephone-event/101/8000</codecs>
      <!-- <codecs>PCMU PCMA L16/96/8000 PCMU/97/16000 PCMA/98/16000 L16/99/16000</codecs> -->
      <!-- enable/disable RTCP support -->
      <rtcp enable="false">
        <!-- 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)
        -->
        <rtcp-bye>1</rtcp-bye>
        <!-- rtcp transmission interval in msec (set 0 to disable) -->
        <tx-interval>5000</tx-interval>
        <!-- period (timeout) to check for new rtcp messages in msec (set 0 to disable) -->
        <rx-resolution>1000</rx-resolution>
      </rtcp>
    </rtp-settings>
  </settings>  
</unimrcpclient> 

The <ip> value in the first <properties> section must be set to the IP address of the machine running Asterisk. Also verify that the <codecs> setting in the RTP/RTCP section is set as shown above.

Reload Asterisk after making these changes, then move on to testing the installation.

Related Articles


Was this article helpful?