2012-04-27 32 views

Respuesta

45

Puede usar el write function desde scipy.io.wavfile para crear un archivo wav que luego puede reproducir como lo desee. Tenga en cuenta que la matriz debe ser números enteros, por lo que si usted tiene flotadores, es posible que desee escalar de manera apropiada:

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 Python jugar realmente de audio, entonces this page proporciona una visión general de algunos de los paquetes/módulos .

+1

pregunta - el/np.max de datos (np.abs (datos)) - ¿verdad que esta es la normalización a 1/-1 antes de escalar, de manera que si el máximo es de 0,8, sería escalar hacia arriba? –

+0

Sí (aunque no es obligatorio). – huon

+0

Gracias. ¿No debería ser eso * 32768? Es un signo de 16 bits. –

12

Además, usted podría intentar scikits.audiolab. Presenta el archivo IO y la capacidad de 'reproducir' matrices. 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) 
+0

scikits.audiolab no está disponible para python (32) + Windows (64) + Hardware (64) configuración de bits y por lo tanto, supongo que no es tan útil para mí – gisgyaan

+1

No está disponible en Python 3, y ha pasado mucho tiempo desde la última actualización. – geekazoid

0

No está seguro de los detalles de cómo se producirá el audio de la matriz, pero he encontrado mpg321 a ser una gran línea de comandos reproductor de audio, y potencialmente podría funcionar para usted.

Lo uso como mi reproductor de elección para Anki, que está escrito en python y tiene bibliotecas que podrían ser un excelente punto de partida para conectar sus códigos/matrices con audio.

Salida:

1

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 funcionamiento. Por otra parte, scipy y numpy vienen con sus propias dificultades, así que quizás no es un gran paso para añadir PyGame en la mezcla.

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

18

Para las personas que vienen aquí en 2016 scikits.audiolab no parece realmente trabajar más. 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) 
+0

Lo intenté y scikits.audiolab funcionó en mi Ubuntu 16.04 + python 2.7 (anaconda 4.1.1). Solo necesitaba 'sudo apt-get install libsndfile1-dev'. Y, por otro lado, el dispositivo de sonido no funciona para mí: no se reproduce nada cuando reemplace scikits.audiolab con sd. – ftfish

+0

no hubo suerte con python3, incluso con libsndfile1-dev instalado, mejor suerte con sounddevice – JulienFr

+3

¡Gracias, funciona a la perfección! 'sd.play (data, fs, blocking = True)' para que el programa espere hasta que se reproduzca el sonido. –

3

he tenido algunos problemas con el uso scikit.audiolabs, así que buscó otro opciones para esta tarea. Se me ocurrió sounddevice, que parece mucho más arriba-hasta la fecha. No he comprobado si funciona con Python 3.

Una manera sencilla de llevar a cabo lo que quiere es la siguiente:

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) 
+1

Funciona bien con Python 3. Si usa el código anterior en un script, debe asegurarse de usar 'blocking = True'; de lo contrario, el script se cerrará sin finalizar la reproducción. – Matthias

+0

Lo hice, de hecho. Respuesta actualizada ¡Gracias! – geekazoid

3

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

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