Google Speech API-长音频文件的服务器不可用错误

时间:2018-08-16 20:01:56

标签: javascript google-cloud-platform google-speech-api

我正在使用Google的nodejs-speech软件包在Google的Speech API中使用longRunningRecognize端点/功能。

我同时使用了v1v1p1beta,并且文件较长时出错。 (48分钟是我尝试过的时间,而15分钟会导致相同的问题,尽管3分钟不会)。我已经尝试了promise模式,并将请求分为两部分-一个部分启动longRunningRecognize流程,另一部分在等待后检查结果。错误显示在两个代码示例的下方。

请求的承诺版本示例:

import speech from '@google-cloud/speech';

const client = new speech.v1p1beta1.SpeechClient();

const audio = {
  uri: 'gs://my-bucket/file.m4a'
};

const config = {
  encoding: 'AMR_WB',
  sampleRateHertz: 16000,
  languageCode: 'en-US',
  enableWordTimeOffsets: true,
  enableSpeakerDiarization: true
};

const request = {
  audio,
  config
};

client.longRunningRecognize(request)
  .then(data => {
    const operation = data[0];
    return operation.promise();
  })
  .then(data => {
    const response = data[0];
    const results = response.results;
    const transcription = results
      .filter(result => result.alternatives)
      .map(result => result.alternatives[0].transcript)
      .join('\n');
    console.log(transcription);
  })
  .catch(error => {
    console.error(error);
  });

(此后我用结果关闭了选项卡,但是我认为这返回了一个错误对象,该错误对象只说了{ error: { code: 13 } },与下面的更具描述性的错误相匹配)。

我分别尝试了一个版本,在该版本中,我没有从链式承诺中获得最终的转录结果,而是从操作中收集了name,并提出了单独的请求以获取结果。

这是请求代码:

... // Skipping setup
client.longRunningRecognize(request)
  .then(data => {
    const operation = data[0];
    console.log(operation.latestResponse.name);
  })
  .catch(error => {
    console.error(error);
  });

当我有时间处理相关端点(https://speech.googleapis.com/v1p1beta1/operations/81703347042341321989?key=ABCD12345)时,会得到以下提示:

{
    "name": "81703347042341321989",
    "metadata": {
        "@type": "type.googleapis.com/google.cloud.speech.v1p1beta1.LongRunningRecognizeMetadata",
        "startTime": "2018-08-16T19:33:26.166942Z",
        "lastUpdateTime": "2018-08-16T19:41:31.456861Z"
    }
}

但是,一旦它被完全处理,我就会遇到这个问题:

{
    "name": "81703347042341321989",
    "metadata": {
        "@type": "type.googleapis.com/google.cloud.speech.v1p1beta1.LongRunningRecognizeMetadata",
        "progressPercent": 100,
        "startTime": "2018-08-16T17:20:28.772208Z",
        "lastUpdateTime": "2018-08-16T17:44:40.868144Z"
    },
    "done": true,
    "error": {
        "code": 13,
        "message": "Server unavailable, please try again later."
    }
}

我尝试使用较短的音频文件(3分钟,相同的格式和编码),并且上述过程均有效。

知道发生了什么吗?

1 个答案:

答案 0 :(得分:2)

可能的解决方法是将音频格式更改为FLAC,这是Cloud Speech-to-Text API的推荐编码类型,因为其无损压缩。

作为参考,可以使用sox通过以下命令完成此操作:

sox file.m4a --rate 16k --bits 16 --channels 1 file.flac

此外,当开始时很长一段时间保持沉默时,也可能会发生此错误。在这种情况下,可以通过在trim之后指定音频在文件开头和结尾应跳过的秒数来修剪音频文件:

sox input.m4a --rate 16k --bits 16 --channels 1 output.flac trim 20 5