2017-07-12 3 views
0

JavaサービスからBind Speech Rest APIを使用しようとしていますが、毎回408応答コードが取得されています。Bing Speech APIがJAVAコードでエラーを起こしています

にjava.io.IOException:サーバー返されたHTTPレスポンスコード:URLの408:私は切り抜いた方法が、すべての時間を使用してREST APIをコールしようとしたhttps://speech.platform.bing.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US

は、エラーが408要求のタイムアウトです。

私はSpeech REST APIを呼び出すのと同様のコードで.netサンプルを作成しましたが、動作しています。

Javaコードで見つからないものを診断する方法はありますか?ここで

は私のJavaコード

DataOutputStream dos = null; 
int bytesRead, bytesAvailable, bufferSize; 
byte[] buffer; 
int maxBufferSize = 1024; // 1024*1024 = 1MB. 212144 is a quarter MB. 
FileInputStream fileInputStream = null; 

fileInputStream = new FileInputStream(new File("D://hello.wav")); 


       URL url = new URL("https://speech.platform.bing.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US"); 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
    //method 
    conn.setRequestMethod("POST"); 
    conn.setRequestProperty("Transfer-Encoding", "chunked"); 
    conn.setRequestProperty("Accept","application/json;text/xml"); 
    conn.setRequestProperty("Host","speech.platform.bing.com"); 
    //header 
    conn.setRequestProperty("content-length", String.valueOf(fileInputStream.available())); 
    conn.setRequestProperty("Content-Type", "audio/wav; codec=\"audio/pcm\"; samplerate=16000;"); 
    conn.setRequestProperty("Authorization", "Bearer "+ token); 
    conn.setReadTimeout(22222230); 
    conn.setDoOutput(true); 

    conn.connect(); 

    dos = new DataOutputStream(conn.getOutputStream()); 

    bytesAvailable = fileInputStream.available(); 
    bufferSize = Math.min(bytesAvailable, maxBufferSize); 
    buffer = new byte[bufferSize]; 

    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
    while (bytesRead > 0) 
    { 
    try { 
     dos.write(buffer, 0, bufferSize);   
    } catch (OutOfMemoryError oome) { 

     oome.printStackTrace(); 
     fileInputStream.close(); 
     throw new Exception("Out Of Memory!"); 
    } 
    bytesAvailable = fileInputStream.available(); 
    bufferSize = Math.min(bytesAvailable, maxBufferSize); 
    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
    } 

    fileInputStream.close(); 
    dos.flush(); 
    dos.close(); 


    BufferedReader in = new BufferedReader(
      new InputStreamReader(
      conn.getInputStream())); 
      String decodedString; 
      while ((decodedString = in.readLine()) != null) { 
      System.out.println(decodedString); 
      } 

答えて

0

はビングスピーチAPIは、オーディオデータのチャンク転送を望んでいます。しかしHttpURLConnectionクラスの場合、Transfer-Encodingヘッダーを設定しても魔法のように転送タイプが切り替わるわけではありません。setChunkedStreamingModeまたはその変形の1つを使用してストリーミングモードを明示的に設定する必要があります。また、Content-Lengthヘッダーを省略することもできます。

HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
//method 
conn.setRequestMethod("POST"); 
conn.setChunkedStreamingMode(0); 
//header 
conn.setRequestProperty("Accept","application/json;text/xml"); 
conn.setRequestProperty("Content-Type", "audio/wav; codec=\"audio/pcm\"; samplerate=16000;"); 
conn.setRequestProperty("Authorization", "Bearer "+ token); 
+0

ありがとうございました。これは機能します。私はJavaで新しいので、setChunkedStreamingModeの必要性を認識していませんでした。 –

関連する問題