0

我正在尝试构建我正在研究的 VAD 算法的“离线”基准版本。在在线版本中,我使用 createMediaStreamSource 作为分析器节点的输入,它工作得非常好。在离线版本中,我想加载和拆分录制的音频文件,所以我使用 xhr 将文件加载为 ArrayBuffer,然后将其拆分(因此它将模拟音频流)并将其用作源 createBufferSource。

这是分割audioBuffer的代码:

let audio_dur = audioBuffer.duration;

  let segments_num = Math.ceil(audio_dur / segment_dur);
  let segment_length = Math.ceil(audioBuffer.length / segments_num);
  segmentsArr = new Array(segments_num);

  let AudioData = new Float32Array(audioBuffer.length);
  AudioData = audioBuffer.getChannelData(0);


  for (let i = 0; i <= segments_num-1; i++){
    segmentsArr[i] = AudioData.slice(i*segment_length,(i+1)*segment_length-1);
  }

然后,将其连接到分析仪的部分:

const analyser = audioCtx.createAnalyser();
analyser.minDecibels = min_decibels;
analyser.fftSize = fft_size;

const T_data = new Float32Array(analyser.fftSize);
const F_data = new Uint8Array(analyser.frequencyBinCount);

let segments_num = segmentsArr.length;
let segment_length = segmentsArr[1].length;

var cur_Buffer = audioCtx.createBuffer(1, segment_length, audioCtx.sampleRate);

for (let segment_ind = 0; segment_ind <= segments_num-1; segment_ind++) {
  let cur_segment = segmentsArr[segment_ind];
  cur_Buffer.copyToChannel(cur_segment,0,0);

  let cur_source = audioCtx.createBufferSource();
  cur_source.loop = false;
  cur_source.buffer = newBuffer;

  cur_source.connect(analyser);

  analyser.getByteFrequencyData(F_data); // get current data
  analyser.getFloatTimeDomainData(T_data); // get current data
  ...

代码继续。

问题是:分析仪返回的时间数据和频率数据总是空的。

在询问之前: 1. minDecibels 为 -100Db(可能的最低值)。2.segmentsArr 不为空,我可以逐段播放,使用完全相同的方式创建 AudioBufferSource,然后将其连接到音频目标。

回答:感谢@cwilso,问题是我没有cur_source.start在每个新来源中都使用过,非常感谢。

4

1 回答 1

0

从这段代码中很难看出它是如何连接的以及代码是如何启动的。

1)您在缓冲区源节点上调用 start() ,对吗?2)在启动发生后您正在调用getByteFrequencyData()等?3) 您是否听到通过目标播放的缓冲区块?

于 2018-10-01T15:56:39.077 回答