I’m not sure how I managed to miss this, but I just happened to run across a ‘new’ (well, newish), albeit still unofficial, offering of Google today: text-to-speech. You can see what few details there are on this Techcrunch post. Basically, it just boils down to this though – you send your phrase to be spoken in a GET request like so ‘http://translate.google.com/translate_tts?tl=en&q=hello%20world’, and in return Google gives you an .mp3 formatted sound file of your phrase being spoken in some non-threatening female robot voice.
Of course loading .mp3 files into Flash is a piece of cake, so integration with the Flash platform is nothing at all. The one thing that may get you is that Flash doesn’t like to load .mp3’s across domains. A very basic serverside proxy script will get you around that easily enough though. Here’s a quick example.
This will take a String phrase and generate the URL to the Google translator for you:
package {
public class GTextToSpeech {
private var _language:String;
public function GTextToSpeech(language:String = "en") {
_language = language;
}
/**
* Use this to get the URL of the mp3 containing the spoken words of the 'phrase' parameter
* @param phrase
* @return String URL to Google Text to Speech engine
*/
public function say(phrase:String):String {
if (phrase.length > 100) throw new Error("Google currently only supports phrases less than 100 characters in length.");
var qs:String = "tl=" + _language + "&q=";
qs += encodeURI(phrase);
return "http://translate.google.com/translate_tts?" + qs;
}
}
}
And here’s an example of a bare minimum proxy in php:
And put it together (using the Bit-101 MinimalComps):
package {
import com.bit101.components.HBox;
import com.bit101.components.InputText;
import com.bit101.components.PushButton;
import com.bit101.components.Style;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
/**
* quick test of Google text-to-speech tool
* @author Devon O.
*/
[SWF(width='350', height='80', backgroundColor='#FFFFFF', frameRate='12')]
public class Main extends Sprite {
private var _phrase:InputText;
private var _goButton:PushButton;
private var _speech:Sound = new Sound();
private var _channel:SoundChannel;
private var _tts:GTextToSpeech = new GTextToSpeech();
public function Main():void {
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
initUI();
}
private function initUI():void {
Style.embedFonts = true;
Style.BUTTON_FACE = 0x000000;
var container:HBox = new HBox(this, 25, 25);
_phrase = new InputText(container);
_phrase.width = 200;
_phrase.maxChars = 100;
_goButton = new PushButton(container, 0, 0, "Speak", goHandler);
}
private function goHandler(event:MouseEvent):void {
if (_phrase.text != "") {
_goButton.enabled = false;
var req:URLRequest = new URLRequest("proxy.php");
req.method = URLRequestMethod.POST;
var vars:URLVariables = new URLVariables();
vars.url = _tts.say(_phrase.text);
req.data = vars;
_speech.load(req);
_channel = _speech.play();
_channel.addEventListener(Event.SOUND_COMPLETE, soundDoneHandler);
} else {
_phrase.text = "Type something here, dummy.";
}
}
private function soundDoneHandler(event:Event):void {
_goButton.enabled = true;
}
}
}
And that will give you this (just type something in the box, and hit the ‘Speak’ button. Of course, you’ll need your sound on):
[kml_flashembed publishmethod=”static” fversion=”10.0.0″ movie=”https://blog.onebyonedesign.com/wp-content/uploads/2010/05/texttospeech.swf” width=”350″ height=”80″ targetclass=”flashmovie”]
[/kml_flashembed]
According to Techcrunch, the API is currently limited to 100 character long phrases, but I haven’t actually tested that to check it’s validity. Even if that’s the case, it’s still quite a fun little toy to play with and can add a bit of dimension and accessibility to Flash apps to come.