2011-11-28 15 views
14

Necesito generar un sonido de onda sinusoidal en Python, y necesito poder controlar la frecuencia, la duración y el volumen relativo. Con 'generar' quiero decir que quiero que toque los parlantes de inmediato, no guarde en un archivo.Generación de sonido de onda sinusoidal en Python

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

+0

¿En qué plataforma (s) se dirige? –

+1

Principalmente MacOS X - Debería haber especificado esto, lo siento! – astrofrog

+0

Esta pregunta es similar a http://stackoverflow.com/questions/307305/play-a-sound-with-python y http://stackoverflow.com/questions/260738/play-audio-with-python –

Respuesta

1

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

Lo recomiendo usar - 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.

0

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

+0

error 404 - Página no encontrada - https://github.com/bregmanstudio/BregmanToolkit – scls

21
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() 
+0

Tengo esto: Archivo "C: \ Python27 \ lib \ site-packages \ numpy \ core \ __ init__.py", línea 6, en desde. import multiarray ImportError: error en la carga DLL:% 1 no es una aplicación Win32 válida. – chwi

+0

Encontré que la contribución de @yahweh es el caso. Sería útil incluirlo en la muestra del código. – chris

0

Hoy 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 instalarlo pyaudio

1

Ivan-onys dio una excelente respuesta, pero hay una pequeña adición a la misma: este script producirá Sonido 4 veces más corto de lo esperado porque el método de escritura Pyaudio necesita datos de cadena de float32, pero cuando pasa la matriz numpy a este método, convierte la matriz completa como entidad en una cadena, por lo tanto, debe convertir datos en serie numpy a la secuencia de bytes a sí mismo de esta manera:

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

y hay que cambiar esta línea, así:

stream.write(samples) 
Cuestiones relacionadas