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(SILENCEOCCURANCES="")
exten => 11,n,Set(SILENCETIMEOUT=38)
exten => 11,n,NoOp(SILENCEDURATION=${SILENCEDURATION})
exten => 11,n,NoOp(SILENCEOCCURANCES=${SILENCEOCCURANCES})
exten => 11,n,NoOp(SILENCETIMEOUT=${SILENCETIMEOUT})
exten => 11,n,Answer()
exten => 11,n,WaitForSilence(${SILENCEDURATION},${SILENCEOCCURANCES},${SILENCETIMEOUT})
exten => 11,n,NoOp(Retorno: WAITSTATUS=${WAITSTATUS})
exten => 11,n,Playback(br/msg_importante_vinda)
exten => 11,n,Playback(obrigado)
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
Extension: 11
Priority: 1
#
Callerid: Serviço de Mensagem <(031)39392001>

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.