2015-10-07 90 views
2

我想要从IBM Watson服务器获得响应。同样的代码也适用于Google Speech API。如下面的代码所示,我正在向Watson API发送正确的音频。无法将文件上传到IBM Watson语音文本

try 
{ 
    FileStream fileStream = File.OpenRead(data_to_translate); 
    MemoryStream memoryStream = new MemoryStream(); 
    memoryStream.SetLength(fileStream.Length); 
    fileStream.Read(memoryStream.GetBuffer(), 0, (int)fileStream.Length); 
    byte[] BA_AudioFile = memoryStream.GetBuffer(); 
    string auth = string.Format("{0}:{1}", "xxxx", "xxxx"); 
    string auth64 = Convert.ToBase64String(Encoding.ASCII.GetBytes(auth)); 
    string credentials = string.Format("{0} {1}", "Basic", auth64); 
    HttpWebRequest _HWR_SpeechToText = null; 
    _HWR_SpeechToText = 
       (HttpWebRequest)HttpWebRequest.Create(
        "https://stream.watsonplatform.net/speech-to-text/api/v1/recognize"); 
    _HWR_SpeechToText.Headers[HttpRequestHeader.Authorization] = credentials; 
    _HWR_SpeechToText.Method = "POST"; 
    _HWR_SpeechToText.ContentType = "audio/flac; rate=44100 channels=2"; 
    _HWR_SpeechToText.ContentLength = BA_AudioFile.Length; 
    _HWR_SpeechToText.KeepAlive = false; 
    _HWR_SpeechToText.ProtocolVersion = HttpVersion.Version10; 
    _HWR_SpeechToText.ServicePoint.ConnectionLimit = 1; 
    Stream stream = _HWR_SpeechToText.GetRequestStream(); 
    stream.Write(BA_AudioFile, 0, BA_AudioFile.Length); 
    stream.Close(); 

    HttpWebResponse HWR_Response = (HttpWebResponse)_HWR_SpeechToText.GetResponse(); 
    if (HWR_Response.StatusCode == HttpStatusCode.OK) 
    { 
     StreamReader SR_Response = new StreamReader(HWR_Response.GetResponseStream()); 
     // string text = SR_Response.ReadToEnd(); 
     // jsonResponse json = JsonConvert.DeserializeObject<jsonResponse>(SR_Response.ReadToEnd()); 

     //Speech API response here 
     var result = SR_Response.ReadToEnd(); 
     Console.WriteLine(result); 
     var jsons = result.Split('\n'); 

     foreach (var j in jsons) 
     { 
      var jsonObject = JsonConvert.DeserializeObject<jsonResponse.SpeechResponse>(j); 
      if (jsonObject == null || jsonObject.Result.Length <= 0) continue; 

      if (jsonObject.Result[0].Alternative[0].Confidence > 0.90) 
      { 
       Console.WriteLine("text-to-speech van google: " + jsonObject.Result[0].Alternative[0].Transcript + "\nconfidence: " + jsonObject.Result[0].Alternative[0].Confidence); 
      } 
      else if (jsonObject.Result[0].Alternative[0].Confidence < 0.90) 
      { 
       Console.WriteLine("Watson is te onzeker " + jsonObject.Result[0].Alternative[0].Confidence + " :(\nmaar hier is toch het antwoord: " + jsonObject.Result[0].Alternative[0].Transcript); 
      } 
     } 
    } 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.ToString()); 
} 

Console.ReadLine(); 

有人可以向我解释我做错了什么吗?我想在没有/ session /的情况下拨打电话,因为我只需要最终答案+信心。

有了这个代码,我收到以下错误:

System.IO.IOException: Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host 
    at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) 
    at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size) 
    --- End of inner exception stack trace --- 
    at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size) 
    at System.Net.Security._SslStream.StartWriting(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security._SslStream.ProcessWrite(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size) 
    at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size) 
    at System.Net.ConnectStream.InternalWrite(Boolean async, Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state) 
    at System.Net.ConnectStream.Write(Byte[] buffer, Int32 offset, Int32 size) 
    at GoogleSpeech.speechRecognitionWatson.speechRecognize(String data_to_translate) in C:\Program Files (x86)\School\herkansingen jaar 4\INFAFS\ProofofConcepts\GoogleSpeech\GoogleSpeech\speechRecognitionWatson.cs:line 47 

有谁告诉我,我应该添加,删除或者如果我对IBM的沃森做法是差得远了?我认为这将工作,因为它适用于谷歌API和其他API ...

+1

您能标记第47行是否带有代码注释吗? – wimh

+0

第47行是stream.Write(BA_AudioFile,0,BA_AudioFile.Length); – LordCas

+0

'rate = 44100'和'channels = 2'之间没有分号。 – wimh

回答

3

我已经找到了问题,我自己的代码。

FileStream fileStream = File.OpenRead(data_to_translate); 
      MemoryStream memoryStream = new MemoryStream(); 
      memoryStream.SetLength(fileStream.Length); 
      fileStream.Read(memoryStream.GetBuffer(), 0, (int)fileStream.Length); 
      byte[] BA_AudioFile = memoryStream.GetBuffer(); 
      HttpWebRequest _HWR_SpeechToText = null; 
      _HWR_SpeechToText = 
           (HttpWebRequest)HttpWebRequest.Create("https://stream.watsonplatform.net/speech-to-text/api/v1/recognize"); 
      string auth = string.Format("{0}:{1}","Watson.uID","Watson_uPWD"); 
      string auth64 = Convert.ToBase64String(Encoding.ASCII.GetBytes(auth)); 
      string credentials = string.Format("{0} {1}", "Basic", auth64); 

      _HWR_SpeechToText.Headers[HttpRequestHeader.Authorization] = credentials; 
      _HWR_SpeechToText.Method = "POST"; 
      _HWR_SpeechToText.ContentType = "audio/flac; rate=44100; channels=2;"; 
      _HWR_SpeechToText.ContentLength = BA_AudioFile.Length; 
      Stream stream = _HWR_SpeechToText.GetRequestStream(); 
      stream.Write(BA_AudioFile, 0, BA_AudioFile.Length); 
      stream.Close(); 

      HttpWebResponse HWR_Response = (HttpWebResponse)_HWR_SpeechToText.GetResponse(); 
      if (HWR_Response.StatusCode == HttpStatusCode.OK) 
      { 
       StreamReader SR_Response = new StreamReader(HWR_Response.GetResponseStream()); 
       var result = SR_Response.ReadToEnd(); 
       Console.WriteLine(result); var JsonObject = Newtonsoft.Json.Linq.JObject.Parse(result); 
       double confidence = (double)JsonObject["results"][0]["alternatives"][0]["confidence"]; 
       if (confidence <= 0.9) 
       { 
        Console.WriteLine("Watson knows what he has heard: " + (string)JsonObject["results"][0]["alternatives"][0]["transcript"]); 
        Console.WriteLine("Watson's confidence!: " + (string)JsonObject["results"][0]["alternatives"][0]["confidence"]); 
       } 
       else 
       { 
        Console.WriteLine("Watson thinks: " + (string)JsonObject["results"][0]["alternatives"][0]["transcript"]); 
        Console.WriteLine("Watson has this confidence: " + (string)JsonObject["results"][0]["alternatives"][0]["confidence"]); 
       } 
+0

感谢它帮助我的答案我也在研究Watson Speech API。让我知道我们是否可以联系。我的Skype帐号 - heemanshu.bhalla –

+0

很好的回答,这也帮助了我,非常感谢! – k1234

相关问题