下采样48khz到16khz - Javascript

时间:2015-10-05 10:34:30

标签: javascript node.js web-audio getusermedia

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

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

enter image description here

Matlab图 - 48k

48khz

2 个答案:

答案 0 :(得分:2)

我认为数据正在写入立体声文件,对吗?这可以解释波形波形,因为您只有左声道的数据而右声道充满了零。

此外,您将Int16Array()创建为原始缓冲区的长度,但它实际上应该只是长度的三分之一,因为您只使用每三个样本。这可能解释了为什么一旦你渲染它们就会变成相同的尺寸。

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

答案 1 :(得分:1)

解决方案(感谢@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 enter image description here

16K

enter image description here

注意:我拼写的单词完全相同,但由于浏览器切换,您可以看到一些延迟,然后按开始\停止按钮。