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.
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
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 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
[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
.
[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
[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