Возникла проблема при использовании долгого API Google для асинхронного распознавания речи.operation.done
не возвращает истину.
Я изменил образец программы Objective-C https://github.com/GoogleCloudPlatform/ios-docs-samples/blob/master/speech/Objective-C/Speech-gRPC-Nonstreaming/Speech/SpeechRecognitionService.m для использования longruning API.
Вот модифицированный фрагмент -
// prepare a single gRPC call to make the request
GRPCProtoCall *call = [client RPCToLongRunningRecognizeWithRequest:recognizeRequest
handler:
^(Operation *operation, NSError *nserror) {
if (nserror) {
NSLog(@"ERROR: %@", nserror);
completion([nserror description]);
} else {
NSLog(@"RESPONSE name %@", operation.name);
while (!operation.done) {
NSLog(@"operation done - %d", operation.done);
usleep(2000000);
}
GPBAny *gpbAny = operation.response;
NSLog(@"RESPONSE typeURL %@", gpbAny.typeURL);
NSLog(@"RESPONSE deescription %@", gpbAny.value.description);
GPBMessage *longRunningResponse = [gpbAny unpackMessageClass:LongRunningRecognizeResponse.class error:nil];
NSLog(@"RESPONSE RECEIVED %@", longRunningResponse);
completion(longRunningResponse);
}
}];
Это никогда не приходитиз цикла while (!operation.done)
.operation.name
вернуть правильный идентификатор операции.Я смог проверить с помощью команды gcloud ml speech operations describe 2104003022050949209
, что вызов перешел на Google Speech API, и он вернул записанное сообщение.Но код объективного C не возвращает операцию.