Esta semana, tive a oportunidade de desenvolver um pequeno Gadget para um website que tinha como objetivo, conectar-se ao Google Translate para gerar uma mensagem falada a partir da mensagem digitada por ele. Esse tipo de recurso é conhecido como: “Text-to-Speech”, que traduzindo seria algo como… “texto para fala”. Apesar de não ser uma API oficial, já é possível usar este serviço do google, que é o mesmo utilizado naquele botão “ouvir” que aparece ao lado do texto traduzido pelo google e fornece uma maneira de você descobrir não apenas a grafia da tradução, mas também a pronuncia.

A funcionalidade de “fala sintética”, como também podemos nomear este recurso… por si só, já é legal mesmo despropositada, porém, eu já vejo este recurso com grandes aplicações, como por exemplo, para a área de acessibilidade para deficientes visuais, desde que bem utilizada.

Como não é nossa intenção aqui discutir sobre as possibilidades práticas, vamos colocar logo a mão na massa! Para começar precisamos entender como são feitas as requisições à API. Basicamente tudo funciona através de um http request simples na seguinte URL: “http://translate.google.com/translate_tts”, passando dois parâmetros.

O primeiro deles é o idioma da fala. Isso irá definir o sotaque da voz.

  • tl: Vôcê pode passar “en” para inglês, “pt-BR” para a português ou “es” para espanhol… além de outras tantas combinações

O segundo é o texto propriamente dito.

  • q: Neste parâmetro você envia o texto que deseja ouvir.

O resultado desta requisição é um arquivo MP3, gerado em tempo de execução pelo google com base nos seus parâmetros. Tudo que você precisa fazer agora é uma interface para aproveitar este MP3 em seu website, ou seja lá o que for que você estiver planejando.

Em minha pesquisa encontrei uma biblioteca em ActionScript 3.0 criada por Pete Shand (http://peteshand.net/blog/index.php/actionscript-text-to-speech/). Ficou muito simples de utilizar, por isso nem vou explicar muito pois o código é autoexplicativo.

Eu criei uma caixa de texto que chamei de “mensagem_txt” e um botão que chamei de “ouvir_btn”. Daí para frente foi só criar uma classe de inicialização para o flash como a seguinte:

text-to-speech

No arquivo “Main.as”

package
{

    import flash.display.LoaderInfo;
    import flash.display.MovieClip;
    import flash.events.*;
    import flash.events.Event;
    import flash.text.*;
    import ps.GText2Speech.TextToSpeech;
    import ps.GTranslate.Language;   

    /**
     * ...
     * @author André Paulovich
     *
     */
    public class Main extends MovieClip
    {

        private var textToSpeech:TextToSpeech;               

        public function Main()
        {
            // classe do pete para gerenciar as requisições no google translate
            textToSpeech = new TextToSpeech();

            // eu adicionei uma nova constante no código dele com o "pt-BR" que estava faltando
            textToSpeech.Lang = Language.PORTUGUESE_BRAZIL;

            // adicionei o listener que é disparado quando o primeiro mpr3 for carregado
            textToSpeech.addEventListener("FirstClipLoaded", beginPlaying);

            // adicionei o listener para o click do botão
            ouvir_btn.addEventListener(MouseEvent.CLICK, getMessage);
        }

        private function getMessage(e:MouseEvent):void
        {
            // pego o texto da caixa de texto que criamos na interface
            var message:String = mensagem_txt.text;
            playVoice(message);
        }

        public function playVoice(text:String):void
        {

            if (text != null)
            {
                if (text.length > 0)
                {
                    // mandamos carregar a mensagem
                    textToSpeech.load(text);
                }
            }           

        }

        private function beginPlaying(event:Event):void
        {
            // tocamos o áudio
            textToSpeech.play();
        }
    }

}

Agora é só testar…

Porém, antes de começarem a utilizar isso em seus sistes, lembrem-se de que o google não lançou uma API oficial para dar suporte a este serviço. E por esta razão, a qualquer momento, essa estrutura pode ser alterada, tornando seu aplicativo offline. Um grande abraço a todos!

UPDATE!

Pessoal, existem alguns problemas com relação aos browsers e o plugin do flash, quando há uma requisição de dados de um domínio diferente de onde está sendo executado o flash. Neste caso o flash está qui no (www.100loop.com) e está requisitando um mp3 do (translate.google.com). O Pete postou uma solução que eu também tive que fazer. Podem ver no blog dele em primeira mão… em breve irei escrever sobre isso aqui também.