尝试恢复语音转文本操作时出现此错误。
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');
有可能做这样的事情吗?
答案 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)。