none
C# Text to Speech RRS feed

  • 问题

  • C#根据微软的WebService实现Text To Speech,根据代码可是抛出异常,请斑竹能否帮我一起解决这个问题感谢;

    参考网址:

    http://msdn.microsoft.com/en-us/library/ff512420.aspx

    http://msdn.microsoft.com/en-us/library/hh454950.aspx

        class Program
        {
            static void Main(string[] args)
            {
                AdmAccessToken admToken;
                string headerValue;
                //Get Client Id and Client Secret from https://datamarket.azure.com/developer/applications/
                //Refer obtaining AccessToken (http://msdn.microsoft.com/en-us/library/hh454950.aspx) 
                AdmAuthentication admAuth = new AdmAuthentication("texttospeechjackslater", "OIOa3tzD0h7SWiWN7qz23nzuf+rpaqCj8HAh0Uyg6Fo=");
                try
                {
                    admToken = admAuth.GetAccessToken();
                    // Create a header with the access_token property of the returned token
                    headerValue = "Bearer " + admToken.access_token;
                    SpeakMethod(headerValue);
                }
                catch (WebException e)
                {
                    ProcessWebException(e);
                    Console.WriteLine("Press any key to continue...");
                    Console.ReadKey(true);
                }
                catch (Exception ex)
                {
    
                    Console.WriteLine(ex.Message);
                    Console.WriteLine("Press any key to continue...");
                    Console.ReadKey(true);
                }
    
                Console.Read();
            }
            private static void SpeakMethod(string authToken)
            {
                string uri = "http://api.microsofttranslator.com/v2/Http.svc/Speak?text=welcome&language=en&format=" + HttpUtility.UrlEncode("audio/wav") + "&options=MaxQuality";
    
                WebRequest webRequest = WebRequest.Create(uri);
                webRequest.Headers.Add("Authorization", authToken);
                WebResponse response = null;
                try
                {
                    response = webRequest.GetResponse();
                    using (Stream stream = response.GetResponseStream())
                    {
                        using (SoundPlayer player = new SoundPlayer(stream))
                        {
                            player.PlaySync();
                        }
                    }
                }
                catch
                {
    
                    throw;
                }
                finally
                {
                    if (response != null)
                    {
                        response.Close();
                        response = null;
                    }
                }
            }
            private static void ProcessWebException(WebException e)
            {
                Console.WriteLine("{0}", e.ToString());
                // Obtain detailed error information
                string strResponse = string.Empty;
                using (HttpWebResponse response = (HttpWebResponse)e.Response)
                {
                    using (Stream responseStream = response.GetResponseStream())
                    {
                        using (StreamReader sr = new StreamReader(responseStream, System.Text.Encoding.ASCII))
                        {
                            strResponse = sr.ReadToEnd();
                        }
                    }
                }
                Console.WriteLine("Http status code={0}, error message={1}", e.Status, strResponse);
            }
        }
    
    
        [DataContract]
        public class AdmAccessToken
        {
            [DataMember]
            public string access_token { get; set; }
            [DataMember]
            public string token_type { get; set; }
            [DataMember]
            public string expires_in { get; set; }
            [DataMember]
            public string scope { get; set; }
        }
    
        public class AdmAuthentication
        {
            public static readonly string DatamarketAccessUri = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13";
            private string clientId;
            private string clientSecret;
            private string request;
            private AdmAccessToken token;
            private Timer accessTokenRenewer;
    
            //Access token expires every 10 minutes. Renew it every 9 minutes only.
            private const int RefreshTokenDuration = 9;
    
            public AdmAuthentication(string clientId, string clientSecret)
            {
                this.clientId = clientId;
                this.clientSecret = clientSecret;
                //If clientid or client secret has special characters, encode before sending request
                this.request = string.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com", HttpUtility.UrlEncode(clientId), HttpUtility.UrlEncode(clientSecret));
                this.token = HttpPost(DatamarketAccessUri, this.request);
                //renew the token every specfied minutes
                accessTokenRenewer = new Timer(new TimerCallback(OnTokenExpiredCallback), this, TimeSpan.FromMinutes(RefreshTokenDuration), TimeSpan.FromMilliseconds(-1));
            }
    
            public AdmAccessToken GetAccessToken()
            {
                return this.token;
            }
    
    
            private void RenewAccessToken()
            {
                AdmAccessToken newAccessToken = HttpPost(DatamarketAccessUri, this.request);
                //swap the new token with old one
                //Note: the swap is thread unsafe
                this.token = newAccessToken;
                Console.WriteLine(string.Format("Renewed token for user: {0} is: {1}", this.clientId, this.token.access_token));
            }
    
            private void OnTokenExpiredCallback(object stateInfo)
            {
                try
                {
                    RenewAccessToken();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(string.Format("Failed renewing access token. Details: {0}", ex.Message));
                }
                finally
                {
                    try
                    {
                        accessTokenRenewer.Change(TimeSpan.FromMinutes(RefreshTokenDuration), TimeSpan.FromMilliseconds(-1));
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(string.Format("Failed to reschedule the timer to renew access token. Details: {0}", ex.Message));
                    }
                }
            }
    
    
            private AdmAccessToken HttpPost(string DatamarketAccessUri, string requestDetails)
            {
                //Prepare OAuth request 
                WebRequest webRequest = WebRequest.Create(DatamarketAccessUri);
                webRequest.ContentType = "application/x-www-form-urlencoded";
                webRequest.Method = "POST";
                byte[] bytes = Encoding.ASCII.GetBytes(requestDetails);
                webRequest.ContentLength = bytes.Length;
                using (Stream outputStream = webRequest.GetRequestStream())
                {
                    outputStream.Write(bytes, 0, bytes.Length);
                }
                using (WebResponse webResponse = webRequest.GetResponse())
                {
                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AdmAccessToken));
                    //Get deserialized object from JSON stream
                    AdmAccessToken token = (AdmAccessToken)serializer.ReadObject(webResponse.GetResponseStream());
                    return token;
                }
            }
        }

    2013年3月8日 0:54

答案

全部回复