【问题标题】:Downsampling 48khz to 16khz - Javascript将 48khz 下采样到 16khz - Javascript
【发布时间】:2015-10-05 10:34:30
【问题描述】:

目前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

Matlab 绘图 - 48k

【问题讨论】:

  • 既然您没有真正遇到问题,但您正在寻求确认,我会说您的帖子属于 codereview,而不是 stackoverflow。投票结束这里。 (codereview.stackexchange.com)

标签: javascript node.js web-audio-api getusermedia


【解决方案1】:

在我看来,数据正在写入立体声文件,对吧?这可以解释断断续续的波形,因为您只有左通道的数据,而右通道用零填充。

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

我不确定如何解释 matlab 绘图,但对我来说就是这样。

【讨论】:

  • 而且您不能只取每三个样本。您需要进行一些过滤,否则生成的音频听起来会很奇怪。除非您已经知道输入的频带限制为 16 kHz。您可以使用 WebAudio 为您进行过滤。
  • 是的,我知道@RaymondToy ......我想这样做,一个“粗暴”的下采样。因为在 matlab 中执行此操作并使用它的语音识别器后,它会正常工作。
  • @OskarEriksson 感谢您的提示...我错过了那个尺寸问题
【解决方案2】:

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

注意:我拼出的单词是完全一样的,但是你可以看到因为浏览器切换的延迟,然后按开始\停止按钮。

【讨论】:

    猜你喜欢
    • 2017-07-28
    • 2018-01-16
    • 1970-01-01
    • 2011-12-23
    • 2022-07-14
    • 2020-12-24
    • 2017-02-23
    • 1970-01-01
    • 2016-02-14
    相关资源
    最近更新 更多