从React.js到Flask的流式音频

从React.js到Flask的流式音频,flask,websocket,stream,flask-socketio,socket.io-stream,Flask,Websocket,Stream,Flask Socketio,Socket.io Stream,我的目标是创建一个网站,可以将音频数据从麦克风传输到后端进行处理和实时响应(例如,实时转录)。目前,我的项目有一个React.js前端和一个Flask后端(我所有的预处理都是用python进行的),我在这里找到了这个关于这个特定任务的很棒的教程: 现在,我已经完成了前端代码的复制。此任务的相关代码为: const socketio = io('http://localhost:5000'); ##Some other code ## navigator.getUserMedia({ aud

我的目标是创建一个网站,可以将音频数据从麦克风传输到后端进行处理和实时响应(例如,实时转录)。目前,我的项目有一个React.js前端和一个Flask后端(我所有的预处理都是用python进行的),我在这里找到了这个关于这个特定任务的很棒的教程:

现在,我已经完成了前端代码的复制。此任务的相关代码为:

const socketio = io('http://localhost:5000');
##Some other code ##
navigator.getUserMedia({
  audio: true
}, function (stream) {

  //5)
  recordAudio = RecordRTC(stream, {
    type: 'audio',

    //6)
    mimeType: 'audio/webm',
    sampleRate: 44100,
    // used by StereoAudioRecorder
    // the range 22050 to 96000.
    // let us force 16khz recording:
    desiredSampRate: 16000,

    // MediaStreamRecorder, StereoAudioRecorder, WebAssemblyRecorder
    // CanvasRecorder, GifRecorder, WhammyRecorder
    recorderType: StereoAudioRecorder,
    // Dialogflow / STT requires mono audio
    numberOfAudioChannels: 1,

    timeSlice: 100,

    ondataavailable: function (blob) {

      // 3
      // making use of socket.io-stream for bi-directional
      // streaming, create a stream
      var stream = ss.createStream();
      // stream directly to server
      // it will be temp. stored locally
      ss(socket).emit('stream', stream, {
        name: 'stream.wav',
        size: blob.size
      });
      // pipe the audio blob to the read stream
      ss.createBlobReadStream(blob).pipe(stream);

      console.log("Sent some data hopefully")
    }
  });
现在,我的Flask后端能够从前端获得连接,但它从未看到来自音频数据流的任何发射。基本上,我的目标是从本教程的下一部分复制本教程:

它创建一个Express服务器并执行一些NLP任务。我的目标是在Flask后端通过google cloud speech将流运行到文本,并将转录结果实时发送到React前端。我看了一下,Google在这里有一个Node.js和Python的教程:

python代码使用MicrophoneStream,使用pyAudio作为流/生成器,并将其传递到google云客户端

with MicrophoneStream(RATE, CHUNK) as stream:
    audio_generator = stream.generator()
    requests = (
        speech.StreamingRecognizeRequest(audio_content=content)
        for content in audio_generator
    )

    responses = client.streaming_recognize(streaming_config, requests)

    # Now, put the transcription responses to use.
    listen_print_loop(responses)

我的问题是如何让Flask从前端接受BlobReadStream数据并创建python生成器,以便将数据输入到google cloud?我考虑过的一件事是使用async或线程生成一个blob队列,就像google cloud教程中那样,而另一个线程通过google cloud异步运行它们。

我认为这应该是可能的。你试过了吗?除了是否可能之外,您似乎对此没有任何疑问?我的问题在底部:如何让Flask接受来自前端的流数据。当我尝试这个过程时,我的后端从未从前端获取任何流数据。我正在尝试一种不同的方法,在没有流的情况下,我只是按顺序发出所有数据包(效率低得多,速度慢得多),但目前这是一项正在进行的工作。如果Flask能够像Node.js一样接受本机socket.io-stream,那就太好了。我的问题是Flask是否能做到。Socket.IO协议不提供任何流媒体。您的节点解决方案使用在Socket.IO之上运行的第三方扩展,并实现节点流API。这不能比通过标准发射发送音频块快,因为这正是流媒体扩展所做的。流API是一个节点,我不确定在Python中使用它是否有意义。因此,这听起来像是一个合理的解决方案:一个发射,只发射dataavailable上的BLOB(每100毫秒一次)。在烧瓶端,有一个队列,接收blob并将它们放入队列中,就像googleapi一样。如果这听起来合理,作为后续问题,我是否需要执行多线程处理,以便在主线程处理前端的发射时,我们实例化一个运行GoogleAPI的线程?这是必要的,还是google api可以运行,flask可以填充队列?这听起来很合理,但我不知道足够的细节来告诉你这是否可行。例如,如果您使用的是eventlet或gevent,那么在调用Google API时可能会遇到问题。