Search code examples
pythonwavpydub

Combining wav files programmatically - Python


I am looking to combine 10 audio samples in various manners (format - wav probably, but this can be changed to any format as they will be pre-recorded).

from pydub import AudioSegment
sounds = []
sound1 = AudioSegment.from_wav("Dropbox/PIREAD/1.wav")
sound2 = AudioSegment.from_wav("Dropbox/PIREAD/2.wav")
sound3 = AudioSegment.from_wav("Dropbox/PIREAD/3.wav")
sound4 = AudioSegment.from_wav("Dropbox/PIREAD/4.wav")
sound5 = AudioSegment.from_wav("Dropbox/PIREAD/5.wav")
sound6 = AudioSegment.from_wav("Dropbox/PIREAD/6.wav")
sound7 = AudioSegment.from_wav("Dropbox/PIREAD/7.wav")
sound8 = AudioSegment.from_wav("Dropbox/PIREAD/8.wav")
sound9 = AudioSegment.from_wav("Dropbox/PIREAD/9.wav")
sound0 = AudioSegment.from_wav("Dropbox/PIREAD/0.wav")

sounds=[sound1,sound2,sound3,sound4,sound5,sound6,sound7,sound8,sound9,sound0]

combined_sounds = AudioSegment.empty()

for x in range(10):
    for y in range(10):
        combined_sounds += sounds[y]
    
combined_sounds.export("Dropbox/PIREAD/joinedFile.wav", format="wav")

This is literally me reading the numbers 0-9 and assembling them into one overall wav file.

It works - but it is slow once the loop is extended x=100, x=1000.

Q: How can I speed things up?

The actual order of the numbers will be read from a text$ - for example "354224848179261915075" which happens to be the 100th Fibonacci number.

Cheers Glen


Solution

  • Thanks for the suggestions and advice above. This is the final code I used and link to the resultant video (with ffmpeg visualisation):

    # Program to display the Fibonacci sequence up to n-th term
    from pydub import AudioSegment
        
    combined_sounds = ""
    sound1 = AudioSegment.from_wav("1_2.wav")
    sound2 = AudioSegment.from_wav("2_2.wav")
    sound3 = AudioSegment.from_wav("3_2.wav")
    sound4 = AudioSegment.from_wav("4_2.wav")
    sound5 = AudioSegment.from_wav("5_2.wav")
    sound6 = AudioSegment.from_wav("6_2.wav")
    sound7 = AudioSegment.from_wav("7_2.wav")
    sound8 = AudioSegment.from_wav("8_2.wav")
    sound9 = AudioSegment.from_wav("9_2.wav")
    sound0 = AudioSegment.from_wav("0_2.wav")
    
    
    
    nterms=1000
    # first two terms
    n1, n2 = 0, 1
    count = 0
    fib = ""
    
    # check if the number of terms is valid
    if nterms <= 0:
        print("Please enter a positive integer")
    # if there is only one term, return n1
    elif nterms == 1:
        print("Fibonacci sequence upto",nterms,":")
        print(n1)
    # generate fibonacci sequence
    else:
        print("Fibonacci sequence:")
        while count < nterms:
            #print(n1)
            fib += str(n1)
            nth = n1 + n2
           # update values
            n1 = n2
            n2 = nth
            count += 1
            
    i=-36
    j=0
    
    fibs = [fib[i:i+1000] for i in range(0, len(fib), 1000)]
    
    seg = 0
    for a in fibs:
        if seg == 2:
            break
            
        combined_sounds = AudioSegment.empty()
        seg +=1
        for x in a:
            i,j = -36,0
            s = eval("sound"+str(x))    
            s = s.apply_gain_stereo(i,j)
            combined_sounds += s
            i,j = j,i
            
    
        combined_sounds.export("joinedFile"+str(seg)+".wav", format="wav")
    

    This splits the output into 1000 digit wav files. The first 1000 Fibonacci terms produces nearly 15Gb of wavs!

    Uploaded to YouTube: https://www.youtube.com/watch?v=U7Z_HOGqjlE

    Thanks all.