2017-12-15 18 views
1

短いオーディオファイルからStringを取得するために、speech recognition API by Microsoftがテストされました。このAPIは、整形式のメディアタイプを必要としません(RetrofitまたはOkhttpの場合のみ、本当に整形式なのですか?)。IllegalArgumentExceptionを解決するにはRetrofitで不正なコンテンツタイプ:......

Content-Type: audio/wav; codec=audio/pcm; samplerate=16000 

このように、以下のようなRetrofitインターフェイス用に設定しました。

@Multipart 
    @POST("/speech/recognition/{recognitionMode}/cognitiveservices/v1") 
    Observable<Recognition> getRecgnition(
      @Header("Ocp-Apim-Subscription-Key") String subscriptionKey, 
      @Header("Content-Type") String contentType, 
      @Path("recognitionMode") String recognitionMode, 
      @Query("language") String language, 
      @Query("format") String format, 
      @Part("file")RequestBody file 
    ); 

は、それから私は、このヘッダとオーディオファイルを送信するための要求でエラーを持っています。私はその理由を知っているので、はnullを返すだろうからMatcher#lookingAtfalseを返すだろうから。

さて、私は理由がある。この例外を無視する方法はわかりません。 このエラーを回避するためのアドバイスをお願いします。

java.lang.IllegalArgumentException: Malformed content type: audio/wav;codec=audio/pcm; samplerate=16000 
    at retrofit2.RequestBuilder.addHeader(RequestBuilder.java:81) 
    at retrofit2.ParameterHandler$Header.apply(ParameterHandler.java:79) 
    at retrofit2.ServiceMethod.toRequest(ServiceMethod.java:111) 
    at retrofit2.OkHttpCall.createRawCall(OkHttpCall.java:184) 
    at retrofit2.OkHttpCall.execute(OkHttpCall.java:168) 
    at retrofit2.adapter.rxjava.CallExecuteOnSubscribe.call(CallExecuteOnSubscribe.java:40) 
    at retrofit2.adapter.rxjava.CallExecuteOnSubscribe.call(CallExecuteOnSubscribe.java:24) 
    at retrofit2.adapter.rxjava.BodyOnSubscribe.call(BodyOnSubscribe.java:36) 
    at retrofit2.adapter.rxjava.BodyOnSubscribe.call(BodyOnSubscribe.java:28) 
    at rx.Observable.unsafeSubscribe(Observable.java:10256) 
    at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100) 
    at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:230) 
    at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
    at java.lang.Thread.run(Thread.java:762) 

答えて

1

私はこの問題の解決策を見つけました。 Okhttpインターセプターでヘッダーを追加しました。

private class SpeechRecognitionIntercepter implements Interceptor { 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Headers.Builder builder = new Headers.Builder(); 
     builder.add("Ocp-Apim-Subscription-Key", "here-is-your-own-subscription-key"); 
     builder.add("Accept", "application/json"); 
     builder.add("Content-Type", "audio/wav; codec=audio/pcm; samplerate=16000"); 
     return chain.proceed(
       chain.request().newBuilder() 
         .headers(builder.build()) 
         .build() 
     ); 
    } 
} 

次に、このインターセプタを追加します。

new OkHttpClient.Builder().addInterceptor(new SpeechRecognitionIntercepter()) 
関連する問題