Estoy trabajando con transmisiones de audio en Node.js. Por ahora, mi código no tiene utils.promisfy y tengo 3 etapas. Entonces, después del segundo .pipe , estoy escribiendo el archivo en el disco en formato de audio wav con los parámetros requeridos.
Ejemplo de código a continuación:
import { FileWriter } from 'wav'; const filename = `./${Date.now()}-${userId}.wav`; const encoder = new OpusEncoder(16000, 1); receiver .subscribe(userId, { end: { behavior: EndBehaviorType.AfterSilence, duration: 100, }, }) // OpusDecodingStream is a custom class, which convert audio, like a gzip stage for file. .pipe(new OpusDecodingStream({}, encoder)) .pipe( // Writes wav file to disk, also can be replaces with FileRead, part of wav module new FileWriter(filename, { channels: 1, sampleRate: 16000, }), ); El problema es: necesito transferir (¡no transmitir!) el archivo de audio resultante en formato binario a través del método POST de axios . Así que supongo que es un poco incorrecto escribir un archivo en el disco en lugar de escribirlo en una variable, y después de que finalice la transmisión, enviarlo directamente a la URL requerida. Algo (por lógica) que me gustaría ver:
// other code const fileStringBinary = await receiver .subscribe(userId, { end: { behavior: EndBehaviorType.AfterSilence, duration: 100, }, }) .pipe(new OpusDecodingStream({}, encoder)) .pipe( return new FileWriter(filename, { channels: 1, sampleRate: 16000, }), ); await axios.post('https://url.com', { data: fileStringBinary });Desafortunadamente, no soy tan bueno con las transmisiones y especialmente con el audio, por lo que estoy buscando un poco de ayuda o cualquier consejo útil será bienvenido para mí.
Entiendo que podría escribir mi archivo en el directorio, encontrarlo allí, leerlo una vez más con
node:steamcreateReadStream y luego PUBLICARLO en la URL requerida. Esto no es lo que necesito. Me gustaría saltarme estas etapas inútiles con la escritura y luego la lectura. Creo que hay una manera de transformar Steam a formato binario y escribirlo en la variable js.
Eso fue un poco complicado después de todo, pero supongo que lo descubrí:
const stream = receiver .subscribe(userId, { end: { behavior: EndBehaviorType.AfterSilence, duration: 100, }, }) .pipe( new opus.OggLogicalBitstream({ opusHead: new opus.OpusHead({ channelCount: 2, sampleRate: 48000, }), pageSizeControl: { maxPackets: 10, }, crc: false, }), ); const data = []; stream.on('data', (chunk) => { data.push(chunk); }); stream.on('end', async () => { try { const response = await axios.post( `https://url.com${postParams}`, Buffer.concat(data), { headers: { Authorization: `Api-Key ${token}`, 'Content-Type': 'application/x-www-form-urlencoded', }, }, ); console.log(response); } catch (e) { console.log(e); } }); Desafortunadamente, no he encontrado una solución mejor que usar el modelo de events de la vieja escuela con data y al end . Mi caso de trabajo está conectado con la grabación de voz Discord.js sin archivo y usando la transmisión para el reconocimiento de voz.
Estaré encantado si alguien proporciona una mejor solución de sintaxis, y en ese caso aceptaré esta respuesta como solved .