使用来自 Electron 的 gRPC 实时转录 Google Cloud Speech API

Posted

技术标签:

【中文标题】使用来自 Electron 的 gRPC 实时转录 Google Cloud Speech API【英文标题】:Real-time transcription Google Cloud Speech API with gRPC from Electron 【发布时间】:2018-04-13 22:58:30 【问题描述】:

我想要实现的是与 Web Speech API 相同的实时转录过程,但使用的是 Google Cloud Speech API。

主要目标是使用 gRPC 协议通过带有 Speech API 的 Electron 应用转录现场录音。

这是我实现的简化版本:

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 的错误响应是音频流太慢,我们没有实时发送。

感觉是因为我传递的流没有任何格式化或对象初始化,所以无法进行流识别。

【问题讨论】:

你有没有设法用电子来解决这个问题?我有同样的任务。 我也在寻找 Electron 中的实时转录。我没有回答您如何在 Electron 中使用 Google Cloud Speech 的具体问题,但我想我会提到一个替代方案:为“otter.ai”创建一个 iframe(每月免费 600 分钟的转录服务) ,让用户登录(使用 open-auth 登录,因此速度非常快),然后将自定义代码插入 iframe(webview 预加载),让您在需要时启动转录并检索其中转录的文本。不寻常的方法,但 Otter 的转录非常好,每个用户每月 600 分钟的免费时间也不错。 【参考方案1】:

Github 上的这个官方示例项目似乎符合您的要求:https://github.com/googleapis/nodejs-speech/blob/master/samples/infiniteStreaming.js

此应用程序演示了如何通过 Google Cloud Speech API 使用 streamingRecognize 操作来执行无限流式传输。

另请参阅my comment,了解 Electron 中的替代方案,使用 OtterAI 的转录服务。 (这是我即将尝试的方法)

【讨论】:

【参考方案2】:

您可以使用node-record-lpcm16 模块录制音频并直接通过管道传输到 Google 等语音识别系统。

在存储库中,有一个使用 wit.ai 的example。

对于谷歌语音识别,你可以使用类似的东西:

'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)

【讨论】:

以上是关于使用来自 Electron 的 gRPC 实时转录 Google Cloud Speech API的主要内容,如果未能解决你的问题,请参考以下文章

在 Electron 中使用 gRPC

electron(electron-vue)环境下配置gRPC

gRPC - Firestore 如何实现服务器-> 客户端实时流式传输

使用Watson SDK进行连续语音到文本

使用gRPC的stream向客户端实时传送信息的坑

GRPC在网页前端的使用