Использование Google Cloud Speech to Text в облачных функциях Firebase - PullRequest
0 голосов
/ 13 марта 2019

Google Cloud Speech to Text Документация диктует, что вы можете получить к нему доступ:

const client = new speech.SpeechClient();

const [operation] = await client.longRunningRecognize({
  config: {
    encoding: 'LINEAR16',
    sampleRateHertz: 16000,
    languageCode: 'en-US'
  },
  audio: {
    uri: `gs://${bucket}/${name}`
  }
});

const [response] = await operation.promise();

response.results.forEach(result => {
  console.log(`Transcription: ${result.alternatives[0].transcript}`);
});

Теперь я хочу запустить этот код в облачной функции Firebase. К сожалению, облачные функции работают на версии Node, которая еще не поддерживает функции async и await.

Некоторые вещи, которые я пробовал:

  1. Попытка TypeScript, который поддерживает async и await: столкнулся с кучей проблем с некоторыми другими API, которые я использую.
  2. Обновление всех моих функций до Node 8 (бета-версия), который поддерживает async и await: опять-таки, со стороны Firebase возникло немало ошибок со стороны Firebase.
  3. «Перевод» кода вручную (это даже вещь?): Я пытался обработать код, чтобы ожидать обещание.

Это тоже не сработало, вот как это выглядит:

exports.onStorageObjectFinalize = functions.storage.object()
  .onFinalize((object) => {
  const client = new speech.SpeechClient();

  return client.longRunningRecognize({
    config: {
      encoding: 'LINEAR16',
      sampleRateHertz: 16000,
      languageCode: 'en-US'
    },
    audio: {
      uri: `gs://${object.bucket}/${object.name}`
    }
  })
  .then(r1 => {
    const [operations] = r1;

    return operations.promise();
  })
  .then(r2 => {
    const [response] = r2;

    // response.results...

    return true;
  });
});

Редактировать: Когда запускается вышеуказанная функция, она говорит, что operations.promise() нет. Фактически, после просмотра всего объекта operations структура не выглядит как ее функция. Я обнаружил, что в operations._callOptions есть свойство promise, поэтому попытался вернуть operations._callOptions.promise(), но получил странную ошибку: TypeError: #<CallSettings> is not a promise at client.longRunningRecognize.then.r1.

Я испортил код перевода или это не сработает? Любые другие вещи, которые я могу попробовать, или TypeScript и Node 8 мои единственные два варианта здесь?

Спасибо, высоко ценится.

...