Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

1.1K
Vistas
convertir archivo de audio a PCM lineal de 16 bits

Estoy tratando de enviar un archivo de audio a través de un websocket y me di cuenta de que para hacerlo necesito convertir el archivo mp3 a un código Linear PCM de 16 bits, pero no encuentro la manera de hacerlo.

esto es lo que quiero hacer:

 let mp3File = // the 16-bit pcm file ws.on('message', async(msg) => { if (typeof msg === "string") { } else if (recognizeStream) { recognizeStream.write(msg); } ws.send(mp3File) <== stream back the audio file }); });

algunos antecedentes, la transmisión es una llamada telefónica (a través de vonage api), por lo que ny estaba conectado a la llamada telefónica y escuché la entrada del usuario, y luego, después de cierta lógica en mi servidor, quiero reproducir para el usuario un archivo mp3 que es un archivo local en mi servidor, a través de ws.send().

-----------actualizar--------

ahora, si envío los datos pcm de la transmisión (el audio sin procesar de la llamada telefónica) funciona (el servidor hace eco de la llamada telefónica), así que quiero convertir el archivo mp3 al mismo formato para poder enviarlo a través de ws. enviar().

-----------actualización 2--------

después de hacer mi archivo de audio en el formato correcto que es: " PCM lineal de 16 bits, con una frecuencia de muestreo de 8kHz o 16kHz y un tamaño de cuadro de 20ms "

estoy tratando de enviar el archivo a través del socket web pero no sé cómo hacerlo, tengo el archivo en la carpeta del proyecto pero no sé cómo enviarlo a través de websocket, busqué cómo hacerlo pero no encontré cualquier cosa.

Estoy tratando de hacer lo que se especifica aquí: ingrese la descripción de la imagen aquí

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Primero entendamos lo que esto significa:

PCM lineal de 16 bits, con una frecuencia de muestreo de 8 kHz o 16 kHz y un tamaño de cuadro de 20 ms

Están hablando de 2 cosas aquí:

  1. El formato de los datos de audio, que es "PCM lineal de 16 bits, con una frecuencia de muestreo de 8 kHz o 16 kHz"
  2. Cómo les envía estos datos de audio y cómo se los envían a usted: en fragmentos de datos de audio con un valor de fotogramas de 20 ms

Según el formato de audio, si elige "PCM lineal de 16 bits con una frecuencia de muestreo de 16K" implica:

  • frecuencia de muestreo = 16000
  • ancho de muestra = 16 bits = 2 bytes

Entonces, un fragmento de audio de 1 segundo contendrá bytes = (16000 * 2) = 32000 bytes, lo que significa que un cuadro de audio de 20 ms/0,02 s será equivalente a (32000 * 0,2) = 640 bytes

Se necesitan 2 cosas:

  1. convertir mp3 a wav. Instale ffmpeg en su sistema y ejecute este comando
    ffmpeg -i filename.mp3 -ar 16000 -sample_fmt s16 output.wav
    Esto convierte su filename.mp3 de archivo.mp3 a output.wav , que será PCM lineal de 16 bits en una frecuencia de muestreo de 16K

  2. En su código, cuando devuelve el audio, debe transmitirlo como fragmentos de 640 bytes, no los datos completos del archivo de una sola vez . Hay 3 opciones:

    • ejecute un bucle para escribir todo el audio en el websocket pero en fragmentos de 640 bytes. pero esto tiene un problema, Nexmo almacenará en el búfer solo los primeros 20 segundos de audio. Cualquier cosa más que eso será descartada
    • inicie una tarea asíncrona que se ejecute cada 20 ms y escriba 640 bytes de datos en websocket.
    • escriba cuando reciba audio de nexmo (este es el que mostraré) Dado que nexmo le enviará 640 bytes cada 20 ms, puede enviar 640 bytes al mismo tiempo.

Estoy escribiendo este ejemplo usando el paquete websocket npm.

 var fs = require('fs'); var binaryData = fs.readFileSync('output.wav'); var start = 44 // discard the wav header var chunkSize = 640 ... // ws is a websocket connection object connection.on('message', function(message) { if (message.type === 'utf8') { // handle a text message here } else if (message.type === 'binary') { // print length of audio sent by nexmo. will be 640 for 16K and 320 for 8K console.log('Received Binary Message of ' + message.binaryData.length + ' bytes'); if (start >= binaryData.length) { // slice a chunk and send toSend = binaryData.slice(start, start + chunkSize) start = start + chunkSize connection.sendBytes(toSend); console.log('Sent Binary Message of ' + toSend.length + ' bytes'); } } ... });

Recuerde, habrá algo de retraso desde el momento en que envía el audio desde su servidor a nexmo y lo escucha en el otro lado. Puede variar desde medio segundo hasta incluso más dependiendo de la ubicación del centro de datos de Nexmo, del servidor donde ejecuta su código, la velocidad de la red, etc. He observado que está cerca de 0,5 segundos.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda