Проверьте работу Google Speech API из Google Cloud Function - PullRequest
0 голосов
/ 10 мая 2018

Я использую Google Speech API для расшифровки длинных файлов. API вызывается из Google Cloud Functions. Я хочу проверить результат longRunningRecognize позже с operations.get . Я знаю name/id операции, но не могу найти хороший способ проверить состояние операции из Google Cloud Function по имени операции.

Конечно, я могу просто сделать GET HTTP-запрос на этот URL:

https://speech.googleapis.com/v1/operations/{name}?key=API_KEY 

Это пример кода, который работает:

const functions = require('firebase-functions');
const speech = require('@google-cloud/speech');
const request = require('request');

exports.transcribe = functions.storage.object().onFinalize((object) => {
  // some code to get data required for speech API
  const payload = {
    audio: {
      uri: 'some_uri/to/google/storage/file'
    },
    config: {
      encoding: 'FLAC',
      languageCode: 'en-US'
    }
  };

  const client = new speech.SpeechClient({
    projectId: 'my-project-id'
  });

  client.longRunningRecognize(payload)
    .then(responses => {
      const operation = responses[0];
      // current example of getting operation status by operation name with HTTP call
      request(`https://speech.googleapis.com/v1/operations/${operation.latestResponse.name}?key=MY-API-KEY`, (error, response, body) => {
        console.log('Operation status response: ', body);
      });
    });
});

Но, похоже, должен быть более ясный способ сделать это. По крайней мере Я могу найти этот рубиновый способ получения статуса операции и это описание OperationsClient , так что я хочу что-то вроде этого для проверки статуса:

// this line is the most confusing part of the puzzle
const client = longrunning.operationsClient();
const name = '';
client.getOperation({name: name}).then(function(responses) {
  var response = responses[0];
  // doThingsWith(response)
});

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 22 июня 2018

Я подозреваю, что вы пошли дальше, но я отвечу ради других.

Когда вы запускаете метод longRunningRecognize, SDK начинает опрос longrunning operations.get.Вам просто нужно настроить прослушиватель событий узла, используя .on.

Объект Operation (первый элемент массива обещания, возвращаемый из longRunningRecognize) генерирует события узла в progress, complete и error.

Обновление кода OP:

client.longRunningRecognize(payload)
  .then(responses => {
    const operation = responses[0];
    operation.on('progress', (metadata, apiResponse) => {
      console.log(JSON.stringify(metadata))
    });
  });

Пример вывода: (аналогично https://speech.googleapis.com/v1/operations/...)

{"startTime":{"seconds":"1529629181","nanos":790333000},"lastUpdateTime":{"seconds":"1529629182","nanos":661910000}}
{"progressPercent":26,"startTime":{"seconds":"1529629181","nanos":790333000},"lastUpdateTime":{"seconds":"1529629245","nanos":48465000}}
{"progressPercent":52,"startTime":{"seconds":"1529629181","nanos":790333000},"lastUpdateTime":{"seconds":"1529629307","nanos":516891000}}
{"progressPercent":78,"startTime":{"seconds":"1529629181","nanos":790333000},"lastUpdateTime":{"seconds":"1529629369","nanos":680341000}}

Обратите внимание, что очевидного пути нетчтобы получить частично расшифрованный текст с асинхронной операцией, только процент статуса.

...