2012-04-27 31 views

risposta

45

È possibile utilizzare write function da scipy.io.wavfile per creare un file wav che è possibile riprodurre in qualsiasi momento. Si noti che la matrice deve essere interi, quindi se avete galleggianti, si potrebbe desiderare di scalare in modo appropriato:

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) 

Se si desidera Python a giocare in realtà audio, quindi this page fornisce una panoramica di alcuni dei pacchetti/moduli .

+1

domanda - i dati/np.max (np.abs (dati)) - ho ragione che questa è la normalizzazione a 1/-1 prima di scalare, in modo tale che se il massimo è di 0,8, sarebbe essere scalata in su? –

+0

Sì (non è richiesto però). – huon

+0

Grazie. Non dovrebbe essere * 32768? È un 16 bit firmato. –

12

Inoltre, si potrebbe provare scikits.audiolab. È dotato di file IO e della capacità di riprodurre array. Le matrici non devono essere numeri interi. Per mimare l'esempio di 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 non è disponibile per python (32) + Windows (64) + Hardware (64) bit e quindi non mi è molto utile – gisgyaan

+1

Non è disponibile in Python 3 ed è passato molto tempo dall'ultimo aggiornamento. – geekazoid

0

Non sono sicuro dei particolari di come si potrebbe produrre l'audio dalla matrice, ma ho trovato mpg321 per essere un grande lettore audio da riga di comando, e potrebbe potenzialmente funzionare per voi.

Lo uso come lettore preferito per Anki, che è scritto in python e contiene librerie che potrebbero essere un ottimo punto di partenza per l'interfacciamento del codice/array con l'audio.

Partenza:

1

PyGame ha il modulo pygame.sndarray in grado di riprodurre i dati NumPy come audio. Le altre risposte sono probabilmente migliori, dato che PyGame può essere difficile da far funzionare. Poi di nuovo, SciPy e NumPy vengono con le proprie difficoltà, quindi forse non è un grande passo per aggiungere PyGame nel mix.

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

18

Per le persone che vengono qui nel 2016 scikits.audiolab non sembra in realtà più lavorare. Sono stato in grado di ottenere una soluzione utilizzando SoundDevice.

import numpy as np 
import sounddevice as sd 

fs = 44100 
data = np.random.uniform(-1, 1, fs) 
sd.play(data, fs) 
+0

In realtà ho provato e scikits.audiolab ha funzionato sulla mia Ubuntu 16.04 + python 2.7 (anaconda 4.1.1). Ho solo bisogno di 'sudo apt-get install libsndfile1-dev'. E d'altra parte, sounddevice non funziona per me: non si gioca nulla quando sostituisco scikits.audiolab con sd. – ftfish

+0

non ho fortuna con python3, anche con libsndfile1-dev installato, migliore fortuna con sounddevice – JulienFr

+3

Grazie, funziona perfettamente! 'sd.play (data, fs, blocking = True)' per fare in modo che il programma attenda fino a quando il suono non viene riprodotto. –

3

ho avuto qualche problema con scikit.audiolabs, così ho cercato un altro opzioni per questo compito. Sono venuto con sounddevice, che sembra molto più up-to-date. Non ho controllato se funziona con Python 3.

Un modo semplice per eseguire quello che vuoi è questo:

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

Funziona perfettamente con Python 3. Se si utilizza il codice precedente in uno script, è necessario assicurarsi di usare 'blocking = True', altrimenti lo script uscirà senza terminare la riproduzione. – Matthias

+0

L'ho fatto, infatti. Risposta aggiornata Grazie! – geekazoid

3

Se si utilizza Jupyter, l'opzione migliore è:

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