Создание пакета Ogg из буферов Opus в nodejs

#node.js #ogg #google-speech-to-text-api

#node.js #ogg #google-speech-to-text-api

Вопрос:

Я уже несколько дней не могу решить эту проблему, молясь, чтобы кто-нибудь смог указать мне правильное направление.

У меня есть поток буферов Opus, закодированных https://github.com/discordjs/opus

Я хочу отправить их в API преобразования речи в текст Google, который требует, чтобы они были инкапсулированы в контейнеры 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, но безуспешно


ХОРОШО, так что дальнейшее копание:

Я загрузил node-opus, который документирован для работы с node-ogg

Я заметил, что результат Encoder.encode не совпадает между node-opus и @discordjs / opus. Кажется, что node-opus выдает то, что я считаю ogg_packet , а discordjs / opus предоставляет буфер.

т.е.: поток opus -> discord / opus.decode -> узел-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 -> журнал:

 <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 настолько разные, если только я что-то не напутал

Ответ №1:

Как и выше, ответ заключался в том, что пакет ogg ожидает ogg_packets, а @discordjs / opus этого не дает.