下采样 48khz 到 16khz - Javascript

Downsampling 48khz to 16khz - Javascript

目前 getUserMedia 正在获取 48Khz 的音频(来自麦克风)。但是我的语音识别服务器只能使用 16Khz 的音频(可能是 48Khz,但它会进行下采样)。我的 objective 是为了在客户端进行下采样来节省带宽。

recorder.onaudioprocess = function(e){
    if(!recording) return;
    console.log ('recording');
    left = e.inputBuffer.getChannelData(0);
    Stream.write(convertoFloat32ToInt16(left));//write to server

  }

function convertoFloat32ToInt16(buffer) {
  var l = buffer.length;
  var buf = new Int16Array(l)

  while (l--) {
    if(l%3==0){
    buf[l/3] = buffer[l]*0xFFFF;
  }
  }
  return buf.buffer
}

您还有其他实现吗? 编辑: 我把录制相同音频的nodejs服务器放到一个文件中,然后用matlab打开它。这些文件具有相同的大小。而且不应该,对吧?

Matlab 图 - 16k

Matlab 图 - 48k

在我看来,数据正在写入立体声文件,对吧?这可以解释起伏不定的波形,因为您只有左通道的数据,而右通道充满了零。

另外,您创建的 Int16Array() 是原始缓冲区的长度,但它实际上应该只是长度的三分之一,因为您只使用每三个样本。这可能可以解释为什么渲染后它们的大小相同。

我不确定如何解释 matlab 图,但这就是我的样子。

解决方案(感谢@OskarEriksson,这是你的提示,现在我没有问题了):

recorder.onaudioprocess = function(e){
    if(!recording) return;
    console.log ('recording');
    left = e.inputBuffer.getChannelData(0);
    Stream.write(convertoFloat32ToInt16(left));//write to server

  }

function convertoFloat32ToInt16(buffer) {
  var l = buffer.length;
  var buf = new Int16Array(l/3); //<-----Only change here

  while (l--) {
    if(l%3==0){
    buf[l/3] = buffer[l]*0xFFFF;
  }
  }
  return buf.buffer
}

Matlab 绘图: 48k

16k

注意:我拼的字是完全一样的,但是你可以看到因为浏览器切换有一些延迟,然后按Start\Stop按钮。