私はWebSocket接続のオーディオストリームをGoogle Speech APIに送信しようとしています。 websocketはバイナリメッセージを20ms刻みで送信します。これを増分で送信すると、Googleとの接続が途絶えることを避けるため、データを一時的にローカルファイルに読み書きする必要があると私は信じています。しかし、これは理想的ではありません。websocketバイナリメッセージをストリームとしてGoogle Speech APIに送信するにはどうすればよいですか?
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.');
});
});