0

几天来,我一直在这个问题上陷入困境,祈祷有人能够指出我正确的方向。

我有一个由https://github.com/discordjs/opus编码的 Opus 缓冲区流

我想将这些发送到谷歌语音到文本 api,需要将它们封装在 ogg 容器中:https://cloud.google.com/speech-to-text/docs/reference/rpc/google.cloud.speech。 v1#音频编码

我正在尝试使用这个库: 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)

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

您很可能不需要将此模块用于任何实际目的

但我想我还是会试试的。

我试过的

          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 的这个例子,但没有运气


好的,进一步挖掘:

我下载了node-opus,它被记录为可以与node-ogg一起使用

我注意到Encoder.encodenode-opus 和 @discordjs/opus 的结果不一样。似乎 node-opus 吐出了我认为是 ogg_packet 的内容,而 discordjs/opus 提供了一个缓冲区。

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

{ 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> }

与 opus 流 -> 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 数据包是我的猜测......

我很好奇为什么这两个作品编码库如此不同,除非我把事情搞砸了

4

1 回答 1

0

如上所述,答案是 ogg 包期待 ogg_packets 而@discordjs/opus 没有给出。

于 2020-10-02T16:45:39.277 回答