在 nodejs 中从 Opus 缓冲区创建 Ogg 数据包

Creating an Ogg packet from Opus buffers in nodejs

几天来我一直被这个问题困住,祈祷有人能给我指明正确的方向。

我有一个由 https://github.com/discordjs/opus

编码的 Opus 缓冲区流

我想将这些发送到 google speech to text api,这需要将它们封装在 ogg 容器中:https://cloud.google.com/speech-to-text/docs/reference/rpc/google.cloud.speech.v1#audioencoding

我正在尝试使用这个库: https://github.com/TooTallNate/node-ogg

这是我正在尝试的:

const oggEncoder = ogg.Encoder();
const oggStream = oggEncoder.stream();

const audioInputStreamTransform = new Writable({
  write(frame, encoding, next) {
    if (frame) {
        oggStream.write(frame);
      }
    }
    next();
  },
});

voiceStream.pipe(audioInputStreamTransform)
oggEncoder.pipe(google-speech2textStream)

// Neither of these work - nothing appears to be happening
// No data events emitted from either stream
// oggEncoderStream.pipe(google-speech2textStream)

在发送到 oggStream.write 之前,我还尝试使用 ogg-packet 库将我的缓冲区包装在 ogg_packet 结构中。这也导致没有数据事件被发出。我很确定这是错误的方法,因为 ogg-packet 说:

You'll most likely not need to use this module for any practical purposes

但我还是想试试。

我试过的

          const packet = new ogg_packet();
          packet.packet = frame;
          packet.bytes = frame.length;

          // this will be the first packet in the ogg stream
          packet.b_o_s = 1;
          // there will be more `ogg_packet`s after this one in the ogg stream
          packet.e_o_s = 0;

          // the "packetno" should increment by one for each packet in the ogg stream
          packet.packetno = packetno++;

          // No joy with any of these
          //oggStream.write(ogg.ogg_packet(packet));
          //oggStream.write(packet);
          //oggStream.write(packet.buffer);

在音频编码方面,我是一个真正的新手,所以我可能误解了这个过程的某些部分 - 如果这是微不足道的事情,我深表歉意,但我已经这样做了大约一个星期了

如果有更好的地方可以寻求帮助,请随时与我联系 - 谢谢:)

还尝试了来自 node-opus 的 this example 之类的东西,但没有成功


好的,所以进一步挖掘:

我下载了node-opus which is documented to work with node-ogg

我注意到 Encoder.encode 的结果在 node-opus 和 @discordjs/opus 之间是不一样的。似乎 node-opus 吐出了我认为是 ogg_packet 的东西,而 discordjs/opus 给出了一个缓冲区。

即: 作品流 -> discord/opus.decode -> node-opus.encode -> log:

{ packet: <Buffer 4f>,
  bytes: 19,
  b_o_s: 1,
  e_o_s: 0,
  granulepos: -1,
  packetno: 0,
  'ref.buffer':
   <Buffer 18 33 11 04 01 00 00 00 13 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00> }

相比于 作品流 -> discord/opus.decode -> discord/opus.encode -> log:

<Buffer 78 80 64 26 7e d0 2f e8 f5 a5 6d 1c da 41 04 0b 33 d9 ee 3a 0b ee 53 a6 f6 bb cf 55 c8 e3 36 e1 18 4a 9f e9 7f 94 8d a3 0c 96 b3 a1 f7 03 e7 9a 78 db ... >

那将是我的问题。我猜我需要从这些缓冲区创建 ogg 数据包...

我很好奇为什么这两个 opus 编码库如此不同,除非我真的搞砸了一些东西

如上所述,答案是 ogg 包需要 ogg_packets 而 @discordjs/opus 没有。