16

I am looking for a python function to splice an audio file (wav format) into 1 sec duration splices and store each of the new splices (of 1 sec duration ) into a new .wav file.

Kenan Banks
  • 207,056
  • 34
  • 155
  • 173
Always_Beginner
  • 2,546
  • 6
  • 25
  • 33

2 Answers2

28

Its real simple and easy using pydub module, details of which are over here and here

pydub has a method called make_chunks to which you can specify chunk length in milliseconds.

make_chunks(your_audio_file_object, chunk_length_ms)

Here is a working code that splits wav file in one sec chunks. I had a 8.5 seconds file, so the program created 9 one seconds chunks that are playable. Last chunk will be smaller depending on audio duration.

from pydub import AudioSegment
from pydub.utils import make_chunks

myaudio = AudioSegment.from_file("myAudio.wav" , "wav") 
chunk_length_ms = 1000 # pydub calculates in millisec
chunks = make_chunks(myaudio, chunk_length_ms) #Make chunks of one sec

#Export all of the individual chunks as wav files

for i, chunk in enumerate(chunks):
    chunk_name = "chunk{0}.wav".format(i)
    print "exporting", chunk_name
    chunk.export(chunk_name, format="wav")

Output

Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
exporting chunk0.wav
exporting chunk1.wav
exporting chunk2.wav
exporting chunk3.wav
exporting chunk4.wav
exporting chunk5.wav
exporting chunk6.wav
exporting chunk7.wav
exporting chunk8.wav
>>> 
Anil_M
  • 10,893
  • 6
  • 47
  • 74
  • 1
    Instead using python , sox is a good tool for playing with audio files : http://stackoverflow.com/questions/16125614/trying-to-split-wav-file-into-two-pieces-with-sox – Steven Du Jun 24 '16 at 01:43
  • 1
    You're amazing ;) – hdiz Dec 13 '18 at 13:58
  • How to save these chunks and use them for later speech processing? – abdoulsn Nov 10 '19 at 17:31
  • 1
    `chunk.export ` method exports playable audio chunks to files (.wav here) that you can later use for audio processing.Above chunks (chunk0.wav ... through .. chunk8.wav) are saved in the same folder that you run above scripts from. – Anil_M Nov 12 '19 at 05:55
  • I am using the same code to slice audio files. But I keep getting the following error : AttributeError: 'str' object has no attribute 'export'. Can someone tell me what is wrong here? – Soumya C Jul 20 '20 at 07:28
  • I retried above code in python 2.7.16 & 3.7.5, it still works as intended. Can u check for any typos or post your code in separate question and provide link here? – Anil_M Jul 20 '20 at 22:27
2

Have you thought about just using numpy to cut the file into slices the length of the samplerate, appending each to a list of numpy arrays maybe. Then you can iterate through your list of np.arrays writing each one as a soundfile using your audio tool of choice, I like soundfile personally.

import numpy as np
import soundfile as sf

# read into a numpy array
data, sr = sf.read('filename.format')

# split
split = []
noSections = int(np.ceil(len(data) / sr))

for i in range(noSections):
    # get 1 second
    temp = data[i*sr:i*sr + sr] # this is for mono audio
    # temp = data[i*sr:i*sr + sr, :] # this is for stereo audio; uncomment and comment line above
    # add to list
    split.append(temp)

for i in range(noSections):
    # format filename
    filename = 'filename_{}.format'.format()
    # write to file
    sf.write(filename, split[i], sr)
 

I know there has been a few other answers using different library-functions but this is nice and pure and will be good for anything I'd hope