/// <summary>Speaks the specified text.</summary>
        /// <param name="text">The text.</param>
        public void Speak(string text)
        {
            try
            {
                Trace.WriteLine(string.Format("Speak: {0}", text));
                var uri  = "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&tl=" + cultureInfo.Name + "&q=" + Uri.EscapeUriString(text);
                var hash = Base32.Safe.Encode(uri.GetHashCode() * (long)text.Length);

                lock (this)
                {
                    if (TryPlay(Path.Combine(FilePath, hash + ".snd")))
                    {
                        return;
                    }

                    Trace.WriteLine(string.Format("Request new google translation for {0}", text));
                    byte[] data;
                    {
                        var fileName = Path.Combine(FilePath, hash + ".mp3");
                        if (File.Exists(fileName))
                        {
                            data = File.ReadAllBytes(fileName);
                        }
                        else
                        {
                            data = HttpConnection.Get(uri);
                            File.WriteAllBytes(fileName, data);
                        }
                    }
                    DecodeAndPlay(data, Path.Combine(FilePath, hash + ".snd"), text);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Could not speak desired text.", ex);
            }
        }