electron 实时转录谷歌云语音API与gRPC从电子

wko9yo5t  于 2023-02-01  发布在  Electron
关注(0)|答案(2)|浏览(269)

我想要实现的是与Web Speech API相同的实时转录过程,但使用的是Google Cloud Speech API。
主要目标是使用gRPC协议通过带有Speech API的电子应用程序转录现场录音。
这是我实现的一个简化版本:

const { desktopCapturer } = window.require('electron');
const speech = require('@google-cloud/speech');

const client = speech.v1({
  projectId: 'my_project_id',
  credentials: {
    client_email: 'my_client_email',
    private_key: 'my_private_key',
  },
});

desktopCapturer.getSources({ types: ['window', 'screen'] }, (error, sources) => {
  navigator.mediaDevices
    .getUserMedia({
      audio: true,
    })
    .then((stream) => {
      let fileReader = new FileReader();
      let arrayBuffer;
      fileReader.onloadend = () => {
        arrayBuffer = fileReader.result;
        let speechStreaming = client
          .streamingRecognize({
            config: {
              encoding: speech.v1.types.RecognitionConfig.AudioEncoding.LINEAR16,
              languageCode: 'en-US',
              sampleRateHertz: 44100,
            },
            singleUtterance: true,
          })
          .on('data', (response) => response);

        speechStreaming.write(arrayBuffer);
      };

      fileReader.readAsArrayBuffer(stream);
    });
});

来自Speech API的错误响应是音频流太慢,我们没有实时发送它。
我觉得原因是我传递的流没有任何格式化或对象初始化,所以无法执行流识别。

iqjalb3h

iqjalb3h1#

Github上的这个官方样例项目似乎符合您的要求:https://github.com/googleapis/nodejs-speech/blob/master/samples/infiniteStreaming.js
此应用程序演示了如何使用streamingRecognize操作和Google Cloud Speech API执行无限流传输。
也可以参考我对Electron中的另一种方法的评论,使用OtterAI的转录服务(这是我很快就要尝试的方法)

zysjyyx4

zysjyyx42#

您可以使用node-record-lpcm16模块录制音频并直接传输到Google等语音识别系统。
在存储库中,有一个使用wit.ai的example
对于Google语音识别,您可以使用类似于以下内容的代码:

'use strict'
const { SpeechClient } = require('@google-cloud/speech')
const recorder = require('node-record-lpcm16')

const RECORD_CONFIG = {
  sampleRate: 44100,
  recorder: 'arecord'
}

const RECOGNITION_CONFIG = {
  config: {
    sampleRateHertz: 44100,
    language: 'en-US',
    encoding: 'LINEAR16'
  },
  interimResults: true
}

const client = new SpeechClient(/* YOUR CREDENTIALS */)

const recognize = () => {
  client
    .streamingRecognize(RECOGNITION_CONFIG)
    .on('error', err => {
      console.error('Error during recognition: ', err)
    })
    .once('writing', data => {
      console.log('Recognition started!')
    }
    .on('data', data => {
      console.log('Received recognition data: ', data)
    }
}

const recording = recorder.record(RECORD_CONFIG)
recording
  .stream()
  .on('error', err => {
     console.error('Error during recognition: ', err)
  .pipe(recognize)

相关问题