Google API的Node.js示例包含此内容(用于服务器代码)。这是来自Google在GitHub上的示例,简化为此目的:
const audio = {
content: fs.readFileSync(filename).toString('base64'),
};
const request = {
audio: audio,
};
return client
.longRunningRecognize(request)
.then(
...
})
这让我感到惊讶(因为我认为async是Node.js服务器代码的标准)。我想知道我是否可以用fs.readFile
替换它(这是异步版本)。
编辑:上面的部分似乎至少部分由一个简单的“是”回答,谢谢。但我不明白如何修复base64
部分(并避免在内存中有大文件)。
然而,我真正想做的是使用套接字将文件流式传输到此API。我可以这样做(如果我在如何做足够长的时间而努力......)?
编辑:我会很感激在这里使用套接字的一些例子。我如何流式传输到上面的结构?
编辑2:有一个库socked-io.file,但我不知道如何将其纳入上面的API接口。可以吗?
编辑3:在我的API代码中,文件已经在服务器上,但我想上传文件。 (抱歉有困惑。)
答案 0 :(得分:2)
如果您查看过client.longRunningRecognize()
的文档,您会看到request.audio
而包含Google云端商店音频文件的URI。
基于此方法,您可以选择将fs.createReadStream(filename)
作为上传流式传输到该位置,然后使用client.longRunningRecognize()
使用RecognitionAudio#uri
调用带有请求对象的RecognitionAudio#content
到流式上传的目标位置而不是fs.readFileSync()
作为文件的base64字符串。
这样可以防止像fs.readFileSync()
那样阻塞事件循环,并且可以避免像fs.readFile()
和 protobuffer
那样缓存内存中的整个文件。
似乎将RecognitionAudio#content
传递给[call()][2]
可以让您直接将音频数据流式传输到API请求,但查看该方法需要更多了解this的方式的工作原理。