As aplicações de voz permitem novas maneiras de se comunicar na Internet. Por exemplo: permite que você ouça seus e-mails ao invés de lê-los. Você pode querer efetuar uma compra em um site usando simplesmente interação por voz ou ao invés de se comunicar com seus amigos por texto, pode-se utilizar a voz.

Com a evolução da Internet, principalmente com o surgimento da integração de telefonia móvel na rede, a comunicação por voz se tornou essencial no ambiente web.

Neste contexto, quando se fala sobre o desenvolvimento de aplicações de voz é comum nos lembrar do VoiceXML. O VoiceXML é uma linguagem baseada no formato XML (eXtensible Markup Language) com o objetivo de desenvolver aplicações de voz interativas entre homem e máquina. Embora conhecida, neste artigo vamos apresentar uma nova maneira, bem mais simples que o VoiceXML, de criar aplicações de voz. Faremos uso do VoicePHP.

O VoicePHP permite que você crie aplicações de voz utilizando códigos PHP. Há grandes vantagens nessa ferramenta, a principal é a simplicidade de sua utilização. Os programadores não precisam aprender nada além do que já sabem sobre PHP para criar aplicações de voz funcionais.

Neste sentido, o objetivo deste artigo é demonstrar como funciona o VoicePHP, como você pode usá-lo e exemplificar idéias de aplicações de voz interessantes que você pode criar.

VoicePHP e VoiceXML

É importante ter em mente que o VoicePHP não é uma extensão do PHP e também não é um módulo. O VoicePHP é uma plataforma em que o código php será rodado sem nenhuma alteração em especial com o objetivo de criar aplicações de voz. A entrada e saída que você usa no php para obter e imprimir texto você continuará usando no voicephp, sem qualquer alteração, com a diferença que a entrada e saída serão convertidos para voz ao invés de texto. Sendo assim, o mesmo código que você utiliza no PHP para imprimir um texto você utiliza no VoicePHP para produzir voz. E da mesma maneira que você utiliza o PHP para receber uma entrada de texto você utiliza para receber uma entrada de voz. Essa é uma das grandes vantagens do VoicePHP em relação a outras opções que temos para desenvolver aplicações de Voz, como por exemplo o VoiceXML.

O VoiceXML, baseado em XML, é um dos primeiros padrões criados para programação de aplicações de voz. Entretanto, ao desenvolver usando a linguagem XML perde-se o poder das reais linguagens de programação como o PHP. Criar loops complexos e interação em XML requer um grande esforço. Nesse contexto, usar o VoicePHP evita a necessidade de aprender novas ferramentas, nova linguagem markup, tags e atributos que são propriedades do VoiceXML. Para exemplificar a diferença entre os dois, veja nas Listagens 1 e 2 um simples "Hello World" feito em VoiceXML e em seguida o mesmo "Hello World" feito em VoicePHP.

Listagem 1: VoiceXML

<?xml version="1.0" encoding="UTF-8"?> 
<vxml version = "2.1" > 
    <form> 
        <block> 
            <prompt> 
                Hello World 
            </prompt> 
        </block> 
    </form> 
</vxml>                         
            
Listagem 2: VoicePHP
 
<?php 
    echo "Hello World"; 
?> 
            

Usar o XML como uma linguagem de programação é difícil por que o XML não foi criado com esse propósito. Dessa forma, o VoicePHP torna-se uma ferramenta realmente poderosa ao criar voz a partir de simples comandos php.

Arquitetura da plataforma VoicePHP

A plataforma do VoicePHP disponibiliza suporte completo para aplicações de voz. O suporte inclui reconhecimento de voz, engine de texto para fala (text-to-speech), suporte DTMF (Dual-Tone Multi-Frequency - tons utilizados na discagem de aparelhos telefônicos que usam botões ao invés de “disco”), gateways de telefonia (utilizados para o envio de SMS), Instant Messaging (Exemplos de Instant Messaging são MSN, GTalk, Skype, etc.). O suporte inclui ainda um interpretador PHP altamente otimizado que permite rodar seus scripts PHP sem a necessidade de muitas mudanças para adaptá-los ao ambiente do VoicePHP.

O reconhecimento de voz e o suporte DTMF permitem diversas possibilidades de obter a entrada do usuário, por exemplo: reconhecimento de voz, DTMF (dígitos no aparelho telefônico ou dígitos em botões de Flash) e streaming de áudio (uma forma de transmitir áudio pela Internet).

