Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

1.1K
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda