Google Cloud Speech API не транскрипция из аудио base64

Я пытаюсь использовать облачный речевой API Google, записывая аудио в моем Angular FrontEnd, преобразуя его в base64, отправляя его в свой бэкэнд Node, который выполняет запрос к google voice API.

До сих пор у меня ничего не получалось, Google только отправлял мне пустые результаты.

Вы увидите, что для выявления проблемы я перебираю все возможные sampleRate и аудиоформат.

Следует также отметить, что тестирование на примере Google audio.raw (находится здесь https://github.com/googleapis/nodejs-speech/tree/master/samples) работает, и я получаю транскрипцию.

Вот мой интерфейс:

 const onSuccess = stream => {
  var options = {
    audioBitsPerSecond: 16000, // NB: I have tried several bitrates, and several audio formats (here, and in the blob creation)
  //   mimeType: 'audio/ogg; codecs=opus'
  }

  this.mediaRecorder = new MediaRecorder(stream);
  this.mediaRecorder.onstop = e => {

    const audio = new Audio();
    const blob = new Blob(this.chunks, { 'type': 'audio/wav' });

    this.chunks.length = 0;
    audio.src = window.URL.createObjectURL(blob);

    var reader = new FileReader();
    reader.readAsDataURL(blob);
    reader.onloadend = (function () {
      var base64data = reader.result;

      var splited = base64data.substr(base64data.indexOf(',') + 1);

      this.appservice.postAudio(splited).subscribe(res => {
        console.log("MyBuffer: ", res);

      })

    }).bind(this);
    audio.load();
    audio.play();
  };

  this.mediaRecorder.ondataavailable = e => this.chunks.push(e.data);
};

И мой нод бэкэнд

post(req, res) {


    var encoding = ["FLAC", "LINEAR16", "MULAW", "AMR", "AMR_WB", "OGG_OPUS", "SPEEX_WITH_HEADER_BYTE"];
    var sampleRate = ["8000", "12000", "16000", "24000", "44100", "48000"];


    encoding.forEach(elementencoding => {
        sampleRate.forEach(elementrate => {
            const projectId = 'myId';
            const request = {
                "config": {
                    "encoding": elementencoding,
                    "sampleRateHertz": elementrate,
                    "languageCode": "fr-FR"
                },
                "audio": {
                    "content": req.body.base64audio
                }
            };

            const client = new speech.SpeechClient({
                projectId: projectId,
            });
            // Detects speech in the audio file
            client
                .recognize(request)
                .then(data => {
                    console.log("raw data:" + elementencoding + " - " + elementrate + " => ", data[0].results);
                    const response = data[0];
                    const transcription = response.results
                        .map(result => result.alternatives[0].transcript)
                        .join('\n');
                })
                .catch(err => {
                    console.error('ERROR:' + elementencoding + ' - ' + elementrate);
                });
        });
    });
}

И вот выход я получаю

ERROR:OGG_OPUS - 44100
ERROR:OGG_OPUS - 24000
ERROR:AMR_WB - 44100
ERROR:SPEEX_WITH_HEADER_BYTE - 24000
ERROR:OGG_OPUS - 8000
raw data:LINEAR16 - 48000 =>  []
raw data:LINEAR16 - 44100 =>  []
raw data:LINEAR16 - 12000 =>  []
raw data:LINEAR16 - 16000 =>  []
ERROR:SPEEX_WITH_HEADER_BYTE - 48000
ERROR:AMR_WB - 48000
ERROR:AMR - 24000
ERROR:OGG_OPUS - 12000
ERROR:AMR - 44100
ERROR:SPEEX_WITH_HEADER_BYTE - 8000
ERROR:SPEEX_WITH_HEADER_BYTE - 12000
ERROR:AMR_WB - 8000
ERROR:AMR_WB - 24000
ERROR:OGG_OPUS - 48000
raw data:LINEAR16 - 8000 =>  []
raw data:LINEAR16 - 24000 =>  []
raw data:MULAW - 48000 =>  []
ERROR:AMR - 48000
ERROR:AMR - 12000
ERROR:AMR - 16000
raw data:FLAC - 24000 =>  []

Спасибо всем, кто может иметь представление об этом.

1 ответ

Решение

Поскольку audio.raw из примера Google работает, проблема, скорее всего, связана с используемым вами звуком. Speech API немного привередлив с аудио, которое он принимает. (Mono только для примера, см. Эту статью). Проблема, с которой вы сталкиваетесь, описана в разделе устранения неполадок для Speech API, где указано, почему вы можете получить пустой ответ.

Я протестировал примеры MediaRecorder mozdevs, чтобы создать аудиофайл и передать его в Speech API, и кажется, что API действительно не нравится формат, который создает MediaRecorder.

Вам нужно будет преобразовать звук во что-то вроде FLAC или LINEAR16, чтобы Speech API интерпретировал его. Проделав некоторое копание, я нашел этот пример с github и, передав результирующее аудио из него в Speech API, получаю правильную расшифровку обратно из API.

Другие вопросы по тегам