O suporte de "texto para fala" e arquivos de som permitem controlar a saída. Dessa forma, o desenvolvedor tem controle para criar aplicações completas baseadas em voz.

A interação de entrada e saída pode ser realizada através linhas telefônicas, Flash, IM (Instant Messaging), SIP (protocolo utilizado para estabelecer chamadas telefônicas através de redes VoIP), entre outros, como veremos abaixo.

A Figura 1 ilustra a arquitetura da plataforma VoicePHP. Conforme podemos observar na figura, a plataforma VoicePHP possui um interpretador php próprio que permite trabalhar com aplicativos de voz, recebendo a entrada de informações através de DTMF, reconhecimento de voz ou streaming de áudio e a saída através de “texto para fala” (Text-To-Speech), DTMF e streaming de áudio. A plataforma ainda oferece ferramentas de apoio à interação com o usuário através de aplicação Flash e do protocolo SIP. O acesso ao ambiente pode ser feito pela Internet ou telefonia.

Arquitetura do VoicePHP
Figura 1: Arquitetura do VoicePHP

Após um pouco de teoria, vamos começar a colocar a mão na massa criando nossa primeira aplicação de voz.

Criando a aplicação "Hello World"

Crie a aplicação PHP que será utilizada na plataforma do VoicePHP. Em nosso exemplo vamos simplesmente produzir a fala "Hello World". Portanto, nosso script php é bem simples:

Listagem 3: Hello world

<?php 
    echo "Hello World"; 
?> 
            
            

Salve esse arquivo com a extensão ".txt" e disponibilize o arquivo dentro de um diretório público que possa ser acessado na internet. Já vamos entender o motivo de gravar o arquivo com a extensão ".txt".

Agora crie uma conta gratuitamente no site. O VoicePHP é desenvolvido pela plataforma TringMe. O Tringme disponibiliza produtos que permitem a interação por voz na web. Sua plataforma integra voz e telefonia pela Internet, Mobile Devices, SIP Devices, etc.

Faça o login no site com sua conta. Mude o campo "Select your reachability:" para VoicePHP. No campo "VoicePHP URL:" informe a URL que contém o código PHP criado anteriormente. A extensão ".txt" é necessária para que a plataforma do VoicePHP possa ler o código fonte do seu arquivo "php". Clique no botão "Save" (ver Figura 2).

Configurando o VoicePHP
Figura 2: Configurando o VoicePHP

Pronto, sua aplicação de voz já esta pronta. Após você salvar os parâmetros setados, a plataforma do VoicePHP irá criar a aplicação de voz baseada no arquivo txt que você configurou. Ela pode ser utilizada de diferentes maneiras: através de um telefone comum, website (usando Flash), Instant Messaging, TringMe MobileVoip. Veja abaixo como proceder em alguns dos principais meios de utilização.

  • Usando Flash

    Clique na opção "Push N Talk" no menu que está na sua conta no site. Copie o conteúdo do campo "Your Push-n-talk widget Code" e adicione em seu site. Basta clicar no botão em flash para acessar sua aplicação de voz. A Figura 3 demonstra como será exibido em seu site o botão de acesso à aplicação de voz.

    Acesso via flash
    Figura 3: Acesso via flash
  • Usando Telefone Comum

    Use o número que consta na página principal de configuração da sua conta tringme. É o número que está no campo "Phone number". Basta efetuar uma ligação para esse número e acessar sua aplicação de voz. Dessa forma, a partir de qualquer lugar que você esteja basta ter um telefone convencional para poder acessar sua aplicação de voz.

  • Usando ligação CallBack

    Na página principal de configuração da conta encontre a seção "Click 2 Call". No campo "Enter your number here..." coloque o número de telefone que você deseja receber a ligação de volta (callback). No campo "Enter your friends here..." especifique o número que o tringme designou para você. É o número que está no campo "Phone number". Você receberá uma ligação de volta (callback) e na hora que você atender sua aplicação será executada. Um exemplo prático para utilizar essa opção seria construir uma aplicação de satisfação do cliente referente a algum produto que ele comprou. Você especifica o telefone do cliente no campo de callback e o identificador da sua aplicação no outro campo. O cliente receberá uma chamada e quando ele atender, sua aplicação será executada.

  • Usando Gtalk

    Adicione a conta "tringmegtalk@gmail.com" e digite "call <número>". O número é o que esta no campo "Phonenumber". Isto irá iniciar sua aplicação de voz. Neste caso, você pode pedir para seus contatos do gtalk adicionarema conta “tringmegtalk@gmail.com" permitindo dessa forma que eles possam acessar sua aplicação de voz.

  • Usando TringMe MobileVoip

    Qualquer um pode acessar gratuitamente sua aplicação de Voz através do cliente MobileVoip (um software cliente para efetuar chamadas para aplicações VoicePHP pela Internet gratuitamente). Basta discar o número referente a sua aplicação. O cliente MobileVoIP pode ser baixado gratuitamente no site.

