pythonaudiowav

How to convert a 24-bit wav file to 16 or 32 bit files in python3


I am trying to make spectrogram's of a bunch of .wav files so I can further analyze them(in python 3.6), however, I keep getting this nasty error

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

I have looked into other stack overflow posts such as How do I write a 24-bit WAV file in Python? but theses didn't solve the issue!

I found a audio library called Pysoundfile

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

I installed it with

pip3 install pysoundfile

I have looked over the documentation and it is still not clear to me how to convert a 24-bit .wav file to a 32-bit wav file or a 16-bit wav file so that I can create a spectrogram from it.

Any help would be appreciated!


Solution

  • I would suggest using SoX for this task. Changing the bit depth is very simple:

    sox old.wav -b 16 new.wav
    

    If you must use Python, then you could use PySoundFile as you found. Here's a little code snippet:

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

    You should also use soundfile.available_subtypes to see which subtypes you can convert a file to. Here's its sample usage, taken from their documentation:

    >>> 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'}