¿Cómo generar audio desde una matriz numpy?

Quiero crear un efecto de “monitor de frecuencia cardíaca” a partir de una matriz 2D en números y quiero que el tono refleje los valores de la matriz.

Puede usar la función de scipy.io.wavfile de scipy.io.wavfile para crear un archivo wav que luego puede reproducir como desee. Tenga en cuenta que la matriz debe ser enteros, por lo que si tiene flotantes, es posible que desee escalarlos adecuadamente:

 import numpy as np from scipy.io.wavfile import write data = np.random.uniform(-1,1,44100) # 44100 random samples between -1 and 1 scaled = np.int16(data/np.max(np.abs(data)) * 32767) write('test.wav', 44100, scaled) 

Si desea que Python realmente reproduzca audio, esta página proporciona una descripción general de algunos de los paquetes / módulos.

Para la gente que viene aquí en 2016, scikits.audiolab parece que ya no funciona. Pude obtener una solución usando el dispositivo de sonido.

 import numpy as np import sounddevice as sd fs = 44100 data = np.random.uniform(-1, 1, fs) sd.play(data, fs) 

Además, puedes probar scikits.audiolab . Cuenta con archivos IO y la capacidad de “reproducir” arreglos. Las matrices no tienen que ser enteros. Para imitar el ejemplo de dbaupp:

 import numpy as np import scikits.audiolab data = np.random.uniform(-1,1,44100) # write array to file: scikits.audiolab.wavwrite(data, 'test.wav', fs=44100, enc='pcm16') # play the array: scikits.audiolab.play(data, fs=44100) 

Si está utilizando Jupyter, la mejor opción es:

 from IPython.display import Audio Audio(numpy.sin(numpy.linspace(0, 3000, 20000)), rate=20000) 

Tuve algunos problemas con el uso de scikit.audiolabs , así que busqué otras opciones para esta tarea. Se me ocurrió un dispositivo de sonido , que parece mucho más actualizado. No he comprobado si funciona con Python 3.

Una forma sencilla de realizar lo que quieres es esta:

 import numpy as np import sounddevice as sd sd.default.samplerate = 44100 time = 2.0 frequency = 440 # Generate time of samples between 0 and two seconds samples = np.arange(44100 * time) / 44100.0 # Recall that a sinusoidal wave of frequency f has formula w(t) = A*sin(2*pi*f*t) wave = 10000 * np.sin(2 * np.pi * frequency * samples) # Convert it to wav format (16 bits) wav_wave = np.array(wave, dtype=np.int16) sd.play(wav_wave, blocking=True) 

PyGame tiene el módulo pygame.sndarray que puede reproducir datos numpy como audio. Las otras respuestas son probablemente mejores, ya que PyGame puede ser difícil de poner en marcha. Por otra parte, Scipy y Numpy vienen con sus propias dificultades, así que quizás no sea un gran paso agregar PyGame a la mezcla.

http://www.pygame.org/docs/ref/sndarray.html

No estoy seguro de los detalles de cómo produciría el audio desde la matriz, pero he encontrado que mpg321 es un excelente reproductor de audio de línea de comandos y podría funcionar para usted.

Lo uso como mi reproductor preferido para Anki , que está escrito en python y tiene bibliotecas que podrían ser un excelente punto de partida para interconectar su código / arrays con audio.

Revisa:

  • anki.sound.py
  • customPlayer.py