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



Descrição do Algoritmo:
O algoritmo depende da duração da saudação e do silêncio ou falta del que se segue à saudação. Por exemplo, uma pessoa normalmente atender o telefone com um simples Aló?, seguido por um período de silêncio. Essas pessoas também podem ter uma saudação um pouco mais longa, como Aló! Delphini, pois não?, seguida por um período de silêncio. As secretárias eletrônicas normalmente têm saudações muito mais longas, sem longos períodos de silêncio, como Olá! Você ligou para a residência do Delphini, deixe uma mensagem após o bipe

Usando uma função de energia de curto tempo, o algoritmo determina quando uma pessoa está falando e quando ela fez transição para o silêncio e determina se a pessoa chamada é uma pessoa viva ou uma secretária eletrônica.

A taxa de passagem zero de curto tempo é usada para determinar se a energia detectada é fala ou um tom sinusoidal (Um senoide ou sinusoide - também chamado de onda seno, onda senoidal, ou onda sinusoidal - é uma curva matemática que descreve uma oscilação repetitiva suave, sendo esta uma onda contínua. É nomeada após a função seno, leia mais sobre isso aqui. Ou um par de tons, tal como DTMF). O algoritmo AMD rejeitará tons e não os confundirá com possível fala. Isso é necessário porque algumas secretárias eletrônicas podem iniciar sua mensagem com um tom. Além disso, os produtos do tipo Telezapper agora são frequentemente usados para tentar enganar discadores preditivos, reproduzindo um ou uma série de tons (tom de reordenar) antes que a secretária eletrônica ou a pessoa atendam. Este algoritmo precisa rejeitar esses tons e ouvir apenas a fala.

Devido à natureza do processo de detecção descrito aqui, deve-se observar que a taxa de detecção não é e nunca poderá ser 100%. As mensagens da secretária eletrônica podem ser muito diversas, podem incluir música ou outro ruído, etc., todas afetando o algoritmo e seu processo de tomada de decisão. Outro fato importante é que o AMD( ) e WaitForSilence( ) existentes em Open Source Telephony Systems (Asterisk SCF, OpenSER, Kamailio, OpenSIPs e FreeSWITCH),  foram projetados para PSTN (ISDN e POTS), e não para ITSP (SIP), logo é importante ter isso em mente. Outro ponto é que se de fato usa uma ITSP, o CODEC G729a vai derrubar fatores importantes do algoritmo. Mas tenha em mente que como não temos uma rede 100% VoIP, sempre seremos atendido por uma CPA. 

Chaves de registro do discador CPA que afetam o comportamento do AMD:

Valor recomendado da chave de registro (unidades) e Definição do valor padrão (unidades):
  • CPAMinSilencePeriod 375 (ms) e 608 (ms), quantidade de tempo que o sinal deve ser silencioso após a detecção de fala para declarar uma voz ao vivo.
  • CPAAnalysisPeriod 2500 (ms) 1592 (ms), quantidade de tempo (a partir do momento em que o sistema detecta a fala pela primeira vez) em que a análise será realizada no áudio de entrada.
  • CPAMaxTimeAnalysis 3000 (ms) 8000 (ms), o período em que CPAAnalysisPeriod deve iniciar e parar ou a voz será declarada. Este temporizador começa off-hook (fora do gancho).
  • CPAMaxTermToneAnalysis 12000 (ms) 30000 (ms), está é a quantidade de tempo que o algoritmo irá procurar por um bipe de finalização, uma vez que o algoritmo detectou uma secretária eletrônica.
Outras chaves de registro do discador CPA:

Valor recomendado da chave de registro (unidades) e Definição do valor padrão (unidades):
  • CPANoiseThresholdPeriod 100 (ms) 32 (ms), quantidade de tempo que o algoritmo CPA usa para calcular o nível do ruído (Noise Floor).
  • CPAMinimumValidSpeechTime 112 (ms) 112 (ms), quantidade de tempo que essa energia deve estar ativa antes do discurso declarado. Qualquer coisa menos é considerada uma falha.
  • CPAMaxNoiseFloor 10000 10000, limite do limiar de ruído. Não permitido exceder 10000.
  • CPAMinNoiseFloor 1000 1000, Limite do limiar de ruído. Não pode ser inferior a 1000.
  • CPAJitterBufferDelay 150 (ms) 100 (ms), Jitter Buffer Delay.
  • CPAActiveThreshold 32 (dB) 32 (dB), o sinal deve exceder CPAActiveThreshold * CPANoiseThresholdPeriod para ser considerado ativo. Por exemplo, 32 é 10 * log (32) = 15 dB.
