Ошибка Google Cloud Speech 500 (внутренняя ошибка сервера)

У меня есть простой код JS, работающий в xampp apache.

var rawFile;
var allText;
var byteArray = [];

rawFile = new XMLHttpRequest();
rawFile.open("GET", "brooklyn.flac", false);
rawFile.onreadystatechange = function ()
{
    if(rawFile.readyState === 4)
    {
        if(rawFile.status === 200 || rawFile.status == 0)
        {
          allText = rawFile.responseText;
            //alert(allText);

        }
    }
     if (rawFile.status != 200) return byteArray;
        for (var i = 0; i < rawFile.responseText.length; ++i) {
        byteArray.push(rawFile.responseText.charCodeAt(i) & 0xff)
        }
     }

rawFile.send(null);

function send(){
var oAjaxReq = new XMLHttpRequest();

var payload = {
  config:{
    encoding: "FLAC",
    sampleRateHertz: 16000,
    languageCode:"en-US"
  },
  audio: {
    content: rawFile
  }
};

oAjaxReq.open("post", "https://speech.googleapis.com/v1/speech:recognize?key=???", true);
oAjaxReq.setRequestHeader("Content-Type", "application/json");

//object ot json
const jsonPayload = JSON.stringify(payload);

//Length of the jsonPayload
const payLoadLength= jsonPayload.length;
oAjaxReq.setRequestHeader("Content-Length", payLoadLength);
oAjaxReq.withCredentials = true;

 //Send Json to Google Cloud Speech Service
 oAjaxReq.send(jsonPayload);
 }

Я пытаюсь использовать Google Cloud Speech API. Я загружаю локальный аудиофайл с именем "brooklyn.flac", который я загрузил с "https://storage.googleapis.com/cloud-samples-tests/speech/brooklyn.flac "через xmlHTTPRequest.

Однако я всегда получаю следующую ошибку:

{
  "error": {
    "code": 500,
    "message": "Internal error encountered.",
    "status": "INTERNAL"
  }
}

Когда я меняю звуковую часть объекта payLoad с content: rawFile на uri: gs: //cloud-samples-tests/speech/brooklyn.flac, он работает правильно.

Ошибка из-за "rawFile"? Если да, как мне правильно загрузить этот локальный файл, чтобы отправить его в облачную службу?


person Turpal    schedule 11.07.2017    source источник
comment
Чтобы этот код работал. Вместо загрузки локального файла с помощью xmlHTTPRequest я использовал FileReader. После этого я мог закодировать содержимое файла с помощью btoa (); и отправьте в гугл без ошибок. Если кому-то нужен исходный код, просто свяжитесь со мной.   -  person Turpal    schedule 12.07.2017


Ответы (1)


TL; DR. Мне нравится остальная полезная нагрузка, за исключением вашего аудиоконтента. Скорее всего, вы не кодируете звук с помощью base64 (поскольку вы ничего об этом не упомянули) и, следовательно, получаете ошибку сервера. Передача версии аудиоконтента в кодировке base64 устранит проблему.

Типы и источники API для аудиоконтента

Есть 2 основных способа использования Cloud Speech API:

Оба они поддерживают аудиоконтент из одного из следующих источников:

  • Облачное хранилище Google
  • необработанный файл, который вы отправляете непосредственно в запросе.

Использование Google Cloud Storage - самый простой из двух подходов IMO. Вы загружаете файл в GCS и передаете URI файла (например, gs://cloud-samples-tests/speech/brooklyn.flac).

Кодирование аудиоконтента

Если вы отправляете необработанный файл как часть запроса, в зависимости от API, который вы используете, вам нужно будет соответствующим образом обработать контент:

  • API REST на основе JSON требует, чтобы аудиоконтент был base64 закодирован. По ссылке также есть примеры того, как выполнить кодировку base64 в Python, Node.js и Java.

  • API на основе gRPC поддерживает загрузку двоичных файлов, поэтому вы можете передавать необработанный файл как есть без дополнительной обработки.

Клиентская библиотека Google Cloud

Я не уверен, можно ли использовать Node.js, но если да, то вы можете использовать Google Облачная клиентская библиотека (которая поддерживает распознавание речи в альфа-версии только на момент написания). Эта библиотека может автоматически base64 кодировать файл за вас, а также предлагает другие удобные функции.

person Tuxdude    schedule 12.07.2017
comment
Спасибо за ответ Tuxdude! Теперь я понимаю, как все это работает, и чем вызвана эта ошибка. Я попробую оба способа. - person Turpal; 12.07.2017
comment
Это действительно сработало! Спасибо, Tuxdude, преобразованный в base64 rawFile творил чудо! - person Turpal; 12.07.2017