NodeJS将Int16Array二进制缓冲区转换为Google Speech API的LINEAR16编码原始流 [英] NodeJS Convert Int16Array binary Buffer to LINEAR16 encoded raw stream for Google Speech API

查看:369
本文介绍了NodeJS将Int16Array二进制缓冲区转换为Google Speech API的LINEAR16编码原始流的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将语音转换为使用AudioContext在浏览器中进行语音录制的节点服务器中的文本。我可以通过binaryType:arraybuffer的WebSocket连接将int16Array缓冲区(记录数据)发送到我的节点服务器。

I'm trying to convert speech to text in node server where speech recording happens in the browser using AudioContext. I'm Able to send int16Array buffer(recorded data) to my node server through a WebSocket connection of binaryType:arraybuffer.

this.processor.onaudioprocess = (e) => {
    // this.processAudio(e)
    for (
        var float32Array = e.inputBuffer.getChannelData(0) || new Float32Array(this.bufferSize),
        len = float32Array.length,
        int16Array = new Int16Array(len);
        len--;)
        int16Array[len] = 32767 * Math.min(1, float32Array[len]);
    this.socket.send(int16Array.buffer);
};

在服务器中,收到的数据为

In server, data is received as

<Buffer 66 6f 6f ...>

现在我想解析或转换为可读流,以便我可以管道Google语音识别流。

Now I would like to parse or convert to a readable stream so that I can pipe to Google speech recognizeStream.

  function processAudioBuffer(int16ArrayBuffer) {
    console.log("Received stream :", int16ArrayBuffer, typeof 
    recognizeStreams[userId]);
    const recognizer = getGoogleSpeechStreamRecognizer();

    if (recognizer) {

    /* HERE I NEED SOMETHING WHICH MAKES MY BUFFER COMPATIBLE WITH GOOGLE SPEECH API */

    // tried with streamifier but no luck
    // streamifier.createReadStream(int16ArrayBuffer).pipe(recognizer);

    // also tried with Record which is used in google-cloud-node-samples to record stream from connected mic device, but no luck
    var file = new Record({
       path: `${userId}.raw`,
       encoding: 'arraybuffer',
       contents: int16ArrayBuffer
    });
    file.pipe(recognizer);

    } else {
         console.log('user stream is not yet created');
    }
 }

识别器抛出以下错误:

Error: write after end
at writeAfterEnd (/Users/demo/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:222:12)
at Writable.write (/Users/demo/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:262:20)
at Duplexify.end (/Users/demo/node_modules/duplexify/index.js:223:18)
at Record.pipe (/Users/demo/node_modules/record/index.js:70:14)
at processAudioBuffer (/Users/demo/app.js:87:10)
at WebSocket.incoming (/Users/demo/app.js:104:7)
at emitTwo (events.js:106:13)
at WebSocket.emit (events.js:191:7)
at Receiver._receiver.onmessage (/Users/demo/node_modules/ws/lib/WebSocket.js:146:54)
at Receiver.dataMessage (/Users/demo/node_modules/ws/lib/Receiver.js:380:14)


推荐答案

解决了!我们可以直接将缓冲区写入从GoogleSpeech创建的RecognizerStream,如下所示:

Solved it !!! We can write the buffer directly to recognizerStream which created from GoogleSpeech as follows:

const recognizer = getGoogleSpeechStreamRecognizer();

recognizer.write(int16ArrayBuffer)

这篇关于NodeJS将Int16Array二进制缓冲区转换为Google Speech API的LINEAR16编码原始流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