Asterisk via MRCP - Protocolo de Controle de Retransmissão de Mídia
Instalação do UniMRCP para Asterisk
Usaremos o Asterisk 18 em nosso exemplo. O Asterisk 19 não é mais suportado e o Asterisk 20 não foi testado com o UniMRCP. Portanto, as instruções para instalar são as seguintes:
Nota: O servidor UniMRCP já deve estar instalado e funcionando.
cd ~
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 sox ffmpeg
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 Asterisk UniMRCP
cd ~
curl -O -J -L https://www.unimrcp.org/project/component-view/asterisk-unimrcp-1-10-0-tar-gz/download
tar -xzvf asterisk-unimrcp-1.10.0.tar.gz
cd asterisk-unimrcp-1.10.0
./bootstrap
./configure
make
make install
Configuração do Asterisk UniMRCP
Existem duas maneiras de usar o Asterisk com 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. Neste caso, você deve configurar o unimrcpclient.xml e o arquivo res_speech_unimrcp.conf.
atualize o endereço IP no arquivo para usar o seu próprio
/usr/local/unimrcp/conf/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>
<ip>192.168.86.39</ip>
<server-ip>192.168.86.39</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>
<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>
<!-- UniRTSP MRCPv1 signaling agent -->
<rtsp-uac id="RTSP-Agent-1" type="UniRTSP">
<max-connection-count>100</max-connection-count>
<sdp-origin>UniMRCPClient</sdp-origin>
</rtsp-uac>
<!-- MRCPv2 connection agent -->
<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>
<!-- 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">
<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 PCMU/97/16000 PCMA/98/16000 L16/99/16000</codecs>
<!-- Enable/disable RTCP support -->
<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 ; UniMRCP MRCPv2 Server
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 de UniMRCP. Você pode trabalhar com os dois ao mesmo tempo, mas terá que configurar ambos. A aplicação MRCP é mais simples de configurar, bastando configurar o arquivo mrcp.conf.
Por favor, atualize o Endereço IP
[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 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 res-speech-unimrcp.conf, por favor reinicie seu servidor asterisk. Você pode encontrar muito mais exemplos em:
Manual do UniMRCP para Asterisk
Este plugin possui parâmetros específicos do fornecedor para uso com MRCPSynth e SynthandRecog.
prompt (Prompt para o uso de modelos ASR generativos)
sttmodel
Você pode usar
- pulse-precision (mais preciso)
- whisper-chat (mais rápido)
- whisper-1 (OpenAI)
ttsmodel
- azure-tts
Nota: Atualmente, suportamos apenas azure-tts porque é capaz de retornar pcm 8khz. O uso de outros modelos exigiria que traduzíssemos em tempo real o formato, causando problemas de desempenho.
Exemplo:
Ao usar mais de um VSP, use %3B para separar os pares de valores de atributos como no exemplo. Todos os exemplos abaixo foram testados com sucesso.
O Whisper é mais preciso quando você passa um prompt, geralmente a pergunta feita ao usuário é um bom prompt.
Não omita parâmetros como Voice, porque é obrigatório. O modelo stt padrão é whisper-1, o ttsmodel padrão é azure-tts. O prompt padrão é ""
[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 quick voice!",v=en-US-JennyNeural)
[synthandrecog-unimrcp-1]
exten => s,1,Answer
exten => s,n,SynthAndRecog(Please say a number,builtin:speech/transcribe,b=0&ct=0.7&t=5000&sct=1000&nit=1000&vn=en-US-JennyNeural&spl=en&vsp=prompt=This was said to the customer, Please say a number%3Bsttmodel=pulse-precision)
exten => s,n,Verbose(1, ${RECOG_STATUS}, ${RECOG_COMPLETION_CAUSE}, ${RECOG_RESULT})
exten => s,n,Hangup