2016-11-30 3 views
1

Fortsetzungstest mit der Cloud Speech-API ... Ich habe ein anderes Beispiel von here heruntergeladen, und ich habe es leicht geändert, weil die Klasse ClientAuthInterceptor veraltet ist. Ich bin mit einem Dienstkonto und der entsprechende verwendete Code ist dies:Ungültige JWT-Signatur bei der Google Platform-Dienstauthentifizierung

// This is contained in the MainActivity code. 
String fCred = _lu.getBasePath() + "auth.json"; 

try 
{ 
    InputStream isCred = new FileInputStream(fCred); 
    ManagedChannel channel = ManagedChannelBuilder.forAddress(HOSTNAME, PORT).build(); 
    mStreamingClient = new StreamingRecognizeClient(channel, isCred, RECORDER_SAMPLERATE); 
} 
catch (IOException openEx) 
{ 
    Log.e(MainActivity.class.getSimpleName(), "Error", openEx); 
} 

// This is contained in the StreamingRecognizeClient class code 
public StreamingRecognizeClient(ManagedChannel channel, InputStream credentials, int samplingRate) throws IOException 
{ 
    this.mSamplingRate = samplingRate; 
    this.mChannel = channel; 
    GoogleCredentials creds = GoogleCredentials.fromStream(credentials); 

    if (creds.createScopedRequired()) 
     creds = creds.createScoped(OAUTH2_SCOPES); 

    CallCredentials callCreds = MoreCallCredentials.from(creds); 
    mSpeechClient = SpeechGrpc.newStub(channel).withCallCredentials(callCreds); 

    credentials.close(); 
} 

All-Code wird während der App-Initialisierung aufgerufen und die Datei auth.json ist die Authentifizierungsdatei von der Google-Konsole erzeugt mit allen Informationen zur Projekt-ID und zum privaten Schlüssel. Dann wird die Funktion recognizeBytes mit dem ersten Chunk der Audiodaten aufgerufen; vor den eigentlichen Audiodaten zu senden Sie eine Nachricht mit nur der Erkennungs Konfiguration zu senden, und das von dieser Funktion erfolgt:

private void initializeRecognition() throws InterruptedException, IOException 
{ 
    requestObserver = mSpeechClient.streamingRecognize(this); 
    RecognitionConfig config = RecognitionConfig.newBuilder().setEncoding(AudioEncoding.FLAC).setSampleRate(mSamplingRate).build(); 
    StreamingRecognitionConfig streamingConfig = StreamingRecognitionConfig.newBuilder().setConfig(config).setInterimResults(true).setSingleUtterance(true).build(); 
    StreamingRecognizeRequest initial = StreamingRecognizeRequest.newBuilder().setStreamingConfig(streamingConfig).build(); 

    requestObserver.onNext(initial); 
} 

Nach diesem ersten Anruf, was erhalte ich einen 400-Fehlercode, indem sie als angegeben der Stack-Trace:

11-30 15:34:12.916 3676-7309/? W/StreamingRecognizeClient: recognize failed: {0}: Status{code=UNAUTHENTICATED, description=null, cause=java.io.IOException: Error getting access token for service account: } 
11-30 15:34:12.918 3676-7309/? E/StreamingRecognizeClient: Error to Recognize. 
    io.grpc.StatusRuntimeException: UNAUTHENTICATED 
     at me.yurifariasg.StreamingRecognizeClient.onError(StreamingRecognizeClient.java:98) 
     at io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onClose(ClientCalls.java:395) 
     at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:481) 
     at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$600(ClientCallImpl.java:398) 
     at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:513) 
     at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:52) 
     at io.grpc.internal.SerializingExecutor$TaskRunner.run(SerializingExecutor.java:154) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
     at java.lang.Thread.run(Thread.java:818) 
    Caused by: java.io.IOException: Error getting access token for service account: 
     at com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken(ServiceAccountCredentials.java:227) 
     at com.google.auth.oauth2.OAuth2Credentials.refresh(OAuth2Credentials.java:97) 
     at com.google.auth.oauth2.OAuth2Credentials.getRequestMetadata(OAuth2Credentials.java:74) 
     at io.grpc.auth.GoogleAuthLibraryCallCredentials$1.run(GoogleAuthLibraryCallCredentials.java:113) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
     at java.lang.Thread.run(Thread.java:818)  
    Caused by: com.google.api.client.http.HttpResponseException: 400 Bad Request 
     { 
      "error" : "invalid_grant", 
      "error_description" : "Invalid JWT Signature." 
     } 
     at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1054) 
     at com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken(ServiceAccountCredentials.java:225) 
                  ... 6 more 

Da alle der Prozess die Anforderung der Unterzeichnung durch die Google-Bibliothek durchgeführt wird, ich weiß nicht genau, was getan werden kann ... ich habe bereits eine Anfrage an die gesendet Technischer Support von Google, verfügbar während der Testphase, aber vielleicht hat jemand einen Ratschlag.

Danke. Rodolfo.

+0

Ein Freund von mir (für den ich diese Frage gestellt habe) hat endlich ein WORKING-Sample erstellt, das eine zuvor aufgenommene FLAC-Audiodatei sendet. Wenn jemand interessiert ist, frage ich nach dem Arbeitscode. Es ist ein kleines Projekt in Android Studio. –

Antwort

0

In meinem Fall lade ich Symboldateien zum Firebase-Absturzbericht hoch. Nachdem ich einen neuen privaten Schlüssel in der Firebase-Konsole erstellt habe, ist das Problem gelöst. Also, hast du versucht, eine neue "auth.json" zu bekommen?

Verwandte Themen