在 Express 服务器中使用 Google 语音 API

Using Google Speech API in Express server

我正在尝试编写一个简单的 Web 应用程序,它使用 Google 语音 API 将音频文件转录为文本。我正确设置了 Google 语音 API 身份验证等,因此我设法 运行 Google 的节点示例。现在我想从我自己的服务器上一个名为 "audio.raw" 的本地文件调用它,该文件与以下 server.js:

位于同一目录中
const express = require("express");
const fs = require("fs");
const app = express();
app.set("port", process.env.PORT || 3001);

function syncRecognize (filename, encoding, sampleRateHertz, languageCode) {

  const Speech = require('@google-cloud/speech');
  const speech = Speech();

  const request = {
    encoding: encoding,
    sampleRateHertz: sampleRateHertz,
    languageCode: languageCode
  };

  speech.recognize(filename, request)
    .then((results) => {
      const transcription = results[0];
      return transcription;
    })
    .catch((err) => {
      console.error('ERROR:', err);
    });
}

app.get("/api/transcribe", (req, res) => {

  syncRecognize(
    './audio.raw',
    'LINEAR16',
    16000,
    'en-US'
  ).then(text => {res.json(text)})
  .catch((err) => {
    console.error('ERROR:', err);
  });   
})

当我尝试这样做时,出现以下错误:

[0] TypeError: Cannot read property 'then' of undefined
[0]     at /path/to/server.js:62:4 // the .then after syncRecognize(...)
...

我需要做哪些不同的事情?

编辑

好的,所以我验证了 syncRecognize 函数在某些时候确实 return 是正确的 const transcription。问题是出于某种原因 .then 不会等待它被 returned。

我读到要使用“.then”运算符,您需要 return 一个承诺。我不确定如何执行此操作或是否有更好的选择。估计真的是我对异步知识不够了解的问题。

我们可以在函数的最后几行中看到方法调用 recognize() 确实 return 一个 Promise。您可以通过使用 f .then().catch()

轻松分辨

由于您在 app.get() 中调用此方法作为 Promise,只需 return 您方法中的 Promise:

const Speech = require('@google-cloud/speech')
const speech = Speech()

function syncRecognize (filename, encoding, sampleRateHertz, languageCode) {

  const request = {
    encoding,
    sampleRateHertz,
    languageCode,
  }

  return speech.recognize(filename, request)
}