Reproduce múltiples sonidos al mismo tiempo en python

He estado buscando una forma de reproducir sonidos de una lista de muestras, y encontré algunos módulos que pueden hacer esto.

Estoy usando el módulo AudioLazy para reproducir el sonido usando el siguiente script:

from audiolazy import AudioIO sound = Somelist with AudioIO(True) as player: player.play(sound, rate=44100) 

El problema con este código es que detiene toda la aplicación hasta que el sonido deja de reproducirse y no puedo reproducir varios sonidos al mismo tiempo.

Mi progtwig es interactivo, así que lo que quiero es poder reproducir múltiples sonidos al mismo tiempo, así que, por ejemplo, puedo ejecutar este script que reproducirá un sonido de 5 segundos y luego en el segundo 2 puedo reproducir un sonido de 5 segundos nuevamente.

Y no quiero que todo el progtwig se detenga hasta que el sonido termine de reproducirse.

Aquí hay una solución más simple usando pydub .

Al utilizar la función de overlay del módulo de AudioSegment , puede superimpose muy fácilmente el audio múltiple entre sí.

Aquí hay un código de trabajo para combinar tres archivos de audio. Usando el mismo concepto puedes combinar audio múltiple entre sí.

Más sobre la función de overlay aquí

pydub soporta múltiples formatos de audio también.

 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 

Aquí están las actualizaciones según nuestras discusiones.
Primero creamos la señal de 44KHz y sound.wav en sound.wav
Siguiente Leer archivo de onda y guardar señal en archivo de texto
Luego cree tres variaciones de la señal de entrada para probar la superposición.
La señal original tiene dtype int16
Luego creamos tres segmentos de audio y luego mezclamos / superponemos como anteriormente. wav datos de la señal wav se almacenan en test.txt

Código de trabajo modificado

 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(' 

Sugiero usar Pyaudio para hacer esto.

 import pyaudio import wave sound1 = wave.open("/path/to/sound1", 'rb') sound2 = wave.open("/path/to/sound2", 'rb') def callback(in_data, frame_count, time_info, status): data1 = sound1.readframes(frame_count) data2 = sound2.readframes(frame_count) decodeddata1 = numpy.fromstring(data1, numpy.int16) decodeddata2 = numpy.fromstring(data2, numpy.int16) newdata = (decodeddata1 * 0.5 + decodeddata2* 0.5).astype(numpy.int16) return (newdata.tostring(), pyaudio.paContinue) 

El uso de múltiples hilos resolverá su problema:

 import threading from audiolazy import AudioIO sound = Somelist with AudioIO(True) as player: t = threading.Thread(target=player.play, args=(sound,), kwargs={'rate':44100}) t.start()