【发布时间】:2021-02-10 09:17:52
【问题描述】:
我希望能够结束 Google 语音到文本流 (created with streamingRecognize),并取回待处理的 SR(语音识别)结果。
简而言之,相关的 Node.js 代码:
// create SR stream
const stream = speechClient.streamingRecognize(request);
// observe data event
const dataPromise = new Promise(resolve => stream.on('data', resolve));
// observe error event
const errorPromise = new Promise((resolve, reject) => stream.on('error', reject));
// observe finish event
const finishPromise = new Promise(resolve => stream.on('finish', resolve));
// send the audio
stream.write(audioChunk);
// for testing purposes only, give the SR stream 2 seconds to absorb the audio
await new Promise(resolve => setTimeout(resolve, 2000));
// end the SR stream gracefully, by observing the completion callback
const endPromise = util.promisify(callback => stream.end(callback))();
// a 5 seconds test timeout
const timeoutPromise = new Promise(resolve => setTimeout(resolve, 5000));
// finishPromise wins the race here
await Promise.race([
dataPromise, errorPromise, finishPromise, endPromise, timeoutPromise]);
// endPromise wins the race here
await Promise.race([
dataPromise, errorPromise, endPromise, timeoutPromise]);
// timeoutPromise wins the race here
await Promise.race([dataPromise, errorPromise, timeoutPromise]);
// I don't see any data or error events, dataPromise and errorPromise don't get settled
我的经验是 SR 流成功结束,但我没有收到任何数据事件或错误事件。 dataPromise 和 errorPromise 都没有得到解决或拒绝。
如何发出音频结束信号、关闭 SR 流并仍然获得待处理的 SR 结果?
我需要坚持使用streamingRecognize API,因为我正在流式传输的音频是实时的,即使它可能会突然停止。
澄清一下,只要我继续流式传输音频,它就可以工作,我确实会收到实时 SR 结果。但是,当我发送最终的音频块并像上面那样结束流时,我没有得到我期望的最终结果。
要获得最终结果,我实际上必须再保持流静默几秒钟,这可能会增加 ST 费用。我觉得必须有更好的方法来获取它们。
更新: 看来,结束streamingRecognize 流的唯一适当时间是在data 事件时StreamingRecognitionResult.is_final 是true。同样,我们似乎应该在data 事件被触发之前保持流式传输音频,以获得任何结果,最终的或临时的。
这对我来说似乎是一个错误,提交issue。
更新:现在似乎已经确认as a bug。在修复之前,我正在寻找一种潜在的解决方法。
更新:供将来参考,here is the list 当前和以前跟踪的涉及streamingRecognize 的问题。
我希望这对于使用streamingRecognize 的人来说是一个常见问题,但很惊讶以前没有报告过。也将as a bug 提交给issuetracker.google.com。
【问题讨论】:
标签: javascript node.js async-await speech-recognition google-cloud-speech