当前位置: 首页 > 知识库问答 >
问题:

NodeJS将Int16Array二进制缓冲区转换为用于Google语音API的LINEAR16编码原始流

段干长恨
2023-03-14

我正在尝试将语音转换为节点服务器中的文本,在该服务器中,语音录制使用AudioContext在浏览器中进行。我能够通过二进制类型为arraybuffer的WebSocket连接将int16Array缓冲区(记录的数据)发送到节点服务器。

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);
};

在服务器中,数据接收为

<Buffer 66 6f 6f ...>

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

  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)

共有1个答案

蓝侯林
2023-03-14

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

const recognizer = getGoogleSpeechStreamRecognizer();

recognizer.write(int16ArrayBuffer)
 类似资料:
  • 本文向大家介绍如何将二进制NodeJS缓冲区转换为JavaScript ArrayBuffer?,包括了如何将二进制NodeJS缓冲区转换为JavaScript ArrayBuffer?的使用技巧和注意事项,需要的朋友参考一下 直接访问 buf.buffer属性,将二进制NodeJS Buffer转换为JavaScript ArrayBuffer。通过原始Buffer实例进行的写操作将写入Arra

  • 我无法重写从二进制缓冲区获取的文件,我已与原始文件进行了检查,所有字节都相同。 这是从NodeJS创建的文件: 这是最初的一个: 你可以比较这两个文件,每个字节都是一样的,我猜NodeJS的编码不是正确的。 这是一段代码 你可以试着在你的节点上运行它,看看结果是错误的。 我能做些什么来修复它?

  • 我有一个JSON对象,我正在将它转换成一个,并在这里进行一些处理。稍后,我想将相同的缓冲区数据转换为有效的JSON对象。 我的工作节点V6.9.1 下面是我尝试过的代码,但当我转换回JSON并且无法打开此对象时,我得到了。 所以我试着用检查的方式打印整个物体 如果我试着像数组一样读取它 我试图解析它也抛出SynTaxError:意外令牌o在JSON在位置2 我需要像我创建的那样将其视为真实对象(我

  • 在Python脚本中,,我使用协议缓冲区使用以下方法来建模数据: 在. proto文件中定义消息格式。 使用协议缓冲区编译器。 使用Python协议缓冲区API在. py模块中写入和读取消息。 我想在appengine上实现Cloud Endpoints框架,该框架导入,并使用前面提到的Python脚本,但是Cloud Endpoints使用ProtoRPC,而不是“标准”协议缓冲区。 我的App

  • 问题内容: 在Python中,您可以将StringIO用作字符数据的文件状缓冲区。内存映射文件基本上对二进制数据执行类似的操作,但是它需要一个用作基础的文件。Python是否有一个用于二进制数据且仅是内存的文件对象,相当于Java的ByteArrayOutputStream? 我的用例是我想在内存中创建一个ZIP文件,而ZipFile需要一个类似文件的对象。 问题答案: 您可能正在寻找io.Byt

  • 问题内容: 目前,我有一个RESTful Web服务,其端点通过Jersey / JAX-RS公开: 我使用Jackson将POJO序列化/反序列化为JSON,并且我的服务既响应也将POJO发送回。 我现在正在寻找可能使用Google协议缓冲区(或等效技术)来帮助压缩/优化客户端与服务之间的通信的方法,因为JSON /文本非常笨重/浪费。 实际上,我有一个由“微服务”体系结构组成的大型后端。数十种