Exemplos de aplicações com VoicePHP

Agora que já aprendemos o básico sobre como criar, acessar e disponibilizar nossas aplicações de voz, vamos mostrar alguns cenários que podemos criar na plataforma do VoicePHP.

  • Conta bancária acessível por voz: Usuário liga para o número de telefone e é atendido por uma aplicação de voz automatizada. A aplicação solicita o número da conta bancária. O usuário entra com os números da conta e continua interagindo com a aplicação, solicitando informações referente à sua conta.
  • Comprando Livros On-Line: Usuário liga para o número de telefone e é atendido por uma aplicação de voz automatizada. A aplicação solicita o código do livro que o usuário deseja comprar. O usuário entra com o código. O sistema informa o nome e o preço do livro. O usuário confirma a transação e informa o número do cartão de crédito para realizar o pagamento.
  • Acessar seus tweets através de voz: Imagine você escutando seus tweets através de uma simples ligação? Então, o suporte a JSON (Javascript Object Notation - formato de dados muito utilizado em transferências de informações por AJAX.) do PHP, disponível na plataforma VoicePHP, permite que você interaja como twitter facilmente.
  • Ouvir seus e-mails: Você pode usar uma conexão IMAP para conectar no servidor e obter os e-mails do dia atual. Através do VoicePHP você pode reproduzir via voz o assunto dos e-mails. Além disso, você pode também criar a opção para que o usuário possa digitar um número qualquer para ouvir o corpo da mensagem. Mais adiante veremos uma aplicação prática referente a este tema.

Funções da API do VoicePHP

Algumas funções específicas para área de telefonia estão disponíveis para serem utilizadas em sua aplicação de voz do VoicePHP. As principais são:

  • transfer: Transfere a chamada para outro número;
  • sms: Envia um SMS;
  • play: Toca um arquivo de som. O parâmetro passado para o play deve ser uma URL que aponta para o arquivo de som.
  • record: Grava uma conversação. As gravações são armazenadas temporariamente no servidor e podem ser acessadas a partir da sua conta no site
  • fetch: Permite que a aplicação obtenha dados de uma URL remota.
  • prompt: Produz voz a partir de um texto e aguarda por uma entrada do usuário. A entrada pode ser por DTMF ou fala.
  • setvoiceoption: Seta o valor para umas das opções voicetype, bargein, autospellnumbers, fetchtimeout e dtmfeos explicadas na sequencia.
    • voicetype: Possíveis valores são male ou female. A voz será masculina ou feminina. Por padrão é masculina.
    • bargein: Possíveis valores são 0 (desabilitado) ou 1 (habilitado) . Com o bargein habilitado você pode interromper a fala apresentada pela aplicação pressionando uma tecla DTMF, ou em outras palavras, em uma aplicação em que você provê um menu de acesso para o usuário, ele não precisa esperar até a fala da aplicação terminar para escolher uma das opções disponíveis.
    • autospellnumbers: Essa opção é utilizada para quando houverem números a serem pronunciados, você pode optar para que sejam falados individualmente e não literalmente. O valor passado para esse parâmetro especifica a quantidade de dígitos que um número deve ter para que a funcionalidade seja habilitada. Caso você especifique o valor 5, todos os números com mais de 4 dígitos serão pronunciados individualmente ao invés de literalmente.
    • fetchtimeout: Específica o tempo para timeout das operações de "fetch" (que buscam informações em URLs remotas). O padrão são 20 segundos. O valor máximo permitido é 255.
    • dtmfeos: Específica o caractere final quando você usar entrada em DTMF. O caractere padrão usado é #.

Veremos a partir de agora algumas dessas opções nos exemplos mostrados mais à frente.

