如何在python3中将24位wav文件转换为16或32位文件

问题描述 投票:0回答:3

我正在尝试制作一堆 .wav 文件的频谱图,以便我可以进一步分析它们(在 python 3.6 中),但是,我不断收到这个讨厌的错误

 ValueError: Unsupported bit depth: the wav file has 24-bit data.

我研究了其他堆栈溢出帖子,例如 如何用 Python 编写 24 位 WAV 文件? 但这些并没有解决问题!

我找到了一个名为 Pysoundfile 的音频库

http://pysoundfile.readthedocs.io/en/0.9.0/

我安装了它

pip3 install pysoundfile

我已经查看了文档,但我仍然不清楚如何将 24 位 .wav 文件转换为 32 位 wav 文件或 16 位 wav 文件,以便我可以从中创建频谱图。

如有任何帮助,我们将不胜感激!

python audio wav
3个回答
26
投票

我建议使用 SoX 来完成此任务。更改位深度非常简单:

sox old.wav -b 16 new.wav

如果您必须使用Python,那么您可以使用您找到的PySoundFile。这是一个小代码片段:

import soundfile

data, samplerate = soundfile.read('old.wav')
soundfile.write('new.wav', data, samplerate, subtype='PCM_16')

您还应该使用

soundfile.available_subtypes
查看可以将文件转换为哪些子类型。这是它的示例用法,取自他们的文档:

>>> import soundfile as sf
>>> sf.available_subtypes('FLAC')
{'PCM_24': 'Signed 24 bit PCM',
 'PCM_16': 'Signed 16 bit PCM',
 'PCM_S8': 'Signed 8 bit PCM'}

1
投票

我在 Berk Özbalcı 的帮助下找到了解决方案 我在下面编写了一个函数,将 .wav 文件目录转换为 16 位 wav 文件

def convertAllFilesInDirectoryTo16Bit(directory):
    for file in os.listdir(directory):
         if(file.endswith('.wav')):
             nameSolo = file.rsplit('.', 1)[0]
             print(directory + nameSolo )
             data, samplerate = soundfile.read(directory + file)                

           soundfile.write('/Users/yournamehere/Desktop/folderwhereyouwanttosae/' + nameSolo + '16BIT.wav', data, samplerate, subtype='PCM_16')
            print("converting " + file + "to 16 - bit")

0
投票

使用 Scipy 和 Numpy

import scipy.io.wavfile as wavfile
import numpy.int16

def to_16bit_wav(filepath):
  sr, data = wavfile.read(filepath)
  wavfile.write(filepath, sr, numpy.int16(data))
© www.soinside.com 2019 - 2024. All rights reserved.