Exemplos:
Observação:
  • CPAMaxTimeAnalysis começa na detecção de off-hook (fora do gancho);
  • Assim que o algoritmo AMD( ) declara voz ativa, um possível humano, a chamada é transferida para o ponto de rota;
  • CPAMaxTimeAnalysis é discutível uma vez que a voz é detectada.
Observação:

  • O algoritmo declara secretária eletrônica porque após a detecção de voz, não houve períodos de silêncio de pelo menos CPAMinSilencePeriod de comprimento.
  • Se nenhum bipe for detectado durante o período de CPAMaxTermToneAnalysis, a chamada será transferida no final do período.
  • O algoritmo declarará a secretária eletrônica e começará a procurar o bipe assim que CPAAnalysisPeriod expirar.
  • CPAMaxTimeAnalysis é discutível uma vez que a voz é detectada.
Como podemos ver, isso já não era e agora mais ainda não é uma ciência exata, logo o que você deve fazer, calcular todos esses parâmetros de cada operadora que deseja detectar a secretária eletrônica, agora chamadas de caixa postal, continuarei chamando de secretária eletrônica. O que você deve saber para que os parâmetros do AMD() estejam corretos? Veja a descrição:

AMD([initialSilence,[greeting,[afterGreetingSilence,[totalAnalysis Time,[miniumWordLength,[betweenWordSilence,[maximumNumberOfWords,[silenceThreshold,[maximumWordLength]]]]]]]]])

Argumentos:
  • initialSilence - É duração máxima silêncio inicial antes de saudação. Se esse número for excedido definida como MACHINE;
  • greeting - é o comprimento máximo de uma saudação. Se esse número for excedido definida como MACHINE;
  • afterGreetingSilence - é o silêncio após a detecção de uma saudação. Se esse número for excedido definido como HUMANO;
  • totalAnalysis Time - é o tempo máximo permitido para o algoritmo para decidir se é HUMAN ou MACHINE;
  • miniumWordLength - é a duração mínima de Voz considerada uma palavra;
  • betweenWordSilence - é a duração mínima de silêncio depois de uma palavra para considerar o áudio a seguir para ser uma nova palavra;
  • maximumNumberOfWords - é o número máximo de palavras em uma saudação Se esse número for excedido definida como MACHINE;
  • silenceThreshold - Quanto tempo nós consideramos o silêncio;
  • maximumWordLength - é a duração máxima de uma palavra de aceitar. Se ultrapassado definida como MACHINE.
Agora de detemos essas informações, o que temos que fazer, é pegar os parâmetros para que o algoritmo funcione corretamente, então você vai ter que ter essas informações de cada operadora móvel, e da telefonia fixa, a seguir vamos pensar que temos essas informações.

Descrição Answering Machine Detect - AMD:

Esta aplicação "tenta" detectar atendedores de chamadas no início de uma chamadas de saída. Basta encaminhar para esse aplicativo (Application_AMD) após a chamada ser atendida (somente chamadas originadas, é claro).

Quando carregado, AMD lê "amd.conf" e usa os parâmetros especificados como valores padrão. Esses valores padrão é substituído quando o aplicativo AMD() é chamando com parâmetros.

Esta aplicação define as seguintes variáveis ​​de canal:

  • ${AMDSTATUS} - Este é o estado de detecção do atendedor de chamadas.
    • MACHINE - MÁQUINA;
    • HUMAN - HUMANO;
    • NOTSURE - NÃO TENHO CERTEZA;
    • HANGUP - DESLIGOU.
  • ${AMDCAUSE} - Indica a causa que levou à conclusão de TOOLONG - Tempo Total;
    • INITIALSILENCE - Duração do Silêncio - initialSilence;
    • HUMAN - Duração do Silêncio - afterGreetingSilence;
    • LONGGREETING - Duração da Voz Humana - Greeting;
    • MAXWORDLENGTH - número máximo de palavras - Word Count.

Descrição WaitForSilence - WFS:

Aguarda até que o silêncio necessário seja alcançado (milissegundos), nos tempos de iterações. Um tempo limite opcional especifica o número de segundos para retornar depois, mesmo se não recebermos a quantidade especificada de silêncio.

