Detecção de Dígitos
Início  Anterior  Próximo



A VoicerLib permite detectar dígitos tanto em tom como em pulso, entretanto a deteção de pulso é desabilitada por default podendo ser habilitada pelo método EnablePulseDetection e desabilitada pelo método DisablePulseDetection.
 
A deteção por tom esta sempre habilitada e disponível. Não há como desabilitá-la  
 
O funcionamento das duas deteções é praticamente o mesmo exceto pelo fato que a deteção de tom pode ser feita durante a reprodução de uma mensagem e a de pulso somente no silêncio após a mensagem.
 
Habilite a deteção de pulso somente quando for necessário, pois caso contrário, uma deteção de pulso habilitada, por exemplo, durante a reprodução pode causar inúmeros talk-offs  
 
A VoicerLib permite tratar o reconhecimento de dígitos de duas maneiras diferentes.

A primeira é através do evento OnDigitDetected, que é gerado sempre que um digito qualquer for detectado pela placa. O dígito detectado será passado através do parâmetro Digit do evento. Este parâmetro conterá o código ASCII do dígito.

Caso o programador implemente algum tratamento neste evento, deve tomar cuidado de saber o momento em que ele ocorreu, pois a detecção neste caso estará habilitada o tempo todo.

É uma maneira pouco recomendada por causa problema de talk-off que pode ocorrer durante o atendimento.
 
TALK-OFF: A voz humana, em uma conversa normal, pode conter a mesma freqüência dos dígitos detectados pela placa, portanto, quando o operador ou o interlocutor falar, algum dígito pode ser detectado e se o tratamento no OnDigitDetected não for adequado, o sistema pode ter algum mal funcionamento operacional.  
Para mensagens faladas através de arquivos SIG, o problema de talk-off não ocorre, pois o hardware consegue filtrar as freqüências conhecidas.  
 
Uma aplicação típica que se recomenda a utilização do evento OnDigitDetected é na identificação de chamadas. Leia mais no tópico Identificação de Chamadas logo a seguir.
 
Exemplo:

Neste exemplo, o dígito é detectado o tempo inteiro e mostrado na tela.
 
Private Sub VoicerLibX1_OnDigitDetected(Port As Integer, Digit   
As Integer)  
    lblStatus.Caption = "Detectou Digito " +  
                         Chr$(voicerlibx1.ReadDigits(Port))  
End Sub  
 
 
A segunda maneira de detectar dígitos é através do método GetDigits.

O método GetDigits inicia a monitoração de dígitos, sendo que é possível determinar o número máximo de dígitos, se esperará um digito terminador, e tempos máximos para recepção destes dígitos.

Após o início da monitoração, o evento OnDigitsReceived pode ocorrer a qualquer momento. Este evento ocorre quando uma das condições impostas pelo método GetDigits for satisfeita.

Durante a monitoração é possível cancelar o andamento do GetDigits através do método CancelGetDigits. Se esse método for chamado, o GetDigits será cancelado mas o evento OnDigitsReceived não será gerado e o buffer de dígitos será apagado. O método CancelGetDigits deverá ser chamado principalmente em situações onde a ligação foi terminada durante o GetDigits.


A propriedade AutoClearDigits também interfere no funcionamento do método GetDigits, ou seja, se esta propriedade estiver true (default), os dígitos são apagados dos buffers internos dos canais quando o GetDigits for chamado; se estiver false os dígitos permanecerão até ser chamado o método ClearDigits(Porta).

Se for necessário apagar a propriedade Digits manualmente, utilize o método ClearDigits.

Exemplo:

No exemplo abaixo o GetDigits inicia esperando até 5 dígitos, ou até receber o terminador # por no máximo 10 segundos de espera total ou 5 segundos de intervalo entre cada dígito:


Private Sub Espera Digito()  
 
   VoicerLibX1.GetDigits Porta,5,"#",10000,5000  
End Sub  
 
 
'No evento OnDigitsReceived é que será tratado os digitos  
'recebidos, ou verificado timeout  
Private Sub VoicerLibX1_OnDigitsReceived(Port As Integer,   
Status As VoicerLib.TxWaitDigit)  
      
    Select Case Status  
        Case edMaxDigits:  
      'Alcançou o máximo de digitos, disca para o ramal  
      '......  
        Case edTermDigit:  
      'Recebeu um número com # no fim  
        '......  
         Case edDigitTimeOut:  
      'Time out global de 10 segundos  
      '......  
         Case edInterDigitTimeOut:  
      'Deu time-out entre dois dígitos   
      '......  
           
    End Select  
End Sub  
 
O evento OnDigitsReceived também pode ter a variável Status com valor edDigitOverMessage. Neste caso, o evento terá sido gerado pela detecção de um dígito durante a reprodução de uma mensagem a partir dos métodos Playxxx.

A detecção de DTMF sai com um nível de sensibilidade que funcionará em 99% das instalações. Podem existir situações extremas nas quais a detecção pode parecer muito ou pouco sensivel. Neste caso, o programador poderá fazer uso do método SetDTMFTwist que permite alterar a sensibilidade desta detecção.

O padrão DTMF é composto de um par de freqüências (tons) para cada dígito discado que chamaremos respectivamente de F1 e F2.

Devido às características da linha telefônica e dos equipamentos a elas ligados, as amplitudes destes tons podem ter atenuações diferentes na propagação pela rede telefônica.

A presença de áudio juntamente com o par de tons do DTMF (quando a placa está falando uma mensagem) pode prejudicar sua detecção pois gera novos tons F3, junto com F1 e F2.

O parâmetro TWIST1 diz respeito à tolerância na diferença de amplitude entre as duas freqüências do DTMF – F1 e F2. Quanto maior o valor de TWIST, maior a tolerância a variações de amplitude entre as duas freqüências ou mais fácil será a detecção de digitos (podendo até chegar em situações de talk-off). Quando necessário, o ajuste desta variável deve ser feito sem que a placa esteja falando.

O parâmetro TWIST2 diz respeito à seletividade de uma terceira freqüência F3 com relação às duas freqüências, F1 e F2 presentes no áudio recebido pela placa, isto quer dizer que quanto menor o valor de TWIST2, maiores poderão ser as amplitudes das outras freqüências presentes no áudio sem que seja rejeitada a detecção de DTMF, ou seja, os valores menores aumentam a sensibilidade de DTMF podendo chegar até situações de talk-off.

Os dois valores deverão ser ajustados empiricamente em situações que os dígitos não estejam sendo detectados a contento ou, no outro extremo, em situações de talk-off.