продолжение теста с API облачной речи ... Я загрузил еще один образец из here, и я немного изменил его, потому что класс ClientAuthInterceptor устарел. Я использую учетную запись службы и соответствующий используемый код заключается в следующем:Недопустимая подпись JWT на аутентификации службы платформы Google
// 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();
}
Всего этот код вызываются во время инициализации приложения, и файл auth.json это файл аутентификация генерируется в консоли Google , содержащий всю информацию о ID проекта и закрытом ключе. Затем функция распознаетBytes вызывается с первым фрагментом аудиоданных; перед отправкой фактической аудиоданные вы должны послать сообщение только признающей конфигурации, и это делается с помощью этой функции:
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);
}
После первого вызова, то, что я получаю это код 400 ошибок, как заявлено трассировки стека ниже:
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
Как весь процесс подписания запроса выполняется библиотекой Google, я не знаю точно, что можно сделать ... Я уже отправил запрос на Техническая поддержка Google, доступная в течение пробного периода, но, возможно, у кого-то есть некоторые советы.
Спасибо. Родольфо.
Мой друг (для которого я разместил этот вопрос) наконец-то создал образец WORKING, который отправляет предварительно записанный звуковой файл flac. Если кто-то заинтересован, я попрошу рабочий код. Это небольшой проект в Android Studio. –