使用nodejs在Google Speech to Text中按名称获取操作

时间:2019-05-23 18:55:20

标签: node.js google-speech-api google-cloud-speech

我正在使用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)"
}

1 个答案:

答案 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);
})();