我正在尝试编写一个简单的网络应用,该应用使用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"运营商,你需要返回一个承诺。我不确定如何做到这一点或是否有更好的选择。我认为我对缺乏异步性的知识确实存在问题。
答案 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)
}