Skip to content

Asterisk via MRCP (Media Relay Control Protocol)

Instalação do UniMRCP para Asterisk

Vamos usar o Asterisk 18 em nosso exemplo. O Asterisk 19 não é mais suportado e o Asterisk 20 não foi testado com o UniMRCP. Então, as instruções para instalação são as seguintes:

Nota: O servidor UniMRCP já deve estar instalado e funcionando.

bash
apt -y install build-essential git curl wget libnewt-dev libssl-dev libncurses5-dev subversion libsqlite3-dev libjansson-dev libxml2-dev uuid-dev default-libmysqlclient-dev
groupadd asterisk
useradd -r -d /var/lib/asterisk -g asterisk asterisk
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz
tar -zxvf asterisk-18-current.tar.gz
cd asterisk-18.23.1
./contrib/scripts/get_mp3_source.sh
./contrib/scripts/install_prereq install
./configure --with-jansson-bundled --with-pjproject-bundled
make
make install
make samples
make config
make install-headers
ldconfig
chown -R asterisk.asterisk /etc/asterisk
chown -R asterisk.asterisk /var/{lib,log,spool}/asterisk
chown -R asterisk.asterisk /usr/lib/asterisk
systemctl enable asterisk
systemctl start asterisk

Instalação do UniMRCP para Asterisk

bash
curl -O -J -L https://www.unimrcp.org/project/component-view/asterisk-unimrcp-1-10-0-tar-gz/download
./bootstrap
./configure
make
make install

Configuração do UniMRCP para Asterisk

Existem duas maneiras de usar o Asterisk com o UniMRCP. A forma antiga, usando o módulo res_speech_unimrcp, ou a nova forma, usando app_unimrcp. A última é um pouco mais flexível. O diagrama de configuração está abaixo.

Por favor, altere o ambiente e o endereço IP de acordo com sua própria instalação.

API Genérica de Reconhecimento de Fala

Este método usa o módulo res_speech_unimrcp. Nesse caso, você precisa configurar o unimrcpclient.xml e o arquivo res_speech_unimrcp.conf.

/usr/local/unimrcp/conf/unimrcpclient.xml

xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Documento do cliente UniMRCP -->
<unimrcpclient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:noNamespaceSchemaLocation="unimrcpclient.xsd"
               version="1.0"
               subfolder="client-profiles">
  <properties>
    <ip>192.168.86.39</ip>
    <server-ip>192.168.86.39</server-ip>
  </properties>
  <components>
    <!-- Fábrica de recursos MRCP -->
    <resource-factory>
      <resource id="speechsynth" enable="true"/>
      <resource id="speechrecog" enable="true"/>
      <resource id="recorder" enable="true"/>
      <resource id="speakverify" enable="true"/>
    </resource-factory>

    <sip-uac id="SIP-Agent-1" type="SofiaSIP">
      <sip-ip>192.168.86.39</sip-ip>
      <sip-port>8062</sip-port>
      <sip-transport>udp</sip-transport>
      <ua-name>UniMRCP SofiaSIP</ua-name>
      <sdp-origin>UniMRCPClient</sdp-origin>
    </sip-uac>

    <!-- Agente de sinalização UniRTSP MRCPv1 -->
    <rtsp-uac id="RTSP-Agent-1" type="UniRTSP">
      <max-connection-count>100</max-connection-count>
      <sdp-origin>UniMRCPClient</sdp-origin>
    </rtsp-uac>

    <!-- Agente de conexão MRCPv2 -->
    <mrcpv2-uac id="MRCPv2-Agent-1">
      <max-connection-count>100</max-connection-count>
      <max-shared-use-count>100</max-shared-use-count>
      <offer-new-connection>false</offer-new-connection>
      <rx-buffer-size>1024</rx-buffer-size>
      <tx-buffer-size>1024</tx-buffer-size>
    </mrcpv2-uac>

    <!-- Motor de processamento de mídia -->
    <media-engine id="Media-Engine-1">
      <realtime-rate>1</realtime-rate>
    </media-engine>

    <!-- Fábrica de terminações RTP -->
    <rtp-factory id="RTP-Factory-1">
      <rtp-port-min>4000</rtp-port-min>
      <rtp-port-max>5000</rtp-port-max>
    </rtp-factory>
  </components>

  <settings>
    <!-- Configurações RTP/RTCP comuns (padrão) -->
    <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 PCMU/97/16000 PCMA/98/16000 L16/99/16000</codecs>

      <!-- Habilitar/desabilitar suporte RTCP -->
      <rtcp enable="false">
        <rtcp-bye>1</rtcp-bye>
        <tx-interval>5000</tx-interval>
        <rx-resolution>1000</rx-resolution>
      </rtcp>
    </rtp-settings>
  </settings>
