尚未将google.cloud.speech.v1.LongRunningRecognizeMetadata类添加到描述符池

时间:2019-07-05 07:32:59

标签: php grpc google-speech-api google-cloud-speech

尝试恢复语音转文本操作时出现此错误。

Google\Protobuf\Internal\GPBDecodeException: Error occurred during parsing: Class google.cloud.speech.v1.LongRunningRecognizeMetadata hasn't been added to descriptor pool in Google\Protobuf\Internal\Message->parseFromJsonStream()

我正在做的是开始长时间运行的操作并存储名称。稍后,我将根据之前存储的名称创建一个单独的页面,并显示操作状态。

这就是我用来获取操作状态的信息

$speechClient = new SpeechClient();
$operationResponse = $speechClient->resumeOperation($record->operation_name, 'longRunningRecognize');

有可能做这样的事情吗?

2 个答案:

答案 0 :(得分:0)

这花了我很长时间才能弄清楚这种简单的解决方法,但是你去了。

在致电resumeOperation之前放入此行:

\GPBMetadata\Google\Cloud\Speech\V1\CloudSpeech::initOnce();

我认为这是SDK中的错误,但是考虑到他们的文档说客户端库在Alpha中,这是有道理的。


更长的解释(因为花了我这么长的时间,如果再次遇到这个问题,我知道以后会找到SO的答案)

SpeechGapicClient::longRunningRecognize()方法上方的DocBlocks显示了一种使用$operation->pollUntilComplete()阻止轮询的替代方法。

// start the operation, keep the operation name, and resume later
$operationResponse = $speechClient->longRunningRecognize($config, $audio);
$operationName = $operationResponse->getName();
// ... do other work
$newOperationResponse = $speechClient->resumeOperation($operationName, 'longRunningRecognize');
while (!$newOperationResponse->isDone()) {
    // ... do other work
    $newOperationResponse->reload();
}
if ($newOperationResponse->operationSucceeded()) {
    $result = $newOperationResponse->getResult();
    // doSomethingWith($result)
} else {
    $error = $newOperationResponse->getError();
    // handleError($error)
}

如果您在resumeOperation()方法返回的同一操作上调用longRunningRecognize(),则一切都很好。如果您尝试像我和我一样在单独的请求中继续进行操作,则会收到您上面提到的错误。

不同之处在于,longRunningRecognize()方法创建了一个请求(LongRunningRecognizeRequest),该请求得以执行,而resumeOperation()非常简单,不需要合并请求参数即可发送给Google

这里的区别是LongRunningRecognizeRequest调用\GPBMetadata\Google\Cloud\Speech\V1\CloudSpeech::initOnce();的构造函数建立了所需的语音描述符。


我希望这会有所帮助!

答案 1 :(得分:0)

我遇到了一个非常相似的问题,试图获取有关操作 (getOperation) 的信息:

Google\Protobuf\Internal\GPBDecodeException 解析过程中发生错误:google.cloud.speech.v1p1beta1.LongRunningRecognizeMetadata 类尚未添加到描述符池

由于@stevenwadejr 已经正确回答,这可以通过在调用前调用 initOnce() 来解决。

<?php
use Google\Cloud\Speech\V1p1beta1\SpeechClient;
use GPBMetadata\Google\Cloud\Speech\V1P1Beta1\CloudSpeech;

$client = new SpeechClient();

// This line is required. It adds LongRunningRecognizeMetadata and others to the pool of recognized classes
CloudSpeech::initOnce();

// Now, I can get the operation without raising an exception
$operation = $client->getOperationsClient()->getOperation('1234567890123456789');

您可以检查文件\vendor\google\protobuf\src\Google\Protobuf\Internal\AnyBase.php 函数unpack()。如果没有 initOnce 命令,池变量在 $proto->proto_to_class 数组中没有fully_qualifed_name (google.cloud.speech.v1p1beta1.LongRunningRecognizeMetadata)。