我正在使用Google Speech to Text Node.js客户端。 开始长时间运行的语音记录时,我需要将操作分为两个步骤。 1.开始转录,然后返回“名称”。 2.询问操作状态。 即在nodejs中复制https://cloud.google.com/speech-to-text/docs/async-recognize#speech-async-recognize-gcs-protocol。
我的问题是弄清楚如何创建OperationsClient,并使getOperation({name})实际返回转录结果。
我确实在两个Firebase云函数中运行此代码: 1.开始抄录的人,然后返回“名称”。此代码与SpeechClient配合得很好。 2.另一个应该调用operationsClient.getOperation的别名,也称为curl到“ https://speech.googleapis.com/v1/operations/”
import gax, {GrpcClient, GrpcClientOptions, lro} from "google-gax";
const gaxOpts = {
clientConfig: {}
}
const gaxGrpc = new GrpcClient(gaxOpts);
...
app.get('/operations/:googleSpeechRef', async (req, res) => {
const googleSpeechRef = req.params.googleSpeechRef;
const operationsClient = lro({
auth: gaxGrpc.auth,
grpc: gaxGrpc.grpc,
}).operationsClient(gaxOpts);
try {
const [responses] = await operationsClient.getOperation({name: googleSpeechRef},{});
if (responses) {
const operation = responses[0]
console.log("getOperation. responses: ", responses)
const initialApiResponse = responses[1]
operation
.on("complete", (longRunningRecognizeResponse /*, longRunningRecognizeMetadata, finalApiResponse*/) => {
// Adding a listener for the "complete" event starts polling for the
// completion of the operation.
const speechRecognitionResults = longRunningRecognizeResponse.results as ISpeechRecognitionResult[]
// resolve(speechRecognitionResults)
console.log("complete: ", speechRecognitionResults)
})
.on("progress", async (longRunningRecognizeMetadata /*, apiResponse*/) => {
// Adding a listener for the "progress" event causes the callback to be
// called on any change in metadata when the operation is polled.
const percent = longRunningRecognizeMetadata.progressPercent
console.log("progress. Percent", longRunningRecognizeMetadata.progressPercent /*, apiResponse*/)
})
.on("error", (error: Error) => {
// Adding a listener for the "error" event handles any errors found during polling.
// reject(error)
console.log("error: ", error)
})
res.contentType("application/json").status(200).send(JSON.stringify(initialApiResponse))
} else {
res.send(404)
}
} catch (error) {
console.error("Failed to fetch operation by googleSpeechRef: ", googleSpeechRef, ". Error: ", error);
res.status(500).send(serializeError(error))
}
}
我得到的错误是:
{
"code": 13,
"details": "Not enough responses received",
"metadata":{
"internalRepr":{}
},
"note": "Exception occurred in retry method that was not classified as transient",
"name": "Error",
"message": "Not enough responses received",
"stack": "Error: Not enough responses received\n at Http2CallStream.call.on (/srv/node_modules/@grpc/grpc-js/build/src/client.js:102:45)\n at emitOne (events.js:121:20)\n at Http2CallStream.emit (events.js:211:7)\n at Http2CallStream.endCall (/srv/node_modules/@grpc/grpc-js/build/src/call-stream.js:74:18)\n at /srv/node_modules/@grpc/grpc-js/build/src/call-stream.js:355:18\n at <anonymous>\n at process._tickDomainCallback (internal/process/next_tick.js:229:7)"
}
答案 0 :(得分:0)
对于以后发现此问题的任何人。这个答案https://github.com/googleapis/nodejs-speech/issues/10#issuecomment-415900469
解决了我的挑战const { google } = require('googleapis');
(async () => {
const auth = await google.auth.getClient({
scopes: ['https://www.googleapis.com/auth/cloud-platform']
});
const { data } = await google.speech('v1').operations.get({ auth, name: OPERATION_NAME });
console.log(data);
})();