Criando sua primeira aplicação URA/IVR

A interação em aplicações baseadas em voz são conhecidas como URA (Unidade de Resposta Audível) ou em inglês IVR (Interative Voice Response). Sistemas de URA são bastante conhecidos por nós. Acessamos esse tipo de aplicação quando ligamos, por exemplo, para bancos, operadoras de telefonia, companhias de cartão de crédito, empresas dos mais variados segmentos. Assim que a ligação é estabelecida o usuário interage com a aplicação através do teclado ou através de um mecanismo de reconhecimento de voz. Vamos à nossa primeira aplicação URA. Neste exemplo vamos criar uma aplicação URA bem simples que irá ler uma mensagem de boas vindas e depois irá solicitar uma entrada do usuário através de DTMF. A opção do usuário irá definir se a aplicação enviará um SMS ou irá transferir a chamada ou sairá da aplicação. Na Listagem 4 temos código que escrevemos para esta aplicação.

Listagem 4: Código da aplicação
 
<?php 
// Mensagem de boas vindas. 
echo "This is a demonstration of Voice PHP. 
         You can make calls and send messages right away."; 
/* Perguntamos ao usuário o número de destino que ele deseja discar. 
 * A segunda opção passada para a função prompt habilita o barge_in. 
 * O barge_in habilitado permite que a fala do texto possa ser interrompido através 
 * de um input de DTMF. 
  */ 
$destination = prompt("Dial the destination phone number", 1); 
echo "You dialed,  $destination"; 
  
// Obtem o input do usuário. Dessa vez o barge_in esta desabilitado. Portanto a fala do texto 
// não pode ser interrompida. 
$action = prompt("Press 1 to send a message, 2 to make a call or 3 to exit"); 
switch ($action) { 
    case 1: 
        // número 1, enviamos sms. 
        echo "I am sending a message to, $destination"; 
        sms($destination,"From VoicePHP(http://voicephp.com) demo"); 
        break; 
    case 2: 
        // número 2, transferimos a chamada. 
        echo "I am transfering you to, $destination"; 
        transfer($destination, 0, '', 10); 
        break; 
    case 3: 
        break; 
    default: 
        echo "$action is not a valid option."; 
        break; 
} 
echo "Good bye, Thank you for trying Voice PHP"; 
?>            
            

Conforme pudemos observar na Listagem 4, nossa aplicação URA é bem simples e praticamente auto explicativa. Segue à descrição dos passos executados quando ligamos para nossa aplicação URA. Ao iniciar a aplicação, temos a mensagem de boas vindas:

Listagem 5: Mensagem de boas vindas

            echo "This is a demonstration of Voice PHP. You can make calls and send messages right away.";
            

Depois a aplicação solicita ao usuário um número que será utilizado ou para transferência ou envio de SMS:

Listagem 6: Solicitação do número de telefone

$destination = prompt("Dial the destination phone number", 1); 
echo "You dialed,  $destination";
             

Então a aplicação solicita um novo input para definir se será realizado o envio de SMS (1) ou a transferência (2):

Listagem 7: Envio de SMS e transferência

$action = prompt("Press 1 to send a message, 2 to make a call or 3 to exit"); 
switch ($action) { 
    case 1: 
        // número 1, enviamos sms. 
        echo "I am sending a message to, $destination"; 
        sms($destination,"From VoicePHP(http://voicephp.com) demo"); 
        break; 
    case 2: 
        // número 2, transferimos a chamada. 
        echo "I am transfering you to, $destination"; 
        transfer($destination, 0, '', 10); 
        break; 
    case 3: 
        break; 
    default: 
        echo "$action is not a valid option."; 
        break; 
}  
            

Como nossa aplicação usa o suporte de DTMF, temos a opção de disponibilizá-la na web através de uma versão flash com teclado numérico (ver Figura 4). Para isso utilizamos o widget "tringme-pt-beta". Para utilizar este widget você precisa modificar a URL obtida na tela “Push N’ Talk” da sua conta tringme. Basta adicionar “&swf=tringme-pt-beta” ao final da URL. Para mais exemplos de aplicações utilizando o VoicePHP acesse o site.

Interface de uso alternativa
Figura 4: Interface de uso alternativ

Indo além do básico

