如何将 websocket 二进制消息作为流发送到 Google Speech API?

Posted

技术标签:

【中文标题】如何将 websocket 二进制消息作为流发送到 Google Speech API?【英文标题】:How to send websocket binary messages as stream to Google Speech API? 【发布时间】:2017-03-09 20:11:19 【问题描述】:

我正在尝试将 websocket 连接的音频流发送到 Google Speech API。 websocket 以 20ms 的增量发送二进制消息。它以增量方式发送它使我相信我将不得不以某种方式临时读取数据并将其写入本地文件以避免终止与 Google 的连接。然而,这并不理想。

有没有办法将 websocket 流直接通过管道传输到recognizeStream

Google streamingRecognize 文档中的示例:

const request = 
   config: 
      encoding: encoding,
      sampleRate: sampleRate
   
;

const recognizeStream = speech.createRecognizeStream(request)
  .on('error', console.error)
  .on('data', (data) => process.stdout.write(data.results));

record.start(
  sampleRate: sampleRate,
  threshold: 0
).pipe(recognizeStream);

Websocket 连接:

var HttpDispatcher = require('httpdispatcher');
var dispatcher     = new HttpDispatcher();
var WebSocketServer = require('websocket').server;


var server = http.createServer(handleRequest);

var wsServer = new WebSocketServer(
    httpServer: server,
    autoAcceptConnections: true,

);

function handleRequest(request, response)
    try 
        //log the request on console
        console.log(request.url);
        //Dispatch
        dispatcher.dispatch(request, response);
     catch(err) 
        console.log(err);
    



wsServer.on('connect', function(connection) 
    console.log((new Date()) + ' Connection accepted' + ' - Protocol Version ' + connection.webSocketVersion);
    connection.on('message', function(message) 
        if (message.type === 'utf8') 
            console.log(message.utf8Data);
        

        else if (message.type === 'binary') 

          //Send to Google Speech API by passing into recognizeStream

        
    );

    connection.on('close', function(reasonCode, description) 
        console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
    );


);

【问题讨论】:

【参考方案1】:

这其实很简单。如此简单,以至于我因为没有看到它而感到有点不好意思。根据代码在 OP 中的确切编写方式,这完美地工作:

else if (message.type === 'binary') 

  //Send to Google Speech API by passing into recognizeStream
  recognizeStream.write(message.binaryData)


【讨论】:

【参考方案2】:

最好的解决方案是使用专门的流解决方案而不是自己做,这将处理所有缓冲区并为您提供适合 Google Speech API 的稳定流。尝试使用类似的东西,

https://www.npmjs.com/package/websocket-stream

【讨论】:

以上是关于如何将 websocket 二进制消息作为流发送到 Google Speech API?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过Websocket将arraybuffer作为二进制发送?

Python 和 websockets - 发送音频流

如何使用java服务器将消息发送到特定的websocket连接

如何将 Flutter 中的消息发送到通道 websocket?

如果资源服务器应该是无状态的,如何使用 websocket 将消息发送到队列

WebSocket 是如何压缩消息的?