Handling 16-bit .WAV audio files

nigel at axoninstruments.co.uk nigel at axoninstruments.co.uk
Wed Mar 3 04:14:59 EST 2004


I'm trying to handle 16-bit .WAV format audio files.  I've started
with the code below (from pythonapocrypha.com).  I can successfully
read in the 16-bit code, using Numeric.fromstring, as they suggest in
the comments below.  

However, I can't manage to write the samples, I always seem to get 32
bits per sample (yes, it is set to mono!).  

It seems that I need to use Numeric.tostring, with an option to set it
to 'Numeric.Int16', but that is only available in Numeric.fromstring?

Do I need to convert the array somehow to a 16 bit signed integer
type?

What should I be doing to convert my final array to a suitable string
of 16-bit values?

Nigel


########################################
import Numeric
import wave

BUFFER_SIZE=5000
# NB: This is an 8-bit stereo .wav file. If it had a different
# sample size, such as 16-bits, we would need to convert the 
# sequence of bytes into an array of 16-bit integers by 
# calling Numeric.fromstring(Data,Numeric.Int16)
InFile=wave.open("LoudLeft.wav","rb") 
OutFile=wave.open("QuietLeft.wav","wb")
OutFile.setparams(InFile.getparams())
while 1:
    # Read audio data as a string of bytes:
    Data=InFile.readframes(BUFFER_SIZE)
    if len(Data)==0:
        break
    # Create an array based on the string:
    Frames=Numeric.array(Data,
        typecode=Numeric.UnsignedInt8,savespace=1)
    # Take every other frame to get just the left side. And,
    # divide each one by 2. (We would like to use
    # Numeric.divide(Frames[::2],2), but we can't,
    # because the returned array would have float type). 
    Frames[::2] = Frames[::2]/2
    OutFile.writeframes(Frames.tostring())
InFile.close()
OutFile.close()



More information about the Python-list mailing list