2012-03-30 11 views
2

Ich habe einige Probleme bei der Verwendung der Microsoft Übersetzer Speak-Methode der HTTP-Schnittstelle.Kein Sound von Client-Seite mit Microsoft Translator

Dies ist mein Code:

public void Speak() 
    { 
     AdmAuthentication admAuth = new AdmAuthentication("clientID", "clientSecret"); 
     AdmAccessToken admToken; 
     string headerValue; 
     admToken = admAuth.GetAccessToken(); 
     // Create a header with the access_token property of the returned token 
     headerValue = "Bearer " + admToken.access_token; 
     string language = "zh-CHS"; 
     string uri = "https://api.microsofttranslator.com/v2/Http.svc/Speak?&text=" + System.Web.HttpUtility.UrlEncode(lblRead.Text) + "&language=" + language + "&format=" + HttpUtility.UrlEncode("audio/wav") + "&options=MaxQuality"; 
     WebRequest webRequest = WebRequest.Create(uri); 
     webRequest.Headers.Add("Authorization", headerValue); 
     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; 
      } 
     } 
    } 
    } 

    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 cientSecret; 
     private string request; 

     public AdmAuthentication(string clientId, string clientSecret) 
     { 
      this.clientId = clientId; 
      this.cientSecret = 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)); 
     } 

     public AdmAccessToken GetAccessToken() 
     { 
      return HttpPost(DatamarketAccessUri, this.request); 
     } 

     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; 
      } 
     } 

ich die Client-ID und Client-Schlüssel entfernt.

Das Problem, mit dem ich konfrontiert bin, ist, dass ich nichts höre, wenn ich die Seite auf dem Server laufen lasse. Ja, ich weiß, wenn ein Benutzer auf eine Schaltfläche klickt, wird der SoundPlayer auf dem Server produziert, so dass die Client-Seite nichts hört.

Ich habe alle Arten von Suchmethoden durchsucht. Aber ohne Erfolg.

Ich habe versucht, eine Methode zu verwenden, um den Stream zu speichern und auf die Datenbank zu aktualisieren. Alles ist gut, wenn ich es von Visual Studio aus starte. Auf der Clientseite kann der Stream jedoch nicht heruntergeladen werden. Oder ich spiele sogar die Sounddatei, die ich aus der Datenbank abrufe.

Bitte helfen Sie mir

ich in der chinesischen Visual Studio 2010 mit .NET Framework 4.0 und der Text den ich versuche zu hören ist bin mit.

UPDATE: Ich habe einen anderen Weg, um diese Aufgabe abzuschließen. Wenn jemand Interesse hat. Könnte mich PM und fragen nach den Codes.

+0

Wie haben kodieren Sie die URL mit den chinesischen Wörtern, um zu arbeiten? –

Antwort

0

Sie können diesen Prozess Ende an Ende in Silverlight implementieren, aber ich weiß nicht, wie nur in ASP.NET. Da Sie jedoch ein Silverlight-Steuerelement auf einer ASP.NET-Seite problemlos verankern können (siehe here), könnten Sie die Transaktionscode-API-Aufrufe in ein kleines Silverlight-Steuerelement umgestalten und es auf Ihrer ASP.NET-Seite platzieren.

Wie im Blogeintrag von Tim Heuer erwähnt, kann das MediaElement das verlustfreie WAV-Format nicht direkt wiedergeben. Es gibt jedoch ein "WaveMediaStreamSource" -Objekt, das auf Codeplex verfügbar ist und von einem Mitglied des Silverlight-Teams erstellt wurde und es ermöglicht, den Stream auf dem Client nach Bedarf wiederzugeben.

Nachdem der übermittelte Wert vom Aufruf der Translator-API über REST (oder je nach Wahl von: SOAP, HTTP, AJAX) empfangen wurde, können Sie den WaveMediaStreamSource-Konstruktor mit seinem Wert laden, um ihn auf dem Client wiederzugeben.

Haben Sie keine Angst, wenn Sie Silverlight noch nie zuvor verwendet haben, da diese Lösung nicht so schwierig sein sollte. Der Link von Tims Beispiel und die zugehörige WaveMediaStreamSource von CodePlex sind unten aufgeführt.

Make your Silverlight applications Speak to you with Microsoft Translator

WaveMediaStreamSource (Codeplex)

+1

Atconway. Danke für Ihre Hilfe. Am Ende habe ich HTML5 verwendet, um mein Audio auf dem Client-Browser zu bekommen. Danke =) – Respect

+0

Einverstanden. HTML5 als eine praktikable Lösung wird Silverlight für diesen Bedarf trumpfen und ist eine praktikablere Option, die sowieso weiter geht. – atconway