【问题标题】:Google speech api, node.js client - wrong results when using 'operation'Google 语音 api、node.js 客户端 - 使用“操作”时结果错误
【发布时间】:2017-05-01 18:23:30
【问题描述】:

我正在使用 node.js 客户端库,特别是 startRecognition 方法,为了获得结果,我使用了 Speech.operation。但是,我得到以下结果而不是结果 - 查看包含一些编码字符串而不是 JavaScript 对象的“值”对象。

{ result: 'response',
  name: '3939860839213416358',
  metadata: 
   { typeUrl: 'type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata',
     value: 'CGQSCwiKx47IBRCg6pRuGgsIqM6OyAUQgO+vYQ==' },
  done: true,
  error: null,
  response: 
   { typeUrl: 'type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse',
     value: 'EoQaCtICCsoCVGhleSBzbWFsbCBsYXRlc3QgZW52aXJvbm1lbnQuIFdlIGhhdmUgYSBjb3Jwb3JhdGUgYnVzaW5lc3Mgc2VydmljZSBhbmQgdGhlcmVmb3Jl' } }

有人看过吗?这是一个错误吗?还是有办法将其解码为 JavaScript 对象?

这是一个演示问题的代码sn-p:

var Speech = require('@google-cloud/speech')({
  projectId: 'my project name',
  keyFilename: '<key file name>.json'
});

var opName='';

var config = {
  encoding: 'LINEAR16',
  sampleRateHertz: 48000,
  languageCode: 'en-US',
  maxAlternatives: 10
};

asyncGoogleASR('gs://file-location',config);

function asyncGoogleASR(googleCloudURI,request) {
    Speech.startRecognition(googleCloudURI, request,async_callback);
}
function async_callback(err, operation, apiResponse) {
  if (err) {
    console.log(err);
  }
  opName=operation.latestResponse.name;

   operation
    .on('error', function(err) {
        console.log("error");
        console.log(err);
    })
    .on('complete', function(results) {
        console.log(results);  // this works okay
        var op = Speech.operation(opName);
           op
            .on('error', function(err) {
                console.log("error");
                console.log(err);
            })
            .on('complete', function(results) {
                console.log(results);  // this prints garbage
            });
   });


 }

【问题讨论】:

  • 你能在你提出请求的地方显示代码吗?
  • 刚刚更新了帖子,添加了我正在使用的代码

标签: node.js google-cloud-speech


【解决方案1】:

LongRunningOperation 从第一个请求返回,但您必须在操作完成后检索结果。换句话说,speech.startRecognize 将返回您轮询的“操作”标识符,直到操作完成并稍后用于检索结果。

以下代码已经过测试,可以帮助您入门:

const Speech = require('@google-cloud/speech');
const speech = Speech();
const request = {
  encoding: encoding,
  sampleRateHertz: sampleRateHertz,
  languageCode: languageCode
};

speech.startRecognition(gcsUri, request)
  .then((results) => {
    const operation = results[0];
    return operation.promise();
  })
  .then((results) => {
    const transcription = results[0];
    console.log(`Transcription: ${transcription}`);
  })
  .catch((err) => {
    console.error('ERROR:', err);
  });

请注意,此代码不是使用speech.recognize,而是使用speech.startRecognize(如果它们存储在 Google Cloud Storage 中,您可以使用大文件)。

要查看它是否有效,请尝试:

node recognize.js async-gcs gs://gcs-test-data/vr.flac -e FLAC -r 16000`

如图所示in the Github project

【讨论】:

  • 是的,我知道这段代码工作正常。不幸的是,这对我没有帮助,只是因为我需要转录的文件太长并且操作超时。这就是我需要使用“操作”方法的原因——我打印操作名称并尝试每隔几分钟获取一次结果。但是当操作完成时,结果显示不正确。
  • 使用异步方法的音频转录限制为 60 分钟,您的音频是否超过 60 分钟?如果您达到了限制,您可能会将不正确的转录设置传递给 API。例如,如果您有 44.1 khz 音频并且告诉 API 它是 16khz,那么 API 会将波形解释为实际长度的 3 倍。
  • 不,不超过 60 分钟,而且我没有收到表明时间过长的回复。操作只是在 node.js 进程中超时,我得到一个超时异常。
  • 您可以存储操作名称,您可以稍后查询它,而不是让服务器等待转录完成。不幸的是,这个用于获取后者操作结果的 api 在 node js 客户端中不存在。您可以通过此链接cloud.google.com/speech/reference/rest/v1/operations/get 找到如何使用 REST api 获取操作结果
猜你喜欢
  • 1970-01-01
  • 2013-01-19
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 2016-03-31
  • 1970-01-01
  • 2017-03-15
相关资源
最近更新 更多