Как отправить аудиофайл в Google Speech-to-Text из Firebase Storage? - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь отправить небольшой аудиофайл (несколько секунд) из Firebase Storage в Google Cloud Speech-to-Text, используя функции Firebase Cloud. документация говорит, что использовать этот синхронный код для небольших аудиофайлов:

// Imports the Google Cloud client library
const speech = require('@google-cloud/speech');

// Creates a client
const client = new speech.SpeechClient();

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const gcsUri = 'gs://my-bucket/audio.raw';
// const encoding = 'Encoding of the audio file, e.g. LINEAR16';
// const sampleRateHertz = 16000;
// const languageCode = 'BCP-47 language code, e.g. en-US';

const config = {
  encoding: encoding,
  sampleRateHertz: sampleRateHertz,
  languageCode: languageCode,
};
const audio = {
  uri: gcsUri,
};

const request = {
  config: config,
  audio: audio,
};

// Detects speech in the audio file
const [response] = await client.recognize(request);
const transcription = response.results
  .map(result => result.alternatives[0].transcript)
  .join('\n');
console.log(`Transcription: `, transcription);

Этот код не запускается, потому что он имеет await без async.

Другая проблема с этим кодом заключается в том, что он не перехватывает ошибки. Исправляя эти проблемы и добавляя триггер Firebase Cloud Functions, у меня есть такой код:

exports.Google_Speech_to_Text = functions.firestore.document('Users/{userID}/Pronunciation_Test/downloadURL').onUpdate((change, context) => {
    return async function syncRecognizeGCS() {
      // [START speech_transcribe_sync_gcs]
      // Imports the Google Cloud client library
      const speech = require('@google-cloud/speech');

      // Creates a client
      const client = new speech.SpeechClient();

      const gcsUri = 'gs://my-app.appspot.com/my-file';
      const encoding = 'Opus';
      const sampleRateHertz = 48000;
      const languageCode = 'en-US';

      const config = {
        encoding: encoding,
        sampleRateHertz: sampleRateHertz,
        languageCode: languageCode,
      };
      const audio = {
        uri: gcsUri,
      };

      const request = {
        config: config,
        audio: audio,
      };

      // Detects speech in the audio file
      const [response] = await client.recognize(request)
      .catch((err) => { console.error(err); });

      const transcription = response.results
      .map(result => result.alternatives[0].transcript)
      .join('\n');
      console.log(`Transcription: `, transcription);
      // [END speech_transcribe_sync_gcs]
    }

  }); // close Google_Speech_to_Text

Функция выполняется, возвращает ok и ничего больше: enter image description here

Там нет сообщения об ошибке. Я не вижу ничего плохого в файле в хранилище:

enter image description here

Я пробовал другой файл, на этот раз mp3. Тот же результат, за исключением того, что функция выполнялась за 17 мс, потому что файл был меньше.

У меня были проблемы с вычислением кодирования звука и частоты дискретизации Герц, которые mediaDevices.getUserMedia() использует в Chrome. В этом сообщении в блоге говорится, что кодировка звука Opus и частота дискретизации 48000. Иногда я получаю сообщение об ошибке INVALID_ARGUMENT: Invalid recognition 'config': bad encoding.. В документации написано Your audio data might not be encoded correctly or is encoded with a codec different than what you've declared in the RecognitionConfig. Можно ли оставить encoding и sampleRateHertz пустыми, и Google Speech-to-Text это выяснит?

Есть предложения? что может быть не так?

1 Ответ

0 голосов
/ 18 марта 2020

Проблема заключалась в том, что код, предоставленный Google, не улавливает ошибки. Когда я реорганизовал код для использования обещания вместо await, я получил сообщение об ошибке.

exports.Google_Speech_to_Text = functions.firestore.document('Users/{userID}/Pronunciation_Test/downloadURL').onUpdate((change, context) => {
        // Imports the Google Cloud client library
        const speech = require('@google-cloud/speech');

        // Creates a client
        const client = new speech.SpeechClient();

        const gcsUri = 'gs://my-app.appspot.com/my-file';
        const encoding = 'Opus';
        const sampleRateHertz = 48000;
        const languageCode = 'en-US';

        const config = {
          encoding: encoding,
          sampleRateHertz: sampleRateHertz,
          languageCode: languageCode,
        };
        const audio = {
          uri: gcsUri,
        };

        const request = {
          config: config,
          audio: audio,
        };

        // Detects speech in the audio file
        return response = client.recognize(request)
        .then(function(response) {
          console.log(response);    
        })
        .catch((err) => { console.error(err); });
    });

Ошибка была INVALID_ARGUMENT: Invalid recognition 'config': bad encoding.. Другими словами, кодировщик звука не был Opus.

Удаление строки const encoding = 'Opus'; приводит к сообщению об ошибке encoding is not defined.

Использование const encoding = ''; приводит к сообщению об ошибке INVALID_ARGUMENT: Invalid recognition 'config': bad encoding..

Мне нужно выяснить, какой аудиокодер Chrome использует сейчас. Это очень плохо, Google Speech не может понять это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...