Use o tempo limite com cuidado, pois isso pode anular o objetivo deste aplicativo, que é esperar indefinidamente até que o silêncio seja detectado na linha. 

Isso é particularmente útil para aplicativos de transmissão de chamada do tipo reverso 911, nos quais é necessário aguardar que uma secretária eletrônica complete sua fala antes de reproduzir uma mensagem. Normalmente, você deseja incluir duas ou mais para que o WaitForSilence saiba como lidar com uma secretária eletrônica; primeiro esperando o áudio terminar, depois esperando o sinal sonoro (bipe), etc. 

Exemplos: 
  • WaitForSilence(500,2), aguardará 1/2 segundo de silêncio, duas vezes;
  • WaitForSilence(1000), aguardará 1 segundo de silêncio, uma vez;
  • WaitForSilence(300,3,10), aguardará 300ms de silêncio, 3 vezes, e retornará após 10 segundos, mesmo que o silêncio não seja detectado. 
Com esses parâmetros o algoritmo vai definir a variável de canal WAITSTATUS para um destes valores: 
  • SILENCE - se encerrado com o silêncio detectado; 
  • TIMEOUT - se encerrado sem que o silêncio seja detectado após o tempo limite. 
Quando utilizando a aplicação WaitForSilence(), há três parâmetros.
  • SILENCEREQUIRED é a duração, em milissegundos, de silêncio que vamos esperar.
  • ITERATIONS é o número de ocorrências do silêncio com duração em milissegundos. 
  • 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-and-wfs-detect]
exten => s,1,Verbose(AMD and WFS Detect)
 same =>   n,Answer( )
 same =>   n,Set(WFS-SILENCEREQUIRED=2500) 
 same =>   n,Set(WFS-ITERATIONS=1)
 same =>   n,Set(WFS-TIMEOUT="")
 same =>   n,Set(AMD-PARAMETER= 2250|1500|1250|5000|100|50|3|8|256)
 same =>   n,Background(silence/1)
 same =>   n,AMD(${AMD-PARAMETER})
 same =>   n,Verbose("AMD STATUS: ${AMDSTATUS} - ${AMDCAUSE})
 same =>   n,GotoIf($["${AMDSTATUS}" = "MACHINE"]?machine)
 same =>   n,Set(TIMEOUT(response)=5)
 same =>   n,Background(custom/${HUMANMSG})
 same =>   n,Read(ack,,1)
 same =>   n,GotoIf($["${ack}" = "1"]?confirmed)
 same =>   n,HangUp( )
 same =>   n(confirmed), UserEvent(CALLSTATUS,UNIQUEID:${UNIQUEID},V:OK)
 same =>   n,Wait(1)
 same =>   n(machine),UserEvent(CALLSTATUS,UNIQUEID:${UNIQUEID},V:AMD)
 same =>   n,WaitForSilence(${WFS-SILENCEREQUIRED},${WFS-ITERATIONS},${WFS-TIMEOUT})
 same =>   n,Background(custom/${MACHINEMSG}) 
 same =>   n,UserEvent(CALLSTATUS,UNIQUEID:${UNIQUEID},V:AMDALL) 
 same =>   n,Wait(1)
 same =>   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@inphonex.com.br 
Context: amd-and-wfs-detect 
Callerid: Serviço de Mensagem <(031)39392001>
Extension: s Priority: 1 
#

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 "1" segundo para uma ocorrência de silêncio com duração do "2500" milissegundos antes de retornar controle para o Dialplan.

No *CLI> a saída, nos fornece a seguinte observação -- "-- Waiting 1 time(s) for 2500ms silence'. and the next line"-- ou seja que está aguardando "2500ms" 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. Observe, que cada secretária eletrônica tem o seu próprio tempo limitador para fazer o "TimeOut" antes de desligar a chamada quando não "há áudio/voz detectada".

As configurações acima não foi para detectar um humano e sim detectar o mais rápido possível se a chamada foi atendida por uma secretaria eletrônica. 

Para usar isso, o arquivo da chamada é movido para o "/var/spool/asterisk/outgoing". Asterisk faz 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 Verbose("${WAITSTATUS}")  mas não estamos agindo sobre ela.


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

Nenhum comentário

Toda vez que um homem supera os reveses, torna-se mentalmente e espiritualmente mais forte!

Tecnologia do Blogger.