如何在 Cloud Functions 上恢复 Google Cloud Speech API (longRunningRecognize) 超时
How to resume Google Cloud Speech API (longRunningRecognize) timeout on Cloud Functions
我正在尝试创建一个应用程序来使用云功能和云语音转录一些 wav 文件 API。官方文档展示了如何做到这一点(https://cloud.google.com/speech-to-text/docs/async-recognize)。但是,云函数有处理时间限制(最多540秒),一些长的wav文件可能会超过等待转录的时间API。我正在寻找恢复方式。
官方文档给出了如下代码。 (我将节点用于云功能)
// Detects speech in the audio file. This creates a recognition job that you
// can wait for now, or get its result later.
const [operation] = await client.longRunningRecognize(request);
// Get a Promise representation of the final result of the job
const [response] = await operation.promise();
client.longRunningRecognize()发送请求,returns请求信息几秒后,operation.promise()等待转录API完成。但是大文件可能会超过540秒,进程可能会在这一行被kill掉。所以我想以某种方式在另一个进程中使用 'operation' 对象恢复处理。我尝试将 'operation' 对象序列化为一个文件并在之后加载它,但它不能包含函数并且 operation.promise() 丢失了。我该如何解决这个问题?
如果您的工作需要超过 540 秒,Cloud Functions 并不是解决此问题的最佳解决方案。相反,您可能需要考虑将 Cloud Functions 用作触发机制,然后使用 pubsub 将工作卸载到 App Engine 或 Compute Engine 以向其发送相关数据(例如,文件在 Cloud Storage 中的位置,以及其他需要的元数据)发出识别语音的请求。
方法如下(代码在PHP,但是思路类是一样的)
$client = new SpeechClient([
'credentials' => json_decode(file_get_contents('keys.json'), true)
]);
$operation = $client->longRunningRecognize($config, $audio);
$operationName = $operation->getName()
现在作业已经开始,您可以将“$operationName”保存在某个地方(比如在数据库中)以用于另一个进程。
在另一个进程中
$client = new SpeechClient([
'credentials' => json_decode(file_get_contents('keys.json'), true)
]);
CloudSpeech::initOnce();
$newOperationResponse = $speechClient->resumeOperation($name, 'LongRunningRecognize');
if ($newOperationResponse->operationSucceeded()) {
$result = $newOperationResponse->getResult();
}
...
注意:确保将“LongRunningRecognize”作为恢复操作名称而不是“longRunningRecognize”(首字母应大写 - 与文档相反 https://github.com/googleapis/google-cloud-php-speech/blob/master/src/V1/Gapic/SpeechGapicClient.php#L312)
否则响应将被 protobuf 编码 (https://github.com/googleapis/google-cloud-php-speech/blob/master/src/V1/Gapic/SpeechGapicClient.php#L135)
这个答案有助于找到最终的解决方案
我正在尝试创建一个应用程序来使用云功能和云语音转录一些 wav 文件 API。官方文档展示了如何做到这一点(https://cloud.google.com/speech-to-text/docs/async-recognize)。但是,云函数有处理时间限制(最多540秒),一些长的wav文件可能会超过等待转录的时间API。我正在寻找恢复方式。
官方文档给出了如下代码。 (我将节点用于云功能)
// Detects speech in the audio file. This creates a recognition job that you
// can wait for now, or get its result later.
const [operation] = await client.longRunningRecognize(request);
// Get a Promise representation of the final result of the job
const [response] = await operation.promise();
client.longRunningRecognize()发送请求,returns请求信息几秒后,operation.promise()等待转录API完成。但是大文件可能会超过540秒,进程可能会在这一行被kill掉。所以我想以某种方式在另一个进程中使用 'operation' 对象恢复处理。我尝试将 'operation' 对象序列化为一个文件并在之后加载它,但它不能包含函数并且 operation.promise() 丢失了。我该如何解决这个问题?
如果您的工作需要超过 540 秒,Cloud Functions 并不是解决此问题的最佳解决方案。相反,您可能需要考虑将 Cloud Functions 用作触发机制,然后使用 pubsub 将工作卸载到 App Engine 或 Compute Engine 以向其发送相关数据(例如,文件在 Cloud Storage 中的位置,以及其他需要的元数据)发出识别语音的请求。
方法如下(代码在PHP,但是思路类是一样的)
$client = new SpeechClient([
'credentials' => json_decode(file_get_contents('keys.json'), true)
]);
$operation = $client->longRunningRecognize($config, $audio);
$operationName = $operation->getName()
现在作业已经开始,您可以将“$operationName”保存在某个地方(比如在数据库中)以用于另一个进程。
在另一个进程中
$client = new SpeechClient([
'credentials' => json_decode(file_get_contents('keys.json'), true)
]);
CloudSpeech::initOnce();
$newOperationResponse = $speechClient->resumeOperation($name, 'LongRunningRecognize');
if ($newOperationResponse->operationSucceeded()) {
$result = $newOperationResponse->getResult();
}
...
注意:确保将“LongRunningRecognize”作为恢复操作名称而不是“longRunningRecognize”(首字母应大写 - 与文档相反 https://github.com/googleapis/google-cloud-php-speech/blob/master/src/V1/Gapic/SpeechGapicClient.php#L312)
否则响应将被 protobuf 编码 (https://github.com/googleapis/google-cloud-php-speech/blob/master/src/V1/Gapic/SpeechGapicClient.php#L135)
这个答案有助于找到最终的解决方案