在Express服务器中使用Google Speech API

时间:2017-07-02 09:56:12

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

我正在尝试编写一个简单的网络应用,该应用使用Google Speech API将音频文件转录为文本。我正确设置了Google Speech 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函数确实在某个时候返回了正确的const transcription。问题是,由于某种原因,.then不会等待返回。

我读到这是为了使用" .then"运营商,你需要返回一个承诺。我不确定如何做到这一点或是否有更好的选择。我认为我对缺乏异步性的知识确实存在问题。

1 个答案:

答案 0 :(得分:0)

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

轻松判断

由于您在app.get()中将此方法称为承诺,只需在方法中返回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)
}