Я записываю короткие аудиофайлы (несколько секунд) в Chrome, используя mediaDevices.getUserMedia()
, сохраняю файл в Firebase Storage, а затем пытаюсь отправить файлы в Google Cloud Speech-to-Text из Firebase Cloud Функция. Я получаю сообщение об ошибке:
INVALID_ARGUMENT: Invalid recognition 'config': bad encoding.
Документация Google говорит, что это сообщение об ошибке означает
Ваши аудиоданные могут быть закодированы неправильно или кодируется кодом c, отличным от того, который вы объявили в RecognitionConfig. Проверьте аудиовход и убедитесь, что вы правильно установили поле кодирования.
В браузере я настроил микрофон:
navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then(stream => {
var options = {
audioBitsPerSecond : 128000,
mimeType : 'audio/webm;codecs=opus'
};
const mediaRecorder = new MediaRecorder(stream, options);
mediaRecorder.start();
...
Согласно это ответ Chrome поддерживает только два кодека:
audio/webm
audio/webm;codecs=opus
На самом деле это один формат мультимедиа и один код c. В этом посте также говорится, что Chrome поддерживает только код Opus c.
Я настроил свою функцию Firebase Cloud:
// 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 = 128000;
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) // square brackets in ES6 construct an array
.then(function(response) {
console.log(response);
...
Кодирование звука соответствие между браузером и запросом Google Speech-to-Text. Почему Google Speech сообщает мне, что кодировка звука плохая?
Я также попытался использовать параметры браузера по умолчанию, с тем же сообщением об ошибке:
navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then(stream => {
const mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start();
В облачной функции Firebase Я попытался пропустить строку const encoding = 'Opus';
, что привело к ошибке encoding is not defined
. Я попробовал эту строку const encoding = '';
, которая привела к ошибке INVALID_ARGUMENT: Invalid recognition 'config': bad encoding..
.
Я получаю аналогичное сообщение об ошибке от IBM Watson Speech-to-Text. Файл воспроизводится без проблем.