2017-12-29 50 views
3

私はC#でGoogle音声認識APIレストを使用したいと考えています。クライアントライブラリの代わりにAPI Restを使用する理由は、Unity3Dを使用したいので、現在クライアントライブラリをサポートしていないためです。Google音声認識での不正なリクエストエラーC#を使用したREST API

私はHttpClientを使って接続し、Newtonsoft Jsonはjsonをシリアル化します(私は今Windowsフォームで作業していて、Winformsで動作するときにUnityに移動します)。

私はいつもGoogleからのリクエストレスポンスが悪いですが、詳細はわかりませんが、APIキー値を無効な値に変更すると同じ結果が得られることに気付きました。ここで

が私のコードです:

クラス:

class Speech 
{ 
    public RecognitionConfig config { get; set; } 
    public RecognitionAudio audio { get; set; } 

    public bool sendToApi(string baseUri, string url, ref string apiResponse) 
    { 
     try 
     { 
      HttpClient client = new HttpClient(); 

      // Update port # in the following line. 
      client.BaseAddress = new Uri(baseUri); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 

      //var speechJson = new JavaScriptSerializer().Serialize(certificado); 
      string speechJson = JsonConvert.SerializeObject(this); 
      var contenido = new StringContent(speechJson.ToString(), Encoding.UTF8, "application/json"); 
      HttpResponseMessage response = client.PostAsync(url, contenido).Result; 

      if (response.IsSuccessStatusCode) 
      { 
       string responseJson = response.Content.ReadAsStringAsync().Result; 

       apiResponse = responseJson; 
      } 
      else 
      { 
       apiResponse = "ERROR " + JsonConvert.DeserializeObject(JsonConvert.SerializeObject(response)); 
      } 

      return true; 

     } 

     catch (Exception e) 
     { 
      apiResponse = e.Message; 
      return false; 
     } 
    } 
} 

class RecognitionConfig 
{ 
    public string encoding { get; set; } 
    public int sampleRateHertz { get; set; } 
    public string languageCode { get; set; } 
// public int maxAlternatives { get; set; } 
// public bool profanityFilter { get; set; } 
// public List<SpeechContext> speechContexts { get; set; } 
// public bool enableWordTimeOffsets { get; set; } 

} 

class SpeechContext 
{ 
    public List<string> phrases { get; set; } 

} 
class RecognitionAudio 
{ 
    public string content { get; set; } 
    // public string uri { get; set; } 

    public bool setContentBase64FromAudio(string path) 
    { 
     try 
     { 
      FileStream fileStream = File.OpenRead(path); 

      MemoryStream memoryStream = new MemoryStream(); 
      memoryStream.SetLength(fileStream.Length); 
      fileStream.Read(memoryStream.GetBuffer(), 0, (int)fileStream.Length); 
      byte[] BA_AudioFile = memoryStream.GetBuffer(); 
      this.content = System.Convert.ToBase64String(BA_AudioFile); 

      return true; 
     } 
     catch(Exception e) 
     { 
      return false; 
     } 

    } 
} 

コール:

private void button1_Click(object sender, EventArgs e) 
    { 
     Speech speech = new Speech(); 

     speech.config = new RecognitionConfig(); 
     speech.audio = new RecognitionAudio(); 
     speech.config.encoding = "FLAC"; 
     speech.config.sampleRateHertz = 44100; 
     speech.config.languageCode = "en-US"; 

     RecognitionAudio audio = new RecognitionAudio(); 
     audio.setContentBase64FromAudio("C:\\Users\\Manena\\Downloads\\good-morning-google.flac"); 

     speech.audio = audio; 

     string response = ""; 
     speech.sendToApi("https://speech.googleapis.com/", "v1/speech:recognize?key=<mykey>", ref response); 
     textBox1.Text = response; 

    } 
} 

編集:ここに私が送っJSONは次のとおりです。

{ 
     "config":{ 
      "encoding":"FLAC", 
      "sampleRateHertz":44100, 
      "languageCode":"en-US" 
     }, 
     "audio":{ 
      "content":"base64 audio" 
     } 
    } 

