2017-12-15 7 views
1

Ich habe speech recognition API by Microsoft getestet, um den String aus einer kurzen Audiodatei zu erhalten. Diese API benötigt keinen wohlgeformten Medientyp (Ist das wirklich nicht wohlgeformt? Nur für Retrofit oder Okhttp?).So lösen Sie die IllegalArgumentException "Malformed Inhaltstyp: ......" mit Retrofit

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

So habe ich es für die Retrofit-Schnittstelle wie folgt festgelegt.

@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 
    ); 

Dann habe ich den Fehler in der Anfrage, eine Audiodatei mit diesem Header zu senden. Ich kenne den Grund, weil MediaType#parsenull zurückgeben wird, weil Matcher#lookingAtfalse zurückgeben wird.

Okay, ich habe den Grund. aber ich weiß nicht, wie ich diese Ausnahme ignorieren soll. Könnten Sie mir bitte einen Rat geben, um diesen Fehler zu vermeiden?

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) 

Antwort

1

Ich habe gerade die Lösung für dieses Problem gefunden. Gerade hinzugefügt Header mit Okhttp Intercepter.

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

Dann fügen Sie diesen Interzeptor hinzu.

new OkHttpClient.Builder().addInterceptor(new SpeechRecognitionIntercepter()) 
Verwandte Themen