【发布时间】:2021-01-14 05:50:06
【问题描述】:
我已经被这个问题困扰了好几天了,祈祷有人能够指出我正确的方向。
我有一个由https://github.com/discordjs/opus 编码的 Opus 缓冲区流
我想将这些发送到谷歌语音到文本 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)
我还尝试使用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 的 this example 之类的东西,但没有运气
好的,所以进一步挖掘:
我下载了node-opus,据证明它可以与node-ogg一起使用
我注意到 Encoder.encode 的结果在 node-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> }
相比 作品流 -> discord/opus.decode -> discord/opus.encode -> 日志:
<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 编码库如此不同,除非我把事情搞砸了
【问题讨论】:
标签: node.js ogg google-speech-to-text-api