Python – editing a wav files using python

audiopython

Between each word in the wav file I have full silence (I checked with Hex workshop and silence is represented with 0's).

How can I cut the non-silence sound?

I'm programming using python.

Thanks!

Best Solution

Python has a wav module. You can use it to open a wav file for reading and use the `getframes(1)' command to walk through the file frame by frame.

import wave
w = wave.open('beeps.wav', 'r')
for i in range():
frame = w.readframes(1)

The frame returned will be a byte string with hex values in it. If the file is stereo the result will look something like this (4 bytes):

'\xe2\xff\xe2\xff'

If its mono, it will have half the data (2 bytes):

'\xe2\xff'

Each channel is 2 bytes long because the audio is 16 bit. If is 8 bit, each channel will only be one byte. You can use the getsampwidth() method to determine this. Also, getchannels() will determine if its mono or stereo.

You can loop over these bytes to see if they all equal zero, meaning both channels are silent. In the following example I use the ord() function to convert the '\xe2' hex values to integers.

import wave
w = wave.open('beeps.wav', 'r')
for i in range(w.getnframes()):
    ### read 1 frame and the position will updated ###
    frame = w.readframes(1)

    all_zero = True
    for j in range(len(frame)):
        # check if amplitude is greater than 0
        if ord(frame[j]) > 0:
            all_zero = False
            break

    if all_zero:
        # perform your cut here
        print 'silence found at frame %s' % w.tell()
        print 'silence found at second %s' % (w.tell()/w..getframerate())

It is worth noting that a single frame of silence doesn't necessarily denote empty space since the amplitude may cross the 0 mark normal frequencies. Therefore, it is recommended that a certain number of frames at 0 be observed before deciding if the region is, in fact, silent.