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

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

我使用 Google 的 nodejs-speech 包来使用 Google 语音 API 中的 longRunningRecognize 端点/函数。

我使用了 v1v1p1beta,但在使用较长的文件时遇到了错误。 (48 分钟是我尝试过的最长时间,15 分钟会导致同样的问题,但 3 分钟则不会)。我尝试了 promise 模式并将请求分为两部分——一部分用于启动 longRunningRecognize 进程,另一部分用于在等待后检查结果。错误显示在两者的代码示例下方。

请求的 promise 版本示例:

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 } } ,它与下面的内容匹配,更具描述性错误)。

另外,我尝试了一个版本,其中我不是通过链接 promise 来获取最终转录结果,而是从操作中收集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 分钟,相同的格式和编码),并且上述过程均有效。

知道发生了什么吗?

最佳答案

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

作为引用,这可以使用 sox 来完成,通过以下命令:

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

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

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

关于javascript - Google Speech API - 长音频文件的服务器不可用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51884509/

相关文章:

Android - 语音识别和保存音频文件 - 在某些设备上不工作

javascript - IE、chrome 加载缓慢; FF 和 Opera 都很好

javascript - 如何在 JS 中动态地使网格可分组为 false/true?

javascript - 如何取消选中复选框?

mysql - 我可以将 MySQL 数据导入 Google Spanner 吗?

ssh - 重新连接到Google Cloud Platform终端

apache-spark - 如何获得 Spark 作业以使用 Google Cloud DataProc 集群上的所有可用资源?

java - Google 语音 API 返回 NULL

javascript - 组件不渲染从渲染函数调用的函数

php - 我可以从 php 库中将 Google 的语音转为文本转录为 JSON 的完整结果吗?