【问题标题】:Float32 to Int16 - Javascript (Web Audio API)Float32 到 Int16 - Javascript(网络音频 API)
【发布时间】:2021-09-14 20:52:59
【问题描述】:

我正在尝试将 Float32 转换为 Int16。但到目前为止,还没有效果。因为输出音频会产生大量剪辑(因此,音频输出非常差)。我正在使用这个功能:

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

  while (l--) {
    if (l==-1) break;

    if (buffer[l]*0xFFFF > 32767)
      buf[l] = 32767;
    elseif (buffer[l]*0xFFFF < -32768)
      buf[l] = -32768;
    else 
      buf[l] = buffer[l]*0xFFFF;
  }
  return buf.buffer;
}

如果我之前实现了gainNode(),那么剪辑效果就不太明显了。但并不是一个可取的方式,因为目的是在每个麦克风中都有效。在这个 Matlab 图中可以看到剪裁效果:

【问题讨论】:

  • 你需要展示更多你在做什么。此外,WebAudio 期望数据在 -1 到 1 的范围内,所以我不明白您为什么要将浮点样本转换为 int16。
  • 我想这可能与 PCM 需要 Int16 的事实有关。
  • 16 位 PCM (LINEAR16) 通常用作音频处理管道(语音转文本、语音活动检测、扬声器标签等)的输入。

标签: javascript web-audio-api


【解决方案1】:

用这个代替while,就是解决办法:

while (l--) {
    s = Math.max(-1, Math.min(1, samples[l]));
    buf[l] = s < 0 ? s * 0x8000 : s * 0x7FFF;
    //buf[l] = buffer[l]*0xFFFF; //old   //convert to 16 bit
  }
}

现在,记录听起来很完美,Matlab 也可以。

【讨论】:

  • 看起来你原来的问题是你乘以 0xFFFF (65535),而不是 0x8000 (32768) 或 0x7FFF (32767),所以 [-0.5, 0.5] 之间的输入加倍,[-1, -0.5)(0.5, 1] 中的输入被截断。新代码的简单性无关紧要(很好,但不能解决任何问题),重要的是对常量的修复。
  • 那么,其实这和WebAudio无关?
  • @RaymondToy 所有这些值都来自 WebAudio API。
  • 小错误。应该是 buf[l/3] 而不是 buf[l]
【解决方案2】:

这对我有用:

const int16Array = Int16Array.from(buffer, x => x * 32767);

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 2017-07-21
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    相关资源
    最近更新 更多