Google Speech API — сервер недоступен для длинных аудиофайлов

Я использую пакет Google nodejs-speech для использования longRunningRecognize конечной точки/функции в Google Speech API. .

Я использовал как v1, так и v1p1beta и столкнулся с ошибкой с более длинными файлами. (48 минут - это столько, сколько я пробовал, и 15 минут вызывают ту же проблему, а 3 минуты - нет). Я пробовал и шаблон обещания, и разделение запроса на две части: одну для запуска процесса 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 минуты, тот же формат и кодировка), и оба вышеуказанных процесса работали.

Есть идеи, что происходит?


person Sasha    schedule 16.08.2018    source источник
comment
Ошибки такого рода могут возникать, если в начале аудио есть длительные периоды тишины. Будет ли это относиться к вашим аудиофайлам? В таких случаях иногда полезно изменить кодировку ваших файлов на FLAC.   -  person Héctor Neri    schedule 16.08.2018
comment
У большинства из них нет долгого молчания, но я могу попробовать Flac и отчитаться.   -  person Sasha    schedule 16.08.2018
comment
Флак сработал! Спасибо! И странно. Почувствуйте, что ошибки могли бы быть намного яснее здесь.   -  person Sasha    schedule 17.08.2018


Ответы (1)


Возможный обходной путь – изменение аудиоформата на FLAC, который является рекомендуемым типом кодирования для API Cloud Speech-to-text из-за его сжатия без потерь.

Для справки, это можно сделать с помощью 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
person Héctor Neri    schedule 16.08.2018