You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的Wave文件多路交错函数无法输出正确Wav文件?

WAV多路交错转译后输出异常问题

我用JavaScript的Wavefile库,把实现WAV文件数据多路交错的Python函数转成了JS版本。现在函数能完成交错操作,但输出的WAV文件不正确。

我的JavaScript代码

function load_to_buffer_arrays(list_of_files) {
  const output_data = [];
  const raw_data_array = [];
  const num_files = list_of_files.length;
  for (let i = 0; i < num_files; i++) {
    const file = list_of_files[i];
    try {
      const buffer = fs.readFileSync(file);
      const wav_temp = new WaveFile(buffer);
      raw_data_array.push(wav_temp.getSamples(false, Int16Array));
    } catch (err) {
      console.error(err);
    }
  }
  const num_samples = raw_data_array[0].length;
  for (let j = 0; j < num_samples; j++) {
    for (let i = 0; i < num_files; i++) {
      let sample = raw_data_array[i][j];
      output_data.push(sample);
    }
  }
  return output_data;
}

原Python代码

def load_to_buffer_arrays(list_of_files):
    """Load files to buffer arrays and interleave the data into one single entity and pass it back"""
    raw_data_array = []
    for i, file in enumerate(list_of_files):
        sound_file = AudioSegment.from_file(file)
        sound_samples = sound_file.get_array_of_samples()
        raw_data_array.append(sound_samples)
    output_data = []
    number_of_files = len(list_of_files)
    length_of_one_raw_data = len(raw_data_array[0])
    for i in range(0, length_of_one_raw_data):
        for j in range(0,number_of_files):
            sample = raw_data_array[j][i]
            output_data.append(sample)
    return output_data

问题表现

预期输出是符合规范的多轨交错WAV文件,实际输出的文件无法正常解析或播放。


问题原因及解决方法

  1. 样本格式处理差异
    Python的AudioSegment.get_array_of_samples()返回单声道连续样本数组,而Wavefile的getSamples(false, Int16Array)在interleaved为false时,返回的是按声道分离的二维数组(比如双声道会返回[左声道数组, 右声道数组])。你的代码直接将这个二维数组存入raw_data_array,导致后续交错逻辑完全错误。

  2. 修复步骤

    • 确保输入WAV为单声道,或提取单个声道样本:
      // 修改样本提取部分
      const samples = wav_temp.getSamples(false, Int16Array);
      // 取第一个声道的样本(适配单声道输入)
      raw_data_array.push(samples[0]);
      
    • 生成输出WAV时需正确设置文件参数,不能仅返回交错数组:
      // 在函数末尾添加WAV生成逻辑
      const outputWav = new WaveFile();
      // 声道数等于输入文件数,采样率、位深与输入一致
      outputWav.fromScratch(num_files, wav_temp.fmt.sampleRate, '16', output_data);
      // 写入输出文件
      fs.writeFileSync('output.wav', outputWav.toBuffer());
      
  3. 额外注意事项

    • 所有输入WAV的采样率、位深必须一致,否则交错后文件会播放异常
    • 若某文件读取失败,后续逻辑基于raw_data_array[0]处理会引发索引错误,建议读取失败时直接终止流程

内容的提问来源于stack exchange,提问作者Edwin Tieu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:45:30