そして、私が受け取るもの:

{ 
     "Version": { 
     "Major": 1, 
     "Minor": 1, 
     "Build": -1, 
     "Revision": -1, 
     "MajorRevision": -1, 
     "MinorRevision": -1 
     }, 
     "Content": { 
     "Headers": [ 
      { 
      "Key": "Content-Type", 
      "Value": [ 
       "application/json; charset=UTF-8" 
      ] 
      } 
     ] 
     }, 
     "StatusCode": 400, 
     "ReasonPhrase": "Bad Request", 
     "Headers": [ 
     { 
      "Key": "Vary", 
      "Value": [ 
      "X-Origin", 
      "Referer", 
      "Origin", 
      "Accept-Encoding" 
      ] 
     }, 
     { 
      "Key": "X-XSS-Protection", 
      "Value": [ 
      "1; mode=block" 
      ] 
     }, 
     { 
      "Key": "X-Frame-Options", 
      "Value": [ 
      "SAMEORIGIN" 
      ] 
     }, 
     { 
      "Key": "X-Content-Type-Options", 
      "Value": [ 
      "nosniff" 
      ] 
     }, 
     { 
      "Key": "Alt-Svc", 
      "Value": [ 
      "hq=\":443\"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=\":443\"; ma=2592000; v=\"41,39,38,37,35\"" 
      ] 
     }, 
     { 
      "Key": "Transfer-Encoding", 
      "Value": [ 
      "chunked" 
      ] 
     }, 
     { 
      "Key": "Accept-Ranges", 
      "Value": [ 
      "none" 
      ] 
     }, 
     { 
      "Key": "Cache-Control", 
      "Value": [ 
      "private" 
      ] 
     }, 
     { 
      "Key": "Date", 
      "Value": [ 
      "Sat, 30 Dec 2017 09:06:19 GMT" 
      ] 
     }, 
     { 
      "Key": "Server", 
      "Value": [ 
      "ESF" 
      ] 
     } 
     ], 
     "RequestMessage": { 
     "Version": { 
      "Major": 1, 
      "Minor": 1, 
      "Build": -1, 
      "Revision": -1, 
      "MajorRevision": -1, 
      "MinorRevision": -1 
     }, 
     "Content": { 
      "Headers": [ 
      { 
       "Key": "Content-Type", 
       "Value": [ 
       "application/json; charset=utf-8" 
       ] 
      }, 
      { 
       "Key": "Content-Length", 
       "Value": [ 
       "106" 
       ] 
      } 
      ] 
     }, 
     "Method": { 
      "Method": "POST" 
     }, 
     "RequestUri": "https://speech.googleapis.com/v1/speech:recognize?key=mykey", 
     "Headers": [ 
      { 
      "Key": "Accept", 
      "Value": [ 
       "application/json" 
      ] 
      } 
     ], 
     "Properties": {} 
     }, 
     "IsSuccessStatusCode": false 
    } 

私のコードは最もエレガントではありませんが、今私はGoogle APIからの良い回答を得ることに興味があります。どんな手掛かり?

+1

まず、 '.Result'を使用して非同期にブロックしない誰かのために有用である可能性があります。非同期でコードを非同期にすることができない場合は、 'HttpWebRequest'のような同期APIを使用してください。しかし、あなたの問題に対処するには、送信しているJSONは何ですか?私は、あなたが望むものであることを疑うことができません。 – Crowcoder

+0

'ref'を使わないで' out'を使ってください – Amy

+0

イベントを作成し、そのAPIレスポンスで呼び出す方がよりエレガントだと思います。 "ref"または "out"パラメータを持つ代わりに –

答えて

1

私はこの問題を解決しました。

問題は、私が2チャンネルのオーディオファイルを使用していたことです.GoogleスピーチAPIは現在、モノラルオーディオのみを受け付けています。

だから、問題のコードは、1つのチャンネルオーディオのために働く、

おかげ

関連する問題