2

我可以从 URL 访问字节数组文件(float32,big endian),我正在尝试将其转换为 WaveSurfer 可处理的东西,这需要有效的 ArrayBuffer、AudioBuffer 或 wav 文件的 URL。

我得到的最接近的方法是使用 fetch 来获取文件,并尝试将其转换为 ArrayBuffer,但是 WaveSurfer 无法识别,这表示它无法解码数据。

这是我的 JavaScript 代码:

let blob = await fetch(url);
let buffer = await blob.arrayBuffer();
this.wavesurfer.loadArrayBuffer(buffer);

我知道我要解码的文件是有效的音频文件,因为我可以使用以下 python 脚本将其转换为 wav 文件:

import numpy as np
from scipy.io.wavfile import write

def main():
    a = np.fromfile(filePath, '>f4')
    write(outputPath, 16000, a)

关于我能做什么的任何建议?

4

1 回答 1

2

天哪,我终于想通了。我的解决方案最终使用了这个包。

从我需要以大端 Float32 格式读取的二进制文件开始:

import createBuffer from "audio-buffer-from"

var res = await fetch(response.url);
var buffer = await res.arrayBuffer();
var dataview = new DataView(buffer);
var mFloatArray = new Float32Array(buffer.byteLength / 4);

for (let i = 0; i < mFloatArray.length; i++) {
    mFloatArray[i] = dataview.getFloat32(i*4);
}

audioBuffer = createBuffer(mFloatArray, { sampleRate: 16000 });
this.wavesurfer.loadDecodedBuffer(audioBuffer);

这成功加载到wavesurfer!

于 2020-07-30T19:34:22.827 回答