将numpy int16音频数组转换为float32

dee*_*eef 2 python audio numpy

我有原始二进制int16数据,正在使用将其转换为numpy数组

audio = np.fromstring(raw_data, dtype=np.int16)

数据是音频数据。当我将数据转换为float32时,音频会失真:

audio = audio.astype(np.float32, order='C')

我将音频保存到磁盘以使用SoundFile进行收听:

soundfile.write('out.wav', audio, sample_rate)

如果我执行该astype操作直接将音频写入磁盘,则不会出现失真(即)。

# no distortion
audio = np.fromstring(raw_data, dtype=np.int16)
soundfile.write('out.wav', audio, sample_rate)

# distortion
audio = np.fromstring(raw_data, dtype=np.int16)
audio = audio.astype(np.float32, order='C')
soundfile.write('out.wav', audio, sample_rate)
Run Code Online (Sandbox Code Playgroud)

在这里转换数据类型的正确方法是什么?

jak*_*ket 5

按照惯例,浮点音频数据被归一化为[-1.0,1.0]的范围,您可以通过缩放来实现:

audio = audio.astype(np.float32, order='C') / 32768.0
Run Code Online (Sandbox Code Playgroud)

这可能为您解决了该问题,但是您需要确保soundfile.write编写了一个指示float32的wav标头。它可以根据数组的dtype自动执行此操作。