在 Node JS 中将 Twilio Mulaw 转换为 16Khz PCM 流

问题描述 投票:0回答:2

我正在编写一个 Twilio 自动应答机器人。我可以从 twilio 接收流并使用套接字的“media”事件中的 msg.media.payload 获取内容。但我无法使用 NodeJS 将 base64 mulaw 转换为 16 位 pcm 数组。

function basetoPCM(data){
  console.log(data)
  var blob  = atob(data);   // Base64 string converted to a char array
  console.log("use base64 decoder to decode the Payload received.");
    console.log(blob);

  //use this payload buffer and decode using the G.711 decoder (mulaw to pcm)
  var pcm = alawmulaw.mulaw.decode(blob);
  console.log("getting decode pcm");
  console.log(pcm);
  return pcm;
}

但是它的响应只是一个具有相同数字的数组:

getting decode pcm
Int16Array(160) [
  -32124, -32124, -32124, -32124, -32124, -32124, -32124, ...

我使用的将音频发送到Kaldi转录服务器的功能是:

const buffer = e;
      const int16ArrayData = convertFloat32ToInt16(buffer);
      console.log("int16data");
      console.log(int16ArrayData)
      this.ws.send(int16ArrayData.buffer);

所以我的问题是如何将 Twilio base64 mulaw 转换为 16 位 PCM 音频缓冲区。有没有办法让 Twilio 在 PCM 中编码?谢谢!

node.js twilio
2个回答
1
投票

这里是 Twilio 开发者布道者。

我没有使用过 alawmulaw 库,你似乎在这里尝试,但查看文档,你可能在这里运行了错误的函数。当实时网络套接字数据到达时,我会认为它是一个“样本”而不是一组样本,你应该尝试一下:

var pcm = alawmulaw.mulaw.decodeSample(blob);

或者,在这个答案中,我的同事 Craig 推荐了WaveFile lib。查看一些示例代码的答案。


0
投票
console.log("Receiving audio...");
const WaveFile = require('wavefile').WaveFile;
const payload = msg.media.payload;
const wav = new WaveFile();
wav.fromScratch(1, 8000, "8m", Buffer.from(payload, "base64"));
wav.fromMuLaw();
wav.toSampleRate(16000);
const results = wav.toBuffer();
const samples = wav.data.samples;
fs.writeFileSync('./stream.wav', results);

    
© www.soinside.com 2019 - 2024. All rights reserved.