API Google Speech, клиент node.js - неправильные результаты при использовании операции

Я использую клиентскую библиотеку 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?

Вот фрагмент кода, демонстрирующий проблему:

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
            });
   });


 }

person MirM    schedule 01.05.2017    source источник
comment
Можете ли вы показать код, в котором делаете запрос?   -  person Maria Ines Parnisari    schedule 01.05.2017
comment
Только что обновил пост, добавил код, который использую   -  person MirM    schedule 03.05.2017


Ответы (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`

Как показано в проекте Github.

person class    schedule 05.05.2017
comment
Да, я знаю, что этот код работает нормально, но, к сожалению, мне это не помогает просто потому, что файл, который мне нужно расшифровать, слишком длинный и время операции истекло. Это причина, по которой мне нужно использовать метод «операции» - я печатаю имя операции и пытаюсь получать результаты каждые несколько минут. Но когда операция завершится, результаты не появятся правильно. - person MirM; 07.05.2017
comment
Аудиотранскрипция с использованием асинхронного метода ограничена 60 минутами, ваша аудиозапись превышает 60 минут? Если вы достигли предела, возможно, вы передаете неверные настройки транскрипции в API. Например, если у вас есть звук с частотой 44,1 кГц и вы сообщаете API, что это 16 кГц, API будет интерпретировать волну как 3x длиннее, чем она есть на самом деле. - person class; 08.05.2017
comment
Нет, это не более 60 минут, и я не получаю ответа, указывающего, что это слишком долго. Операция просто истекает в процессе node.js, я получаю исключение тайм-аута. - person MirM; 10.05.2017
comment
Вы можете сохранить имя операции и запросить его позже, вместо того, чтобы заставлять сервер ждать завершения транскрипции. К сожалению, этот API для получения результата операции отсутствует в клиенте node js. Вы можете узнать, как получить результаты операции с помощью REST api по этой ссылке cloud .google.com / Speech / reference / rest / v1 / operations / get. - person Farmaan Elahi; 15.11.2017