Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to splice an audio file (wav format) into 1 sec splices in python?

Tags:

python

audio

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.

like image 943
Always_Beginner Avatar asked Apr 22 '16 17:04

Always_Beginner


People also ask

What is pydub in Python?

pydub is a Python library to work with only . wav files. By using this library we can play, split, merge, edit our . wav audio files.


2 Answers

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
>>> 
like image 166
Anil_M Avatar answered Sep 29 '22 12:09

Anil_M


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

like image 36
Finn O'Connor Avatar answered Sep 29 '22 13:09

Finn O'Connor