积极答复者
C# Text to Speech

问题
-
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; } } }
答案
-
方便上传控制台程序到SkyDrive,分析看看。
If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer
Help by clicking:
Click here to donate your rice to the poor
Click to Donate
Click to feed Dogs & Cats- 已标记为答案 JackSlaterYu 2013年5月8日 3:38
-
你好,請問你所說的异常是什麼?
有任何信息嗎?你的版本是什麼?大家一齊探討、學習和研究,謝謝!
MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
MCT, Microsoft Community Star(TW & HK),
Microsoft MVP for VB.NET since 2003
My MSMVP Blog- 已标记为答案 JackSlaterYu 2013年5月8日 3:38
全部回复
-
方便上传控制台程序到SkyDrive,分析看看。
If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer
Help by clicking:
Click here to donate your rice to the poor
Click to Donate
Click to feed Dogs & Cats- 已标记为答案 JackSlaterYu 2013年5月8日 3:38
-
你好,請問你所說的异常是什麼?
有任何信息嗎?你的版本是什麼?大家一齊探討、學習和研究,謝謝!
MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
MCT, Microsoft Community Star(TW & HK),
Microsoft MVP for VB.NET since 2003
My MSMVP Blog- 已标记为答案 JackSlaterYu 2013年5月8日 3:38