</unimrcpclient>

/etc/asterisk/res-speech-unimrcp.conf

ini
[general]
unimrcp-profile = uni2      ; Servidor UniMRCP MRCPv2
log-level = DEBUG

[grammars]
[mrcpv2-properties]
Recognition-Timeout = 20000
No-Input-Timeout = 15000

[mrcpv1-properties]
Recognition-Timeout = 20000
No-Input-Timeout = 15000

Aplicações MRCP

Você deve escolher uma ou outra forma de trabalhar: com o sistema genérico ou com as aplicações do UniMRCP. Você pode usar ambos ao mesmo tempo, mas precisará configurar os dois. A aplicação MRCP é mais simples de configurar, basta configurar o arquivo mrcp.conf.

ini
[general]
; Perfis padrão de ASR e TTS.
default-asr-profile = uni2
default-tts-profile = uni2
log-level = DEBUG
max-connection-count = 100
max-shared-count = 100
offer-new-connection = 1

[uni2]
; Configurações MRCP
version = 2
;
; Configurações SIP
server-ip = 192.168.86.39
server-port = 8060
; Agente de usuário SIP
client-ip = 192.168.86.39
client-port = 8063
sip-transport = udp
;
; Fábrica de RTP
rtp-ip = 192.168.86.39
rtp-port-min = 28000
rtp-port-max = 29000
;
; Configurações do buffer de jitter
playout-delay = 50
max-playout-delay = 200
; Configurações RTP
ptime = 20
codecs=G722 PCMU telephone-event/101/8000
; Configurações RTCP
rtcp = 0

Testando o Reconhecimento de Fala

Depois de instalar e configurar o Asterisk e o res-speech-unimrcp.conf, reinicie o seu servidor Asterisk. Você pode encontrar muitos mais exemplos em:

Manual do UniMRCP para Asterisk

ini
[default]
exten => 700,1,goto(res-speech-unimrcp-1,s,1)
exten => 701,1,goto(synth-unimrcp-1,s,1)
exten => 702,1,goto(synthandrecog-unimrcp-1,s,1)

[res-speech-unimrcp-1]
exten => s,1,Answer()
exten => s,2,SpeechCreate()
exten => s,3,NoOP()
exten => s,4,SpeechActivateGrammar(builtin:speech/transcribe?language=en)
exten => s,5,SpeechBackground(beep, 20)

exten => s,6,Verbose(1, "Recognition result count: ${SPEECH(results)}")
exten => s,7,GotoIf($["${SPEECH(results)}" = "0"]?8:10)
exten => s,8,Verbose(1, "Failed to recognize")
exten => s,9,Goto(30)
exten => s,10,Verbose(1, "Recognition result: ${SPEECH_TEXT(0)}, confidence score: ${SPEECH_SCORE(0)}, grammar-uri: ${SPEECH_GRAMMAR(0)}")
exten => s,11,SpeechDestroy()
exten => s,12,Hangup()

[synth-unimrcp-1]
exten => s,1,Answer
exten => s,n,MRCPSynth(I am unimrcp, the most mature way to synthesize voice!,v=en-US-JennyNeural)

[synthandrecog-unimrcp-1]
exten => s,1,Answer
exten => s,n,SynthAndRecog(Please say a number,builtin:grammar/number,t=5000&b=1&ct=0.7&spl=en-US)
exten => s,n,Verbose(1, ${RECOG_STATUS}, ${RECOG_COMPLETION_CAUSE}, ${RECOG_RESULT})
exten => s,n,Hangup