Добавление «тихих кадров» в поток Node.js, когда данные не получены - PullRequest
0 голосов
/ 25 марта 2020

Я создаю бот Discord. js, использующий Node.js, который записывает аудио пользователей в голосовом канале. Он присоединяется к каналу и начинает слушать каждого пользователя отдельно. Он записывает в файл .pcm (т.е. только необработанные данные).

Теперь это работает, но природа аудиопотока Discord вызывает проблемы. Аудиопоток, полученный из API Discord, отправляет данные только тогда, когда говорит пользователь c, а не когда он молчит. Это приводит к тому, что пользователь говорит, что его вставляют друг за другом, без молчания.

Например, я говорю 5 секунд, затем перестаю говорить 5 секунд, затем снова начинаю говорить и т. Д. , Если я сделаю это в течение 1 минуты, я получу файл, который длится всего 30 секунд, так как 5 секунд тишины не записываются в поток.

Код выглядит примерно так (receiver is то, что Discord API обеспечивает для голосового соединения, поток заканчивается произвольно, когда я даю команду):

const audioStream = receiver.createStream(user, {mode:'pcm', end:'manual'};
const outputStream = fs.createWriteStream('SOME_PATH');

audioStream.pipe(outputStream);

audioStream.on('end', () => {
    console.log('Ended stream')
});

Выход audioStream - это 16-битный поток с прямым порядком байтов 44100 Гц (так, только когда пользователь говорит).

Есть ли способ, которым я могу заполнить пробелы в данных какими-то бесшумными кадрами? Или, может быть, поддерживать поток молчания и вводить данные только тогда, когда они поступают?

...