Google 云语音 API 不是从 base64 音频转录

Google cloud speech API not transcription from base64 audio

我正在尝试使用 Google 云语音 API,方法是在我的 Angular 前端录制音频,将其转换为 base64,然后将其发送到我的节点后端,这确实google 语音 API.

的查询

到目前为止我还没有成功,google 只给我发送了空结果。

您会看到,为了找出问题所在,我正在遍历所有可能的采样率和音频格式。

另一件需要注意的事情是,使用 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);
};

还有我的 Node 后端

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 =>  []

感谢任何对此有想法的人。

由于 Google 示例中的 audio.raw 有效,问题很可能与您使用的音频有关。 Speech API 对其接受的音频有点挑剔。 (仅以单声道为例,参见 this article). The problem you're seeing is described in the troubleshooting section 的演讲 API,其中说明了为什么您会得到空响应。

我在这里测试了 mozdevs MediaRecorder 示例,以创建一个音频文件并将其传递给语音 API,API 似乎真的不喜欢MediaRecorder 创建的格式。

您必须将音频转换为 FLAC 或 LINEAR16 之类的格式才能让语音 API 对其进行解释。进行一些挖掘后,我发现了 this github example,并将由此产生的音频传递给语音 API 我从 API.

得到了正确的文字记录