Я пытаюсь отправить небольшой аудиофайл (несколько секунд) из 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
и ничего больше:
Там нет сообщения об ошибке. Я не вижу ничего плохого в файле в хранилище:
Я пробовал другой файл, на этот раз 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 это выяснит?
Есть предложения? что может быть не так?