sounddevice reproducir reproduce python audio

reproducir - Generando sonido sinusoidal en Python



sounddevice python (5)

En la caja de herramientas de bregman lab , tiene un conjunto de funciones que hace exactamente lo que quiere. Este módulo de Python es un poco buggy, pero puede adaptar este código para obtener sus propias funciones.

Necesito generar un sonido de onda sinusoidal en Python, y debo ser capaz de controlar la frecuencia, la duración y el volumen relativo. Por ''generar'' me refiero a que quiero que se reproduzca a través de los altavoces inmediatamente, no que se guarden en un archivo.

¿Cuál es la forma más fácil de hacer esto?


Hoy en día, para Python 3.5+, la mejor manera es instalar los paquetes recomendados por el desarrollador.

http://people.csail.mit.edu/hubert/pyaudio/

Para debian hacer

sudo apt-get install python3-all-dev portaudio19-dev

antes de intentar instalar pyaudio


Una de las formas más consistentes y fáciles de instalar para lidiar con el sonido en Python son las bibliotecas multimedia de Pygame.

Recomiendo usarlo: existe el submódulo pygame.sndarray que le permite manipular números en un vector de datos que se convierten en un objeto de sonido de alto nivel que se puede reproducir en el módulo pygame.mixer.

La documentación en el sitio pygame.org debería ser suficiente para usar el módulo sndarray.


ivan-onys dio una excelente respuesta, pero hay una pequeña adición: este script producirá un sonido 4 veces más corto de lo esperado porque el método de escritura Pyaudio necesita datos de cadena de float32, pero cuando se pasa una matriz numpy a este método, se convierte en todo matriz como entidad a una cadena, por lo tanto, tiene que convertir los datos en matriz numpy a la secuencia de bytes a ti mismo de esta manera:

samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()

y tienes que cambiar esta línea también:

stream.write(samples)


import pyaudio import numpy as np p = pyaudio.PyAudio() volume = 0.5 # range [0.0, 1.0] fs = 44100 # sampling rate, Hz, must be integer duration = 1.0 # in seconds, may be float f = 440.0 # sine frequency, Hz, may be float # generate samples, note conversion to float32 array samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32) # for paFloat32 sample values must be in range [-1.0, 1.0] stream = p.open(format=pyaudio.paFloat32, channels=1, rate=fs, output=True) # play. May repeat with different volume values (if done interactively) stream.write(volume*samples) stream.stop_stream() stream.close() p.terminate()