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:

.

Não realizamos upload dos ficheiros, apenas reportamos os links que encontramos na própria Internet. Assim, toda e qualquer responsabilidade não caberá ao administrador deste blog. Este blog não tem como objetivo reproduzir as obras, apenas divulgar o que foi encontrado na Internet. Os filmes aqui informado são de cunho científico assim como as series as quais são produzidas para exibição em TV aberta. Uma vez que a serie não tenha sido ripada de um DVD ou seja a mesma foi gravada do sinal de TV aberta com o respectivo selo da emissora não é caracterizado crime pois a mesma foi produzida para exibição pública. Sera crime quando for realizado venda deste produto. Quem efetuar download de qualquer ficheiro deste blog que não tenha seu conteúdo de base Open Source (Código Aberto) ou FOSS (Free Open Source Software) deverá estar ciente que terá 24 horas para eliminar os ficheiros que baixou. Assista-o e procure Revendas Autorizadas. Se algo contido no blog lhe causa dano ou prejuízo, entre em contacto, que iremos retirar o ficheiro ou post o mais rápido possível. Se encontrou algum post que considere de sua autoria favor enviar e-mail para suporte@delphini.com.br informando o post e comprovando sua veracidade.

Muito obrigado a todos que fizeram deste blog um sucesso.

Creative CommonsEsta obra está licenciada sob uma Licença Creative Commons. Você pode copiar, distribuir, exibir, executar, desde que seja dado crédito ao autor original (Citando nome do autor, data, local e link de onde tirou o texto). Você não pode fazer uso comercial desta obra.Você não pode criar obras derivadas.