Respondendo Detecção de máquina com WaitForSilence( )




Problema:

Usando WaitForSilence( ) para detectar quando iniciar o aplicativo Play( ) quando uma maquina realizar o atendimento (answering machine) da chamada em curso.

Solução:

Quando utilizando a aplicação WaitForSilence (), há três parâmetros.

  • SILENCE DURATION é a duração, em milissegundos, de silêncio que vamos esperar.
  • SILENCE OCCURANCES é o número de ocorrências do silêncio com duração em milissegundos. 
  • SILENCE TIMEOUT é o tempo total para a aplicação esperar após o tempo limite para liberar o controle de volta para o Dialplan (em AEL e LUA é mais rápido).

[amd-outros]
exten => 11,1,NoOp(Começando exten 11 e outras coisas)
exten => 11,n,Set(SILENCEDURATION=4300) 
exten => 11,n,Set(SILENCETIMEOUT=38)
exten => 11,n,Set(SILENCEOCCURANCES="") 
exten => 11,n,NoOp(SILENCEOCCURANCES=${SILENCEOCCURANCES})
exten => 11,n,NoOp(SILENCEDURATION=${SILENCEDURATION}) 
exten => 11,n,WaitForSilence(${SILENCEDURATION},${SILENCEOCCURANCES},${SILENCETIMEOUT})
exten => 11,n,NoOp(SILENCETIMEOUT=${SILENCETIMEOUT}) 
exten => 11,n,Answer() 
exten => 11,n,Playback(obrigado)
exten => 11,n,NoOp(Retorno: WAITSTATUS=${WAITSTATUS}) 
exten => 11,n,Playback(br/msg_importante_vinda) 
exten => 11,n,Wait(1) 
exten => 11,n,Hangup
Associar ao arquivo chamada.call.
# Este é um exemplo de arquivo que podem ser despejados em /var/spool/asterisk/outgoing
# para gerar um chamada.call 
Channel: SIP/0313939200@192.168.0.254 
Context: amd-outros 
Callerid: Serviço de Mensagem <(031)39392001>
Extension: 11 Priority: 1 
#

Verbosity is at least 3
-- Attempting call on SIP/03139392000 for 11@amd-outros:1 (Retry 1)
-- Executing [11@amd-stuff:1] NoOp("SIP/0313939...", "Começando exten exten 11 e outras coisas") in new stack
-- Executing [11@amd-stuff:2] Set("SIP/0313939...", "SILENCEDURATION=4300") in new stack
-- Executing [11@amd-stuff:3] Set("SIP/0313939...", "SILENCEOCCURANCES=""") in new stack
-- Executing [11@amd-stuff:4] Set("SIP/0313939...", "SILENCETIMEOUT=38") in new stack
-- Executing [11@amd-stuff:5] NoOp("SIP/0313939...", " SILENCEDURATION=4300 ") in new stack
-- Executing [11@amd-stuff:6] NoOp("SIP/0313939...", " SILENCEOCCURANCES= ") in new stack
-- Executing [11@amd-stuff:7] NoOp("SIP/0313939...", " SILENCETIMEOUT=38 ") in new stack
-- Executing [11@amd-stuff:9] Answer("SIP/0313939...", "") in new stack
-- Executing [11@amd-stuff:10] WaitForSilence("SIP/0313939...", "4300||38") in new stack
-- Waiting 1 time(s) for 4300 ms silence with 0 timeout -- Exiting with 4300ms silence >= 4300ms required 
-- Executing [11@amd-stuff:11] NoOp("SIP/0313939...", "Retorno: WAITSTATUS=SILENCE ") in new stack
-- Executing [11@amd-stuff:12] Playback("SIP/0313939...", "br/msg_importante_vinda") in new stack
-- Playing 'br/msg_importante_vinda' (language 'br')
-- Executing [11@amd-stuff:13] Playback("SIP/0313939...", "obrigado") in new stack
-- Playing 'obrigado' (language 'br')
-- Playing 'br/msg_importante_vinda' (language 'br')
-- Executing [11@amd-stuff:15] Wait("SIP/0313939...", "1") in new stack
-- Executing [11@amd-stuff:16] Hangup("SIP/0313939...", "") in new stack
== Spawn extension (amd-stuff, 11, 16) exited non-zero on 'SIP/0313939...'
-- Hungup 'SIP/0313939...'
[Set 10 00:13:48] NOTICE[2540]: pbx_spool.c:351 attempt_thread: Call completed to SIP/03939392000@192.168.0.254

Este exemplo está configurado para testar uma variedade de atendedores de chamadas. Nós usamos o aplicativo "Set( )" para fornecer acesso fácil para alterar os parâmetros para "WaitForSilence( )".

O "WaitForSilence( ) é usado imediatamente após a "Answer( )" e o Dialplan. Vai esperar "38" segundos para uma ocorrência de silêncio com duração do "4300" milissegundos antes de retornar controle para o Dialplan.

No *CLI> a saída, nos fornece a seguinte observação -- "-- Waiting 1 time(s) for 4300ms silence'. and the next line"-- ou seja que está aguardando "4300ms" de silêncio para executar a próxima linha. Com isto o Dialplan fica aguardando a mensagem da secretária eletrônica para completar, e parar de gravar a voz ou mensagem de entrada. Observer, que cada máquina de resposta pode ter o seu próprio tempo limitador para fazer o "TimeOut" antes de desligar a chamada quando não "há áudio/voz detectada".

Para usar isso, o arquivo da chamada é movido para o "/var/spool/asterisk/outgoing". Asterisk vaz a leitura quase que imediato deste arquivo (chamada.call) e processa a chamada.

Esta aplicação define a variável de canal chamado "${WAITSTATUS}" a qualquer "SILENCE" (silencio encontrado) ou "TimeOut" (tempo limite atingido). Neste exemplo, nós estamos somente imprimindo (NoOp) "${WAITSTATUS}"  mas não estamos agindo sobre ela.


Veja também: AMD( ) , WaitForRing( ).

Nenhum comentário

Tecnologia do Blogger.