2017-12-15 33 views
1

짧은 오디오 파일에서 String을 가져 오는 데는 speech recognition API by Microsoft으로 테스트되었습니다. 이 API에는 올바른 형식의 미디어 유형이 필요하지 않습니다 (이 기능은 실제로 Retrofit 또는 Okhttp에만 적합합니까?).IllegalArgumentException을 해결하는 방법 Retrofit을 사용하여 "Malformed content type : ......"

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())