Já familiarizados com a arquitetura e API do VoicePHP, vamos explorar agora algo mais avançado. A programação com suporte à voz abrem portas para interessantes tipos de aplicações. Com poucas linhas de código podemos criar aplicações URA realmente poderosas. Se você conhece PHP, certamente pode criar aplicações de voz robustas. Vamos analisar uma aplicação mais avançada. O objetivo é criar um cliente de e-mail utilizando o protocolo IMAP. A aplicação consiste em:

  • Estabelecer uma conexão com o servidor de IMAP do Gmail;
  • Obter os e-mails dos últimos dois dias que ainda não foram lidos;
  • Lê o assunto do e-mail e permite que você ouça o corpo da mensagem pressionando a tecla 1.

Esta aplicação está apresentada na Listagem 8. Observe os comentários no código para ajudar no entendimento. Das linhas 6 a 29 é efetuada a procura na caixa postal por e-mails ainda não lidos nos últimos dois dias. Em seguida, nas linhas 31 e 32 obtemos o assunto do e-mail. Já nas linhas 33 e 34 obtemos o cabeçalho do e-mail. Por fim, na linha 39, iniciamos a leitura do corpo de e-mail que é obtido nas linhas de 41 a 49.

Para testar essa e outras aplicações, acesse o site.

Listagem 8: Código da aplicação
 
<?php
echo "Welcome To VoicePHP E Mail Reader Demo";

$mail = imap_open('{imap.gmail.com:993/imap/ssl}INBOX', 'seuusuario@gmail.com', 'senha-do-gmail')
or die("Connection to mail server failed: ". imap_last_error());

//Procura na caixa postal por e-mails ainda não lidos nos últimos 2 dias.

$messages=imap_search ($mail, 'UNSEEN SINCE ' . date('d-M-Y', time() - 7200) . '');
if($messages > 1) {
rsort($messages);
$count = count($messages);
echo "You have $count new unread mails";
echo "To hear the body of a mail, press 1 after the subject is read,
press 0 to exit anytime";
get_subject($messages,$count,$subject,$header,$mail);
for($i=0;$i<$count;$i++){
$voicetype = ($i&1)?"female":"male";
setvoiceoption("voicetype", $voicetype);
$op = prompt($subject[$i], 1, 1, "dtmf:1");
if($op == "1") {
read_mail($messages[$i], $mail);
echo "Returning to subject menu";
}
elseif($op == "0") {
break;
}
}
}
else {
echo "You have no new mails";
}
imap_close($mail);
echo "Thank you for trying Voice PHP Demo";

//Obtem o assunto do e-mail...

function get_subject($messages,$count,&$subject,&$header,$mail){
for($i=0;$i<$count;$i++) {

//Obtem o header do IMAP

$header = imap_headerinfo($mail, $messages[$i]);
$subject[$i] = "Mail from " . $header->from[0]->personal . " with subject " . $header->subject;
}
}

//Lê o corpo do e-mail..

function read_mail($num,$mail) {

// Obtem o corpo do e-mail.

$st = imap_fetchstructure($mail, $num);
if (!empty($st->parts)) {
for ($i = 0, $j = count($st->parts); $i < $j; $i++) {
$part = $st->parts[$i];
if ($part->subtype == 'PLAIN') {
$body = imap_fetchbody($mail, $num, $i+1);
}
}
} else {
$body = imap_body($mail, $num);
}
echo $body;
}
?> 
                

Conclusão

Novas tecnologias que nos mantém conectados à internet são criadas periodicamente. Além dos desktops, os smartphones e celulares estão entre os principais dispositivos utilizados atualmente. Para esses últimos, a interação baseada em voz é mais conveniente e usável. E com certeza, a comunicação por voz é uma tecnologia que será cada vez mais utilizada em nosso dia a dia.

O projeto voicephp torna a tarefa de criar aplicações de voz muito mais simples e fácil do que qualquer outro protocolo de voz. Aqui no Brasil ainda não temos um projeto como voicephp que possa ser utilizado de forma legível para o nosso idioma. Ao converter texto para voz, na plataforma do Voicephp, a pronuncia é realizada no idioma inglês. Portanto, se o texto estiver no idioma português a pronuncia torna-se um pouco ilegível.

Nesse contexto, o principal intuito do artigo foi mostrar até onde o poder do PHP pode chegar. Além disso, mostramos o poder das aplicações de voz que podem ser disponibilizadas em diversos formatos dependendo da sua necessidade.