Play multiple sounds at the same time in python
<p>I have been looking into a way to play sounds from a list of samples, and I found some modules that can do this.</p>

<p>I am using <strong>AudioLazy</strong> module to play the sound using the following script:</p>

<pre><code>from audiolazy import AudioIO

sound = Somelist
with AudioIO(True) as player:
  player.play(sound, rate=44100)
</code></pre>

<p>The problem with this code is that it stop the whole application till the sound stop playing and I can't play multiple sound at the same time.</p>

<p>My program is interactive so what I want is to be able to play multiple sound at the same time,So for instance I can run this script which will play a 5 second sound then at the second 2 I can play a 5 second sound again.</p>

<p>And I don't want the whole program to stop till the sound finish playing.</p>

<p>Here is a simpler solution using <a href="https://github.com/jiaaro/pydub/" rel="nofollow">pydub</a>.  </p>

<p>Using <code>overlay</code> function of <code>AudioSegment</code>  module, you can very easily <code>superimpose</code> multiple audio on to each other.  </p>

<p>Here is a working code to combine three audio files. Using same concept you can combine multiple audio onto each other.  </p>

<p>More on <code>overlay</code> function <a href="https://github.com/jiaaro/pydub/blob/master/pydub/audio_segment.py" rel="nofollow">here</a></p>

<p><code>pydub</code> supports multiple audio formats as well.</p>

<pre><code>from pydub import AudioSegment
from pydub.playback import play

audio1 = AudioSegment.from_file("chunk1.wav") #your first audio file
audio2 = AudioSegment.from_file("chunk2.wav") #your second audio file
audio3 = AudioSegment.from_file("chunk3.wav") #your third audio file

mixed = audio1.overlay(audio2)          #combine , superimpose audio files
mixed1  = mixed.overlay(audio3)          #Further combine , superimpose audio files
#If you need to save mixed file
mixed1.export("mixed.wav", format='wav') #export mixed  audio file
play(mixed1)                             #play mixed audio file
</code></pre>

<hr>

<p><strong>Here are updates as per our discussions.</strong><br>
First we create 44KHz signal and save to <code>sound.wav</code><br>
Next Read wave file and save signal to text file<br>
Then create three variations of input signal to test overlay.<br>
Original signal has <code>dtype int16</code><br>
Then we create three audio segments
then mix/overlay as above.
<code>wav</code> signal data is stored in <code>test.txt</code></p>

<p><strong>Working Modified Code</strong></p>

<pre><code>import numpy as np
from scipy.io.wavfile import read
from pydub import AudioSegment
from pydub.playback import play
import wave, struct, math


#Create 44KHz signal and save to 'sound.wav'
sampleRate = 44100.0 # hertz
duration = 1.0       # seconds
frequency = 440.0    # hertz

wavef = wave.open('sound.wav','w')
wavef.setnchannels(1) # mono
wavef.setsampwidth(2) 
wavef.setframerate(sampleRate)

for i in range(int(duration * sampleRate)):
    value = int(32767.0*math.cos(frequency*math.pi*float(i)/float(sampleRate)))
    data = struct.pack('&lt;h', value)
    wavef.writeframesraw( data )

wavef.writeframes('')
wavef.close()

#Read wave file and save signal to text file
rate, signal = read("sound.wav")

np.savetxt('test.txt', signal, delimiter=',')   # X is an array


#load wav data from text file
wavedata1 = np.loadtxt("test.txt", comments="#", delimiter=",", unpack=False, dtype=np.int16)

#Create variation of signal
wavedata2 = np.loadtxt("test.txt", comments="#", delimiter=",", unpack=False, dtype=np.int32)

#Create variation of signal
wavedata3 = np.loadtxt("test.txt", comments="#", delimiter=",", unpack=False, dtype=np.float16)

#create first audio segment
audio_segment1 = AudioSegment( 
    wavedata1.tobytes(), 
    frame_rate=rate,
    sample_width=2, 
    channels=1
)

#create second audio segment
audio_segment2 = AudioSegment( 
    wavedata2.tobytes(), 
    frame_rate=rate,
    sample_width=2, 
    channels=1
)

#create third audio segment
audio_segment3 = AudioSegment( 
    wavedata3.tobytes(), 
    frame_rate=rate,
    sample_width=2, 
    channels=1
)

# Play audio (requires ffplay, or pyaudio):
play(audio_segment1)
play(audio_segment2)
play(audio_segment3)

#Mix three audio segments
mixed1 = audio_segment1.overlay(audio_segment2)          #combine , superimpose audio files
mixed2  = mixed1.overlay(audio_segment3)          #Further combine , superimpose audio files
#If you need to save mixed file
mixed2.export("mixed.wav", format='wav') #export mixed  audio file
play(mixed2)                             #play mixed audio file
</code></pre>

python audio interactive